[runtime] Don't assert in mono_class_is_assignable_from on iface gtd
[mono-project.git] / configure.ac
bloba4a5cc4b42071df1db9210dfc5fbd8c4e9ee6f0c
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.13.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=2
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 AM_ICONV()
524 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)
525 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)
526 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
527                   [], [], [#include <stddef.h>
528                   #include <sys/socket.h>
529                   #include <linux/socket.h>])
531 AC_CHECK_HEADERS(sys/user.h, [], [],
533 #ifdef HAVE_SYS_PARAM_H
534 # include <sys/param.h>
535 #endif
538 AC_CHECK_HEADERS(linux/serial.h)
540 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
541 if test x$have_zlib = xyes; then
542    AC_TRY_COMPILE([#include <zlib.h>], [
543    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
544    #else
545    #error No good zlib found
546    #endif
547    ],[
548         AC_MSG_RESULT(Using system zlib)
549         zlib_msg="system zlib"
550         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
551    ],[
552         AC_MSG_RESULT(Using embedded zlib)
553         have_zlib=no
554         zlib_msg="bundled zlib"
555    ])
558 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
559 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
561 # for mono/metadata/debug-symfile.c
562 AC_CHECK_HEADERS(elf.h)
564 # for support
565 AC_CHECK_HEADERS(poll.h)
566 AC_CHECK_HEADERS(sys/poll.h)
567 AC_CHECK_HEADERS(sys/wait.h)
568 AC_CHECK_HEADERS(grp.h)
569 AC_CHECK_HEADERS(syslog.h)
570 AC_CHECK_FUNCS(vsyslog)
572 # for mono/dis
573 AC_CHECK_HEADERS(wchar.h)
574 AC_CHECK_HEADERS(ieeefp.h)
575 AC_MSG_CHECKING(for isinf)
576 AC_TRY_LINK([#include <math.h>], [
577         int f = isinf (1.0);
578 ], [
579         AC_MSG_RESULT(yes)
580         AC_DEFINE(HAVE_ISINF, 1, [isinf available])
581 ], [
582         # We'll have to use signals
583         AC_MSG_RESULT(no)
585 # mingw
586 AC_CHECK_FUNCS(_finite, , AC_MSG_CHECKING(for _finite in math.h)
587         AC_TRY_LINK([#include <math.h>], 
588         [ _finite(0.0); ], 
589         AC_DEFINE(HAVE__FINITE, 1, [Have _finite in -lm]) AC_MSG_RESULT(yes),
590         AC_MSG_RESULT(no)))
592 # for Linux statfs support
593 AC_CHECK_HEADERS(linux/magic.h)
595 # For Android NDK unified headers
596 if test x$platform_android = xyes; then
597         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
598         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
600         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
601         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
602         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
603         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
604         # doesn't contain the required definitions (NDK 14)
605         if test x$have_android_signal_inlines = xyes; then
606                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
607                 AC_COMPILE_IFELSE([
608                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
609                                 int i;
610                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
611                                 }
612                         ])],[
613                                 AC_MSG_RESULT(yes)
614                                 android_sigrtminmax_work=yes
615                         ],[
616                                 AC_MSG_RESULT(no)
617                                 android_sigrtminmax_work=no
618                         ]
619                 )
621                 if test x$android_sigrtminmax_work = xno; then
622                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
623                 fi
624         fi
626         # Attempt to detect whether we're using Android NDK unified headers
627         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
628         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
630         android_unified_headers=no
631         if test x$have_android_api_level = xyes; then
632                 if test x$have_android_versioning = xyes; then
633                         AC_MSG_CHECKING([whether using Android NDK unified headers])
635                         # Both macros are defined only in the NDK unified headers
636                         AC_COMPILE_IFELSE([
637                                 AC_LANG_PROGRAM([
638                                         #include <android/api-level.h>
639                                         #include <android/versioning.h>
640                                 ],[
641                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
642                                         #else
643                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
644                                         #endif
645                                 ])],[
646                                         AC_MSG_RESULT(yes)
647                                         android_unified_headers=yes
648                                 ],[
649                                         AC_MSG_RESULT(no)
650                                         android_unified_headers=no
651                                 ]
652                         )
653                 fi
654         fi
656         if test x$android_unified_headers = xyes; then
657                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
658         fi
659 fi # Android
661 # not 64 bit clean in cross-compile
662 if test "x$enable_wasm" = "xyes"; then
663 AC_DEFINE(SIZEOF_VOID_P,4)
664 AC_DEFINE(SIZEOF_LONG,4)
665 ac_cv_sizeof_void_p="4"
666 ac_cv_sizeof_long="4"
667 else
668 AC_CHECK_SIZEOF(void *)
669 AC_CHECK_SIZEOF(long)
672 AC_CHECK_SIZEOF(int)
673 AC_CHECK_SIZEOF(long long)
675 AC_CACHE_CHECK([for clang],
676         mono_cv_clang,[
677         AC_TRY_COMPILE([], [
678                 #ifdef __clang__
679                 #else
680                 #error "FAILED"
681                 #endif
682         ],
683         [mono_cv_clang=yes],
684         [mono_cv_clang=no],
685         [])
688 AC_ARG_ENABLE(visibility-hidden,
689 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
690    disable_visibility_hidden=yes, disable_visibility_hidden=no)
692 WARN=''
693 if test x"$GCC" = xyes; then
694         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'
696                 # We require C99 with some GNU extensions, e.g. `linux` macro
697                 CFLAGS="$CFLAGS -std=gnu99"
699                 # The runtime code does not respect ANSI C strict aliasing rules
700                 CFLAGS="$CFLAGS -fno-strict-aliasing"
702                 # We rely on signed overflow to behave
703                 CFLAGS="$CFLAGS -fwrapv"
705                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
706                 if test x"$disable_visibility_hidden" = xno; then
707                    # Don't export any symbols by default
708                    SHARED_CFLAGS="-fvisibility=hidden"
709                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
710                 fi
712                 ORIG_CFLAGS=$CFLAGS
713                 # Check for the normal version, since gcc ignores unknown -Wno options
714                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
715                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
716                 AC_TRY_COMPILE([],[
717                 ], [
718                    AC_MSG_RESULT(yes)
719                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
720                 ], [
721                    AC_MSG_RESULT(no)
722                    CFLAGS=$ORIG_CFLAGS
723                 ])
725                 if test "x$mono_cv_clang" = "xyes"; then
726                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
727                    WARN="$WARN -Qunused-arguments"
728                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
729                    # We rely on zero length arrays in structs
730                    WARN="$WARN -Wno-zero-length-array"
731                 fi
732 else
733         # The Sun Forte compiler complains about inline functions that access static variables
734         # so disable all inlining.
735         case "$host" in
736         *-*-solaris*)
737                 CFLAGS="$CFLAGS -Dinline="
738                 ;;
739         esac
741 CFLAGS="$CFLAGS -g $WARN"
742 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
743 CPPFLAGS="$CPPFLAGS -g $WARN"
745 # Where's the 'mcs' source tree?
746 if test -d $srcdir/mcs; then
747   mcsdir=mcs
748 else
749   mcsdir=../mcs
752 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
753         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
754                 mcsdir=$with_mcs_path
755         fi
758 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
761 # A sanity check to catch cases where the package was unpacked
762 # with an ancient tar program (Solaris)
764 AC_ARG_ENABLE(solaris-tar-check,
765 [  --disable-solaris-tar-check    disable solaris tar check],
766    do_solaris_tar_check=no, do_solaris_tar_check=yes)
768 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
769         AC_MSG_CHECKING(integrity of package)
770         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
771         then
772                 AC_MSG_RESULT(ok)
773         else
774                 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"
775                 AC_MSG_ERROR([$errorm])
776         fi
779 if test "x$with_mcs_path" != "x"; then
780 mcs_topdir=$(cd "$mcsdir" && pwd)
781 mcs_topdir_from_srcdir=$mcs_topdir
782 else
783 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
784 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
787 # Convert mcs_topdir* paths to Windows syntax.
788 if test x$cross_compiling$host_win32 = xnoyes; then
789   mcs_topdir=$(cygpath -m $mcs_topdir)
790   case $mcs_topdir_from_srcdir in
791     /cygdrive/*)
792         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
793         ;;
794   esac
797 AC_SUBST([mcs_topdir])
798 AC_SUBST([mcs_topdir_from_srcdir])
800 # gettext: prepare the translation directories. 
801 # we do not configure the full gettext, as we consume it dynamically from C#
802 AM_PO_SUBDIRS
804 if test "x$USE_NLS" = "xyes"; then
805    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
807    if test "x$HAVE_MSGFMT" = "xno"; then
808           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
809    fi
812 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
814 pkg_config_path=
815 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
816         if test x$with_crosspkgdir = "x"; then
817                 if test -s $PKG_CONFIG_PATH; then
818                         pkg_config_path=$PKG_CONFIG_PATH
819                 fi
820         else
821                 pkg_config_path=$with_crosspkgdir
822                 PKG_CONFIG_PATH=$pkg_config_path
823                 export PKG_CONFIG_PATH
824         fi
827 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
828 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
829 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
831 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
832 if test x$werror_flag = xyes; then
833         WERROR_CFLAGS="-Werror"
835 AC_SUBST([WERROR_CFLAGS])
836 AC_SUBST([SHARED_CFLAGS])
838 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
839 GLIB_LIBS='$(top_builddir)/mono/eglib/libeglib.la -lm'
840   
841 AC_SUBST(GLIB_CFLAGS)
842 AC_SUBST(GLIB_LIBS)
844 # Enable support for fast thread-local storage
845 # Some systems have broken support, so we allow to disable it.
846 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
848 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
849 # This does not work on some platforms (bug #55253)
850 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
852 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
853 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
854 # Same as --with-shared_mono=no
855 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
857 if test "x$enable_static" = "xno"; then
858    with_static_mono=no
861 if test "x$enable_shared" = "xno"; then
862    with_shared_mono=no
865 if test "x$enable_libraries" = "xno"; then
866    with_shared_mono=no
869 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
871 if test "x$host_win32" = "xyes"; then
872    # Boehm GC requires the runtime to be in its own dll
873    with_static_mono=no
876 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
877 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
878 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
879 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
881 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
882 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
883         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
884         ORIG_CFLAGS=$CFLAGS
885         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
886         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
887         AC_TRY_COMPILE([], [
888         ], [
889            AC_MSG_RESULT(yes)
890            # Pass it to libgc as well
891            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
892         ], [
893            AC_MSG_RESULT(no)
894            CFLAGS=$ORIG_CFLAGS
895         ])
898 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
900 if test x$enable_small_config = xyes; then
901         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
902         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
905 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)
907 DISABLED_FEATURES=none
908 csc_compiler=default
909 endian=unknown
910 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
911 AC_MSG_CHECKING([CSharp compiler to use])
912 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
913    if test x$withval = xmcs; then
914        csc_compiler=mcs
915    elif test x$withval = xroslyn; then
916        csc_compiler=roslyn
917    elif test x$withval = xdefault; then
918        :
919    else
920        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
921    fi
922 ],[csc_compiler=default])
924 if test $csc_compiler = default; then
925    if test $endian = big; then
926       csc_compiler=mcs
927    elif test $endian = little; then
928       case "$host" in
929         powerpc*) csc_compiler=mcs ;;
930         *) csc_compiler=roslyn ;;
931       esac
932    else
933       csc_compiler=mcs
934    fi
936 AC_MSG_RESULT($csc_compiler)
938 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
939 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
940 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])
943 if test x$target_win32 = xyes; then
944 with_jemalloc=no
945 with_jemalloc_assert=no
946 with_jemalloc_always=no
949 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
950 if test "x$with_jemalloc_assert" = "xyes"; then
951 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
952 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
953 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
956 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
957 if test "x$with_jemalloc_always" = "xyes"; then
958 with_jemalloc=yes
959 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
960 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
961 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
964 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
965 if test "x$with_jemalloc" = "xyes"; then
966 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
967 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
968 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
970 if test "x$target_mach" = "xyes"; then
971         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
974 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
975 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
977 AC_SUBST(JEMALLOC_CFLAGS)
978 AC_SUBST(JEMALLOC_CPPFLAGS)
979 AC_SUBST(JEMALLOC_LDFLAGS)
980 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
984 # Set the build profiles and options before things which use them
987 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])
988 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
989 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
990 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])
991 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])
992 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
993 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
994 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])
995 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])
996 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
997 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
998 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
999 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1002 AC_ARG_WITH(runtime_preset, [  --with-runtime_preset=net_4_x,all,aot,hybridaot,fullaot,bitcode,unreal   Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1003 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])
1004 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])
1005 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])
1008 dnl Spectre compiler mitigation flag checks
1010 if test "x$with_spectre_mitigation" = "xyes"; then
1011    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1012    SPECTRE_CFLAGS=
1013    SPECTRE_INDIRECT_BRANCH_KIND=
1014    case "x$with_spectre_indirect_branch_choice" in
1015        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1016        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1017        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1018        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1019        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1020    esac
1022    SPECTRE_FUNCTION_RETURN_KIND=""
1023    case "x$with_spectre_function_return_choice" in
1024        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1025        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1026        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1027        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1028        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1029    esac
1031    AX_CHECK_COMPILE_FLAG(
1032         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1033         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1034    )
1036    AX_CHECK_COMPILE_FLAG(
1037         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1038         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1039    )
1041    if test "x$SPECTRE_CFLAGS" != "x" ; then
1042         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1043         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1044         spectre_mitigation_status="mitigation enabled"
1045    fi
1046 else
1047         spectre_mitigation_status="no mitigation"
1051 dnl Profile defaults
1053 TEST_PROFILE=default
1054 enable_llvm_default=no
1056 with_profile4_x_default=no
1057 with_monodroid_default=no
1058 with_monotouch_default=no
1059 with_monotouch_watch_default=no
1060 with_monotouch_tv_default=no
1061 with_xammac_default=no
1062 with_testing_aot_hybrid_default=no
1063 with_testing_aot_full_default=no
1064 with_winaot_default=no
1065 with_orbis_default=no
1066 with_unreal_default=no
1067 with_wasm_default=no
1069 with_bitcode_default=no
1070 with_cooperative_gc_default=no
1072 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=9000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1074 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1076 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1077    DISABLE_MCS_DOCS_default=yes
1078 elif test x$with_runtime_preset = xnet_4_x; then
1079    with_profile4_x_default=yes
1080 elif test x$with_runtime_preset = xall; then
1081    with_profile4_x_default=yes
1082    with_monodroid_default=yes
1083    with_monotouch_default=yes
1084    with_monotouch_watch_default=yes
1085    with_monotouch_tv_default=yes
1086    with_xammac_default=yes
1087    with_winaot_default=yes
1088    with_orbis_default=yes
1089    with_unreal_default=yes
1090    with_wasm_default=yes
1091 elif test x$with_runtime_preset = xfullaot; then
1092    DISABLE_MCS_DOCS_default=yes
1093    with_testing_aot_full_default=yes
1094    TEST_PROFILE=testing_aot_full
1096    mono_feature_disable_com='yes'
1097    mono_feature_disable_remoting='yes'
1098    mono_feature_disable_reflection_emit_save='yes'
1099    mono_feature_disable_reflection_emit='yes'
1100    mono_feature_disable_appdomains='yes'
1102    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1103    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1104    AOT_MODE="full"
1105 elif test x$with_runtime_preset = xbitcode; then
1106    DISABLE_MCS_DOCS_default=yes
1107    with_testing_aot_full_default=yes
1108    with_bitcode_default=yes
1109    with_cooperative_gc_default=yes
1110    TEST_PROFILE=testing_aot_full
1111    enable_llvm_default=yes
1113    mono_feature_disable_com='yes'
1114    mono_feature_disable_remoting='yes'
1115    mono_feature_disable_reflection_emit_save='yes'
1116    mono_feature_disable_reflection_emit='yes'
1117    mono_feature_disable_appdomains='yes'
1119    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1120    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1121    AOT_MODE="llvmonly"
1122 elif test x$with_runtime_preset = xhybridaot; then
1123    DISABLE_MCS_DOCS_default=yes
1124    with_testing_aot_hybrid_default=yes
1125    TEST_PROFILE=testing_aot_hybrid 
1127    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1128    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1129 elif test x$with_runtime_preset = xaot; then
1130    with_profile4_x_default=yes
1132    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1133    AOT_RUN_FLAGS=""
1135    DISABLE_MCS_DOCS_default=yes
1136 elif test x$with_runtime_preset = xwinaot; then
1137    DISABLE_MCS_DOCS_default=yes
1138    with_winaot_default=yes
1139    TEST_PROFILE=winaot
1141    mono_feature_disable_com='yes'
1142    mono_feature_disable_remoting='yes'
1143    mono_feature_disable_reflection_emit_save='yes'
1144    mono_feature_disable_reflection_emit='yes'
1145    mono_feature_disable_appdomains='yes'
1147    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1148    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1149    AOT_MODE="llvmonly"
1150 elif test x$with_runtime_preset = xorbis; then
1151    DISABLE_MCS_DOCS_default=yes
1152    with_orbis_default=yes
1153    TEST_PROFILE=orbis
1155    mono_feature_disable_com='yes'
1156    mono_feature_disable_remoting='yes'
1157    mono_feature_disable_reflection_emit_save='yes'
1158    mono_feature_disable_reflection_emit='yes'
1159    mono_feature_disable_appdomains='yes'
1161    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1162    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1163    AOT_MODE="full"
1164 elif test x$with_runtime_preset = xunreal; then
1165    DISABLE_MCS_DOCS_default=yes
1166    with_unreal_default=yes
1167    TEST_PROFILE=unreal
1169    mono_feature_disable_com='yes'
1170    mono_feature_disable_remoting='yes'
1171    mono_feature_disable_appdomains='no'
1173    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1174    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1175 elif test x$with_runtime_preset = xwasm; then
1176    DISABLE_MCS_DOCS_default=yes
1177    with_wasm_default=yes
1178    TEST_PROFILE=wasm
1180    mono_feature_disable_com='yes'
1181    mono_feature_disable_remoting='yes'
1182    mono_feature_disable_reflection_emit_save='yes'
1183    mono_feature_disable_reflection_emit='yes'
1184    mono_feature_disable_appdomains='yes'
1186    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1187    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1188 else
1189    with_profile4_x_default=yes
1192 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1193    AC_SUBST(AOT_BUILD_FLAGS)
1194    AC_SUBST(AOT_RUN_FLAGS)
1195    # For llvmonlycheck + fullaotcheck
1196    AC_SUBST(INVARIANT_AOT_OPTIONS)
1199 AC_SUBST(TEST_PROFILE)
1201 if test "x$with_profile4_x" = "xdefault"; then
1202    with_profile4_x=$with_profile4_x_default
1204 if test "x$with_monodroid" = "xdefault"; then
1205    with_monodroid=$with_monodroid_default
1207 if test "x$with_monotouch" = "xdefault"; then
1208    with_monotouch=$with_monotouch_default
1210 if test "x$with_monotouch_watch" = "xdefault"; then
1211    with_monotouch_watch=$with_monotouch_watch_default
1213 if test "x$with_monotouch_tv" = "xdefault"; then
1214    with_monotouch_tv=$with_monotouch_tv_default
1216 if test "x$with_bitcode" = "xdefault"; then
1217    with_bitcode=$with_bitcode_default
1219 if test "x$with_xammac" = "xdefault"; then
1220    with_xammac=$with_xammac_default
1222 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1223    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1225 if test "x$with_testing_aot_full" = "xdefault"; then
1226    with_testing_aot_full=$with_testing_aot_full_default
1228 if test "x$with_winaot" = "xdefault"; then
1229    with_winaot=$with_winaot_default
1231 if test "x$with_orbis" = "xdefault"; then
1232    with_orbis=$with_orbis_default
1234 if test "x$with_unreal" = "xdefault"; then
1235    with_unreal=$with_unreal_default
1237 if test "x$with_wasm" = "xdefault"; then
1238    with_wasm=$with_wasm_default
1242 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1243 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1244 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1245 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1246 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1247 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1248 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1249 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1250 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1251 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1252 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1253 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1254 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1255 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"])
1256 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1258 default_profile=net_4_x
1259 if test -z "$INSTALL_MONODROID_TRUE"; then :
1260    default_profile=monodroid
1262 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1263    default_profile=monotouch
1265 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1266    default_profile=xammac
1268 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1269    default_profile=testing_aot_hybrid
1271 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1272    default_profile=testing_aot_full
1274 if test -z "$INSTALL_WINAOT_TRUE"; then :
1275    default_profile=winaot
1277 if test -z "$INSTALL_ORBIS_TRUE"; then :
1278    default_profile=orbis
1280 if test -z "$INSTALL_UNREAL_TRUE"; then :
1281    default_profile=unreal
1283 if test -z "$INSTALL_WASM_TRUE"; then :
1284    default_profile=wasm
1286 if test -z "$INSTALL_4_x_TRUE"; then :
1287    default_profile=net_4_x
1289 DEFAULT_PROFILE=$default_profile
1290 AC_SUBST(DEFAULT_PROFILE)
1293 # End build profile configuration
1296 if test x$USE_NLS = xprofile_default; then
1298         AC_MSG_CHECKING([NLS used])
1300         # We make the default value for USE_NLS
1301         # "no" on OSX because it isn't available on most
1302         # default OSX installs. The most common configurations will
1303         # all disable it, so this saves us typing.
1304         if test x$host_darwin = xyes; then
1305                 USE_NLS=no;
1306         else
1307                 USE_NLS=yes;
1308         fi
1310         AC_SUBST([USE_NLS])
1311         AC_MSG_RESULT([$USE_NLS])
1314 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1315      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1316      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1317          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1319         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1320                 eval "mono_feature_disable_$feature='yes'"
1321         done
1322         DISABLED_FEATURES=$enable_minimal
1323         disabled="Disabled:      $enable_minimal"
1324 ],[])
1326 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1328 if test "x$mono_feature_disable_aot" = "xyes"; then
1329         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1330         enable_system_aot=no
1331         AC_MSG_NOTICE([Disabled AOT compiler])
1334 if test "x$mono_feature_disable_profiler" = "xyes"; then
1335         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1336         AC_MSG_NOTICE([Disabled support for the profiler])
1338 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1340 if test "x$mono_feature_disable_decimal" = "xyes"; then
1341         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1342         AC_MSG_NOTICE([Disabled support for decimal])
1345 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1346         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1347         AC_MSG_NOTICE([Disabled support for P/Invoke])
1350 if test "x$mono_feature_disable_debug" = "xyes"; then
1351         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1352         AC_MSG_NOTICE([Disabled support for runtime debugging])
1355 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1356         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1357         mono_feature_disable_reflection_emit_save=yes
1358         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1361 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1362         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1363         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1366 if test "x$mono_feature_disable_large_code" = "xyes"; then
1367         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1368         AC_MSG_NOTICE([Disabled support for large assemblies])
1371 if test "x$mono_feature_disable_logging" = "xyes"; then
1372         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1373         AC_MSG_NOTICE([Disabled support for logging])
1376 if test "x$mono_feature_disable_com" = "xyes"; then
1377         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1378         AC_MSG_NOTICE([Disabled COM support])
1381 if test "x$mono_feature_disable_ssa" = "xyes"; then
1382         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1383         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1386 if test "x$mono_feature_disable_generics" = "xyes"; then
1387         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1388         AC_MSG_NOTICE([Disabled Generics Support])
1391 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1392         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1393         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1396 if test "x$mono_feature_disable_portability" = "xyes"; then
1397         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1398         AC_MSG_NOTICE([Disabled IO Portability layer])
1401 if test "x$mono_feature_disable_attach" = "xyes"; then
1402         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1403         AC_MSG_NOTICE([Disabled agent attach])
1406 if test "x$mono_feature_disable_verifier" = "xyes"; then
1407         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1408         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1411 if test "x$mono_feature_disable_jit" = "xyes"; then
1412         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1413         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1416 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1418 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1419         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1420         AC_MSG_NOTICE([Disabled the interpreter])
1423 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1425 if test "x$mono_feature_disable_simd" = "xyes"; then
1426         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1427         AC_MSG_NOTICE([Disabled SIMD support])
1430 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1431         AC_DEFINE(DISABLE_SOFT_DEBUG, 1, [Disable Soft Debugger Agent.])
1432         AC_MSG_NOTICE([Disabled Soft Debugger.])
1435 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1436         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1437         AC_MSG_NOTICE([Disabled Performance Counters.])
1439 if test "x$mono_feature_disable_normalization" = "xyes"; then
1440         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1441         AC_MSG_NOTICE([Disabled String normalization support.])
1444 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1445 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1446         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1447         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1450 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1451         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1452         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1455 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1456         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1457         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1460 if test "x$mono_feature_disable_remoting" = "xyes"; then
1461         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1462         AC_MSG_NOTICE([Disabled remoting])
1465 if test "x$mono_feature_disable_security" = "xyes"; then
1466         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1467         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1470 if test "x$mono_feature_disable_lldb" = "xyes"; then
1471         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1472         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1475 if test "x$mono_feature_disable_mdb" = "xyes"; then
1476         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1477         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1480 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1481         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1482         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1486 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1487         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1488         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1491 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1492         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1493         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1496 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1497         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1498         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1501 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1502 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1504 has_extension_module=no
1505 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1507         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1508                 if test x$extension = xdefault ; then
1509                         has_extension_module=yes;
1510                 fi
1511         done
1512         if test x$enable_extension_module = xyes; then
1513                 has_extension_module=yes;
1514         fi
1515 ], [])
1517 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1519 if test x$has_extension_module != xno ; then
1520         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1521         AC_MSG_NOTICE([Enabling mono extension module.])
1524 # Deprecated
1525 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1527 AC_MSG_CHECKING(for visibility __attribute__)
1528 AC_COMPILE_IFELSE([
1529         AC_LANG_SOURCE([[
1530                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1531                 int main () { doit (); return 0; }
1532         ]])
1533 ], [
1534    have_visibility_hidden=yes
1535    AC_MSG_RESULT(yes)
1536 ], [
1537    have_visibility_hidden=no
1538    AC_MSG_RESULT(no)
1542 dnl Boehm GC configuration
1545 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1547 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1548 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1550 if test "x$support_boehm" = "xyes"; then
1552         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1553         if test x$enable_parallel_mark = xyes; then
1554                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1555         fi
1557         gc_msg=""
1558         LIBGC_CPPFLAGS=
1559         LIBGC_LIBS=
1560         LIBGC_STATIC_LIBS=
1561         libgc_dir=
1562         case "x$libgc" in
1563                 xincluded)
1564                         if test "x$support_boehm" = "xyes"; then
1565                                 libgc_dir=libgc
1566                         fi
1568                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1569                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1570                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1572                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1574                         if test x$target_win32 = xyes; then
1575                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1576                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1577                         fi
1579                         gc_msg="Included Boehm GC with typed GC"
1580                         if test x$enable_parallel_mark = xyes; then
1581                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1582                                 gc_msg="$gc_msg and parallel mark"
1583                         else
1584                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1585                         fi
1586                         ;;
1588                 xboehm|xbohem|xyes)
1589                         AC_MSG_WARN("External Boehm is no longer supported")
1590                         ;;
1592                 xsgen)
1593                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1594                         ;;
1596                 xnone)
1597                         AC_MSG_WARN("Compiling mono without GC.")
1598                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1599                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1600                         gc_msg="none"
1601                         ;;
1602                 *)
1603                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1604                         ;;
1605         esac
1607         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])
1608         if test "x$large_heap" = "xyes"; then
1609            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1610         fi
1612         AC_SUBST(LIBGC_CPPFLAGS)
1613         AC_SUBST(LIBGC_LIBS)
1614         AC_SUBST(LIBGC_STATIC_LIBS)
1615         AC_SUBST(libgc_dir)
1616         AC_SUBST(BOEHM_DEFINES)
1619 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1622 dnl End of Boehm GC Configuration
1625 dnl *************************************
1626 dnl *** Checks for zero length arrays ***
1627 dnl *************************************
1628 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1629 AC_TRY_COMPILE([
1630         struct s {
1631                 int  length;
1632                 char data [0];
1633         };
1634 ], [], [
1635         AC_MSG_RESULT(yes)
1636         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1637 ], [
1638         AC_MSG_RESULT(no)
1639         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1642 dnl ***********************************
1643 dnl *** Checks for signals
1644 dnl ***********************************
1645 AC_CHECK_HEADERS(signal.h)
1646 AC_CHECK_FUNCS(sigaction)
1647 AC_CHECK_FUNCS(kill)
1648 AC_CHECK_FUNCS(signal)
1650 # signal() is declared inline in Android headers
1651 # so we need to workaround it by overriding the check.
1652 if test x$platform_android = xyes; then
1653         AC_DEFINE(HAVE_SIGNAL,1)
1656 if test x$host_win32 = xno; then
1658         dnl hires monotonic clock support
1659         AC_SEARCH_LIBS(clock_gettime, rt)
1660         AC_CHECK_FUNCS(clock_nanosleep)
1662         dnl dynamic loader support
1663         AC_CHECK_FUNC(dlopen, DL_LIB="",
1664                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1665         )
1666         if test x$dl_support = xno; then
1667                 AC_MSG_WARN([No dynamic loading support available])
1668         else
1669                 LIBS="$LIBS $DL_LIB"
1670                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1671                 dnl from glib's configure.ac
1672                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1673                         mono_cv_uscore,[
1674                         AC_TRY_RUN([#include <dlfcn.h>
1675                         int mono_underscore_test (void) { return 42; }
1676                         int main() {
1677                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1678                           handle = dlopen ((void*)0, 0);
1679                           if (handle) {
1680                             f1 = dlsym (handle, "mono_underscore_test");
1681                             f2 = dlsym (handle, "_mono_underscore_test");
1682                           } return (!f2 || f1);
1683                         }],
1684                                 [mono_cv_uscore=yes],
1685                                 [mono_cv_uscore=no],
1686                         [])
1687                 ])
1688                 if test "x$mono_cv_uscore" = "xyes"; then
1689                         MONO_DL_NEED_USCORE=1
1690                 else
1691                         MONO_DL_NEED_USCORE=0
1692                 fi
1693                 AC_SUBST(MONO_DL_NEED_USCORE)
1694                 AC_CHECK_FUNC(dlerror)
1695         fi
1697         dnl ******************************************************************
1698         dnl *** Checks for the IKVM JNI interface library                  ***
1699         dnl ******************************************************************
1700         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])
1702         ikvm_native_dir=
1703         if test x$with_ikvm_native = xyes; then
1704                 ikvm_native_dir=ikvm-native
1705                 jdk_headers_found="IKVM Native"
1706         fi
1708         AC_SUBST(ikvm_native_dir)
1710         AC_CHECK_HEADERS(execinfo.h)
1712         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1714         AC_CHECK_FUNCS(getgrgid_r)
1715         AC_CHECK_FUNCS(getgrnam_r)
1716         AC_CHECK_FUNCS(getresuid)
1717         AC_CHECK_FUNCS(setresuid)
1718         AC_CHECK_FUNCS(kqueue)
1719         AC_CHECK_FUNCS(backtrace_symbols)
1720         AC_CHECK_FUNCS(mkstemp)
1721         AC_CHECK_FUNCS(mmap)
1722         AC_CHECK_FUNCS(madvise)
1723         AC_CHECK_FUNCS(getrusage)
1724         AC_CHECK_FUNCS(getpriority)
1725         AC_CHECK_FUNCS(setpriority)
1726         AC_CHECK_FUNCS(dl_iterate_phdr)
1727         AC_CHECK_FUNCS(dladdr)
1728         AC_CHECK_FUNCS(sysconf)
1729         AC_CHECK_FUNCS(getrlimit)
1730         AC_CHECK_FUNCS(prctl)
1732         AC_CHECK_FUNCS(sched_getaffinity)
1733         AC_CHECK_FUNCS(sched_setaffinity)
1734         AC_CHECK_FUNCS(sched_getcpu)
1736         if test x$platform_android != xyes; then
1737                 AC_CHECK_FUNCS(getpwnam_r)
1738                 AC_CHECK_FUNCS(getpwuid_r)
1739         fi
1741         AC_FUNC_STRERROR_R()
1743         dnl ****************************************************************
1744         dnl *** Check for sched_setaffinity from glibc versions before   ***
1745         dnl *** 2.3.4. The older versions of the function only take 2    ***
1746         dnl *** parameters, not 3.                                       ***
1747         dnl ***                                                          ***
1748         dnl *** Because the interface change was not made in a minor     ***
1749         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1750         dnl *** won't always indicate the interface sched_affinity has.  ***
1751         dnl ****************************************************************
1752         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1753         AC_TRY_COMPILE([#include <sched.h>], [
1754             int mask = 1; 
1755             sched_setaffinity(0, &mask);
1756         ], [
1757                 # Yes, we have it...
1758                 AC_MSG_RESULT(yes)
1759                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1760         ], [
1761                 # We have the new, three-parameter version
1762                 AC_MSG_RESULT(no)
1763         ])
1764         AC_TRY_COMPILE([#include <sched.h>], [
1765              CPU_COUNT((void *) 0);
1766         ], [
1767                 AC_MSG_RESULT(yes)
1768                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1769         ], [
1770                 # We have the new, three-parameter version
1771                 AC_MSG_RESULT(no)
1772         ])
1774         dnl ******************************************************************
1775         dnl *** Check for large file support                               ***
1776         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1777         dnl ******************************************************************
1778         
1779         # Check that off_t can represent 2**63 - 1 correctly, working around
1780         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1781         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1782         large_offt=no
1783         AC_DEFUN([LARGE_FILES], [
1784                 large_CPPFLAGS=$CPPFLAGS
1785                 CPPFLAGS="$CPPFLAGS $1"
1786                 AC_TRY_COMPILE([
1787                         #include <sys/types.h>
1788                         #include <limits.h>
1789                 ], [
1790                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1791                         #define COMPILE_TIME_ASSERT(pred) \
1792                                 switch(0){case 0:case pred:;}
1793                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1794                 ], [
1795                         AC_MSG_RESULT(ok)
1796                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1797                         large_CPPFLAGS="$large_CPPFLAGS $1"
1798                         large_offt=yes
1799                 ], [
1800                         AC_MSG_RESULT(no)
1801                 ])
1802                 CPPFLAGS=$large_CPPFLAGS
1803         ])
1805         AC_MSG_CHECKING(if off_t is 64 bits wide)
1806         LARGE_FILES("")
1807         if test $large_offt = no; then
1808                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1809                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1810         fi
1811         if test $large_offt = no; then
1812                 AC_MSG_WARN([No 64 bit file size support available])
1813         fi
1814         
1815         dnl *****************************
1816         dnl *** Checks for libsocket  ***
1817         dnl *****************************
1818         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1820         case "$host" in
1821                 *-*-*freebsd*)
1822                         dnl *****************************
1823                         dnl *** Checks for libinotify ***
1824                         dnl *****************************
1825                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1826         esac
1828         dnl *******************************
1829         dnl *** Checks for MSG_NOSIGNAL ***
1830         dnl *******************************
1831         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1832         AC_TRY_COMPILE([#include <sys/socket.h>], [
1833                 int f = MSG_NOSIGNAL;
1834         ], [
1835                 # Yes, we have it...
1836                 AC_MSG_RESULT(yes)
1837                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
1838         ], [
1839                 # We'll have to use signals
1840                 AC_MSG_RESULT(no)
1841         ])
1843         dnl *****************************
1844         dnl *** Checks for IPPROTO_IP ***
1845         dnl *****************************
1846         AC_MSG_CHECKING(for IPPROTO_IP)
1847         AC_TRY_COMPILE([#include <netinet/in.h>], [
1848                 int level = IPPROTO_IP;
1849         ], [
1850                 # Yes, we have it...
1851                 AC_MSG_RESULT(yes)
1852                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
1853         ], [
1854                 # We'll have to use getprotobyname
1855                 AC_MSG_RESULT(no)
1856         ])
1858         dnl *******************************
1859         dnl *** Checks for IPPROTO_IPV6 ***
1860         dnl *******************************
1861         AC_MSG_CHECKING(for IPPROTO_IPV6)
1862         AC_TRY_COMPILE([#include <netinet/in.h>], [
1863                 int level = IPPROTO_IPV6;
1864         ], [
1865                 # Yes, we have it...
1866                 AC_MSG_RESULT(yes)
1867                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
1868         ], [
1869                 # We'll have to use getprotobyname
1870                 AC_MSG_RESULT(no)
1871         ])
1873         dnl ******************************
1874         dnl *** Checks for IPPROTO_TCP ***
1875         dnl ******************************
1876         AC_MSG_CHECKING(for IPPROTO_TCP)
1877         AC_TRY_COMPILE([#include <netinet/in.h>], [
1878                 int level = IPPROTO_TCP;
1879         ], [
1880                 # Yes, we have it...
1881                 AC_MSG_RESULT(yes)
1882                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
1883         ], [
1884                 # We'll have to use getprotobyname
1885                 AC_MSG_RESULT(no)
1886         ])
1888         dnl *****************************
1889         dnl *** Checks for SOL_IP     ***
1890         dnl *****************************
1891         AC_MSG_CHECKING(for SOL_IP)
1892         AC_TRY_COMPILE([#include <netdb.h>], [
1893                 int level = SOL_IP;
1894         ], [
1895                 # Yes, we have it...
1896                 AC_MSG_RESULT(yes)
1897                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
1898         ], [
1899                 # We'll have to use getprotobyname
1900                 AC_MSG_RESULT(no)
1901         ])
1903         dnl *****************************
1904         dnl *** Checks for SOL_IPV6     ***
1905         dnl *****************************
1906         AC_MSG_CHECKING(for SOL_IPV6)
1907         AC_TRY_COMPILE([#include <netdb.h>], [
1908                 int level = SOL_IPV6;
1909         ], [
1910                 # Yes, we have it...
1911                 AC_MSG_RESULT(yes)
1912                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
1913         ], [
1914                 # We'll have to use getprotobyname
1915                 AC_MSG_RESULT(no)
1916         ])
1918         dnl *****************************
1919         dnl *** Checks for SOL_TCP    ***
1920         dnl *****************************
1921         AC_MSG_CHECKING(for SOL_TCP)
1922         AC_TRY_COMPILE([#include <netdb.h>], [
1923                 int level = SOL_TCP;
1924         ], [
1925                 # Yes, we have it...
1926                 AC_MSG_RESULT(yes)
1927                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
1928         ], [
1929                 # We'll have to use getprotobyname
1930                 AC_MSG_RESULT(no)
1931         ])
1933         dnl *****************************
1934         dnl *** Checks for IP_PKTINFO ***
1935         dnl *****************************
1936         AC_MSG_CHECKING(for IP_PKTINFO)
1937         AC_TRY_COMPILE([#include <linux/in.h>], [
1938                 int level = IP_PKTINFO;
1939         ], [
1940                 # Yes, we have it...
1941                 AC_MSG_RESULT(yes)
1942                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1943         ], [
1944                 AC_MSG_RESULT(no)
1945         ])
1947         dnl *****************************
1948         dnl *** Checks for IPV6_PKTINFO ***
1949         dnl *****************************
1950         AC_MSG_CHECKING(for IPV6_PKTINFO)
1951         AC_TRY_COMPILE([#include <netdb.h>], [
1952                 int level = IPV6_PKTINFO;
1953         ], [
1954                 # Yes, we have it...
1955                 AC_MSG_RESULT(yes)
1956                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
1957         ], [
1958                 AC_MSG_RESULT(no)
1959         ])
1961         dnl **********************************
1962         dnl *** Checks for IP_DONTFRAG     ***
1963         dnl **********************************
1964         AC_MSG_CHECKING(for IP_DONTFRAG)
1965         AC_TRY_COMPILE([#include <netinet/in.h>], [
1966                 int level = IP_DONTFRAG;
1967         ], [
1968                 # Yes, we have it...
1969                 AC_MSG_RESULT(yes)
1970                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
1971         ], [
1972                 AC_MSG_RESULT(no)
1973         ])
1975         dnl **********************************
1976         dnl *** Checks for IP_DONTFRAGMENT ***
1977         dnl **********************************
1978         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
1979         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
1980                 int level = IP_DONTFRAGMENT;
1981         ], [
1982                 # Yes, we have it...
1983                 AC_MSG_RESULT(yes)
1984                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
1985         ], [
1986                 AC_MSG_RESULT(no)
1987         ])
1989         dnl **********************************
1990         dnl *** Checks for IP_MTU_DISCOVER ***
1991         dnl **********************************
1992         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
1993         AC_TRY_COMPILE([#include <linux/in.h>], [
1994                 int level = IP_MTU_DISCOVER;
1995         ], [
1996                 # Yes, we have it...
1997                 AC_MSG_RESULT(yes)
1998                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
1999         ], [
2000                 AC_MSG_RESULT(no)
2001         ])
2003         dnl **********************************
2004         dnl *** Checks for  IP_PMTUDISC_DO ***
2005         dnl **********************************
2006         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2007         AC_TRY_COMPILE([#include <linux/in.h>], [
2008                 int level = IP_PMTUDISC_DO;
2009         ], [
2010                 # Yes, we have it...
2011                 AC_MSG_RESULT(yes)
2012                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2013         ], [
2014                 AC_MSG_RESULT(no)
2015         ])
2017         dnl *********************************
2018         dnl *** Check for struct ip_mreqn ***
2019         dnl *********************************
2020         AC_MSG_CHECKING(for struct ip_mreqn)
2021         AC_TRY_COMPILE([#include <netinet/in.h>], [
2022                 struct ip_mreqn mreq;
2023                 mreq.imr_address.s_addr = 0;
2024         ], [
2025                 # Yes, we have it...
2026                 AC_MSG_RESULT(yes)
2027                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2028         ], [
2029                 # We'll just have to try and use struct ip_mreq
2030                 AC_MSG_RESULT(no)
2031                 AC_MSG_CHECKING(for struct ip_mreq)
2032                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2033                         struct ip_mreq mreq;
2034                         mreq.imr_interface.s_addr = 0;
2035                 ], [
2036                         # Yes, we have it...
2037                         AC_MSG_RESULT(yes)
2038                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2039                 ], [
2040                         # No multicast support
2041                         AC_MSG_RESULT(no)
2042                 ])
2043         ])
2044         
2045         dnl **********************************
2046         dnl *** Check for getaddrinfo ***
2047         dnl **********************************
2048         AC_MSG_CHECKING(for getaddrinfo)
2049                 AC_TRY_LINK([
2050                 #include <stdio.h>
2051                 #include <netdb.h>
2052         ], [
2053                 getaddrinfo(NULL,NULL,NULL,NULL);
2054         ], [
2055                 # Yes, we have it...
2056                 AC_MSG_RESULT(yes)
2057                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2058         ], [
2059                 AC_MSG_RESULT(no)
2060         ])
2062         dnl **********************************
2063         dnl *** Check for gethostbyname2_r ***
2064         dnl **********************************
2065         AC_MSG_CHECKING(for gethostbyname2_r)
2066                 AC_TRY_LINK([
2067                 #include <stdio.h>
2068                 #include <netdb.h>
2069         ], [
2071                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2072         ], [
2073                 # Yes, we have it...
2074                 AC_MSG_RESULT(yes)
2075                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2076         ], [
2077                 AC_MSG_RESULT(no)
2078         ])
2080         dnl **********************************
2081         dnl *** Check for gethostbyname2 ***
2082         dnl **********************************
2083         AC_MSG_CHECKING(for gethostbyname2)
2084                 AC_TRY_LINK([
2085                 #include <stdio.h>
2086                 #include <netdb.h>
2087         ], [
2088                 gethostbyname2(NULL,0);
2089         ], [
2090                 # Yes, we have it...
2091                 AC_MSG_RESULT(yes)
2092                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2093         ], [
2094                 AC_MSG_RESULT(no)
2095         ])
2097         dnl **********************************
2098         dnl *** Check for gethostbyname ***
2099         dnl **********************************
2100         AC_MSG_CHECKING(for gethostbyname)
2101                 AC_TRY_LINK([
2102                 #include <stdio.h>
2103                 #include <netdb.h>
2104         ], [
2105                 gethostbyname(NULL);
2106         ], [
2107                 # Yes, we have it...
2108                 AC_MSG_RESULT(yes)
2109                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2110         ], [
2111                 AC_MSG_RESULT(no)
2112         ])
2114         dnl **********************************
2115         dnl *** Check for getprotobyname ***
2116         dnl **********************************
2117         AC_MSG_CHECKING(for getprotobyname)
2118                 AC_TRY_LINK([
2119                 #include <stdio.h>
2120                 #include <netdb.h>
2121         ], [
2122                 getprotobyname(NULL);
2123         ], [
2124                 # Yes, we have it...
2125                 AC_MSG_RESULT(yes)
2126                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2127         ], [
2128                 AC_MSG_RESULT(no)
2129         ])
2131         dnl **********************************
2132         dnl *** Check for getnameinfo ***
2133         dnl **********************************
2134         AC_MSG_CHECKING(for getnameinfo)
2135                 AC_TRY_LINK([
2136                 #include <stdio.h>
2137                 #include <netdb.h>
2138         ], [
2139                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2140         ], [
2141                 # Yes, we have it...
2142                 AC_MSG_RESULT(yes)
2143                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2144         ], [
2145                 AC_MSG_RESULT(no)
2146         ])
2149         dnl **********************************
2150         dnl *** Check for inet_ntop ***
2151         dnl **********************************
2152         AC_MSG_CHECKING(for inet_ntop)
2153                 AC_TRY_LINK([
2154                 #include <stdio.h>
2155                 #include <arpa/inet.h>
2156         ], [
2157                 inet_ntop (0, NULL, NULL, 0);
2158         ], [
2159                 # Yes, we have it...
2160                 AC_MSG_RESULT(yes)
2161                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2162         ], [
2163                 AC_MSG_RESULT(no)
2164         ])
2166         dnl *****************************
2167         dnl *** Checks for libnsl     ***
2168         dnl *****************************
2169         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2171         AC_CHECK_FUNCS(inet_pton inet_aton)
2173         dnl *****************************
2174         dnl *** Checks for libxnet    ***
2175         dnl *****************************
2176         case "${host}" in
2177                 *solaris* )
2178                         AC_MSG_CHECKING(for Solaris XPG4 support)
2179                         if test -f /usr/lib/libxnet.so; then
2180                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2181                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2182                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2183                                 LIBS="$LIBS -lxnet"
2184                                 AC_MSG_RESULT(yes)
2185                         else
2186                                 AC_MSG_RESULT(no)
2187                         fi
2189                         if test "$GCC" = "yes"; then
2190                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2191                         fi
2192                 ;;
2193         esac
2195         dnl *****************************
2196         dnl *** Checks for libpthread ***
2197         dnl *****************************
2198 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2199 # and libpthread does not exist
2201         case "${host}" in
2202                 *-*-*haiku*)
2203                         dnl Haiku has pthread in libroot (libc equiv)
2204                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2205                 ;;
2206                 *-*-*freebsd*)
2207                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2208                 ;;
2209                 *-*-*openbsd*)
2210                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2211                 ;;
2212                 *)
2213                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2214                 ;;
2215         esac
2216         AC_CHECK_HEADERS(pthread.h)
2217         AC_CHECK_HEADERS(pthread_np.h)
2218         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2219         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2220         AC_CHECK_FUNCS(pthread_kill)
2221         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2222         AC_TRY_COMPILE([ #include <pthread.h>], [
2223                 pthread_mutexattr_t attr;
2224                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2225         ], [
2226                 AC_MSG_RESULT(ok)
2227         ], [
2228                 AC_MSG_RESULT(no)
2229                 AC_ERROR(Posix system lacks support for recursive mutexes)
2230         ])
2231         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2232         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2233         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2235         dnl **********************************
2236         dnl *** Check for mincore ***
2237         dnl **********************************
2238         AC_MSG_CHECKING(for mincore)
2239                 AC_TRY_LINK([
2240                 #include <stdio.h>
2241                 #include <sys/types.h>
2242                 #include <sys/mman.h>
2243         ], [
2244                 mincore(NULL, 0, NULL);
2245         ], [
2246                 # Yes, we have it...
2247                 AC_MSG_RESULT(yes)
2248                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
2249         ], [
2250                 AC_MSG_RESULT(no)
2251         ])
2253         dnl ***********************************
2254         dnl *** Checks for working __thread ***
2255         dnl ***********************************
2256         AC_MSG_CHECKING(for working __thread)
2257         if test "x$with_tls" != "x__thread"; then
2258                 AC_MSG_RESULT(disabled)
2259         elif test "x$cross_compiling" = "xyes"; then
2260                 AC_MSG_RESULT(cross compiling, assuming yes)
2261         else
2262                 AC_TRY_RUN([
2263                         #if defined(__APPLE__) && defined(__clang__)
2264                         #error "__thread does not currently work with clang on Mac OS X"
2265                         #endif
2266                         
2267                         #include <pthread.h>
2268                         __thread int i;
2269                         static int res1, res2;
2271                         void thread_main (void *arg)
2272                         {
2273                                 i = arg;
2274                                 sleep (1);
2275                                 if (arg == 1)
2276                                         res1 = (i == arg);
2277                                 else
2278                                         res2 = (i == arg);
2279                         }
2281                         int main () {
2282                                 pthread_t t1, t2;
2284                                 i = 5;
2286                                 pthread_create (&t1, NULL, thread_main, 1);
2287                                 pthread_create (&t2, NULL, thread_main, 2);
2289                                 pthread_join (t1, NULL);
2290                                 pthread_join (t2, NULL);
2292                                 return !(res1 + res2 == 2);
2293                         }
2294                 ], [
2295                                 AC_MSG_RESULT(yes)
2296                 ], [
2297                                 AC_MSG_RESULT(no)
2298                                 with_tls=pthread
2299                 ])
2300         fi
2302         dnl **************************************
2303         dnl *** Checks for working sigaltstack ***
2304         dnl **************************************
2305         AC_MSG_CHECKING(for working sigaltstack)
2306         if test "x$with_sigaltstack" != "xyes"; then
2307                 AC_MSG_RESULT(disabled)
2308         elif test "x$cross_compiling" = "xyes"; then
2309                 AC_MSG_RESULT(cross compiling, assuming yes)
2310         else
2311                 AC_TRY_RUN([
2312                         #include <stdio.h>
2313                         #include <stdlib.h>
2314                         #include <unistd.h>
2315                         #include <signal.h>
2316                         #include <pthread.h>
2317                         #include <sys/wait.h>
2318                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2319                         #define SA_STACK SA_ONSTACK
2320                         #endif
2321                         static void
2322                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2323                         {
2324                                 exit (0);
2325                         }
2327                         volatile char*__ptr = NULL;
2328                         static void *
2329                         loop (void *ignored)
2330                         {
2331                                 *__ptr = 0;
2332                                 return NULL;
2333                         }
2335                         static void
2336                         child ()
2337                         {
2338                                 struct sigaction sa;
2339                                 stack_t sas;
2340                                 pthread_t id;
2341                                 pthread_attr_t attr;
2343                                 sa.sa_sigaction = sigsegv_signal_handler;
2344                                 sigemptyset (&sa.sa_mask);
2345                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2346                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2347                                         perror ("sigaction");
2348                                         return;
2349                                 }
2351                                 /* x86 darwin deliver segfaults using SIGBUS */
2352                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2353                                         perror ("sigaction");
2354                                         return;
2355                                 }
2356                                 sas.ss_sp = malloc (SIGSTKSZ);
2357                                 sas.ss_size = SIGSTKSZ;
2358                                 sas.ss_flags = 0;
2359                                 if (sigaltstack (&sas, NULL) == -1) {
2360                                         perror ("sigaltstack");
2361                                         return;
2362                                 }
2364                                 pthread_attr_init (&attr);
2365                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2366                                         printf ("pthread_create\n");
2367                                         return;
2368                                 }
2370                                 sleep (100);
2371                         }
2373                         int
2374                         main ()
2375                         {
2376                                 pid_t son;
2377                                 int status;
2378                                 int i;
2380                                 son = fork ();
2381                                 if (son == -1) {
2382                                         return 1;
2383                                 }
2385                                 if (son == 0) {
2386                                         child ();
2387                                         return 0;
2388                                 }
2390                                 for (i = 0; i < 300; ++i) {
2391                                         waitpid (son, &status, WNOHANG);
2392                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2393                                                 return 0;
2394                                         usleep (10000);
2395                                 }
2397                                 kill (son, SIGKILL);
2398                                 return 1;
2399                         }
2401                 ], [
2402                                 AC_MSG_RESULT(yes)
2403                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2404                 ], [
2405                                 with_sigaltstack=no
2406                                 AC_MSG_RESULT(no)
2407                 ])
2408         fi
2410         dnl ********************************
2411         dnl *** Checks for semaphore lib ***
2412         dnl ********************************
2413         # 'Real Time' functions on Solaris
2414         # posix4 on Solaris 2.6
2415         # pthread (first!) on Linux
2416         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2418         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2419         AC_CHECK_FUNCS(shm_open)
2421         dnl ********************************
2422         dnl *** Checks for timezone stuff **
2423         dnl ********************************
2424         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2425                 AC_TRY_COMPILE([
2426                         #include <time.h>
2427                         ], [
2428                         struct tm tm;
2429                         tm.tm_gmtoff = 1;
2430                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2431         if test $ac_cv_struct_tm_gmtoff = yes; then
2432                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2433         else
2434                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2435                         AC_TRY_COMPILE([
2436                                 #include <time.h>
2437                         ], [
2438                                 timezone = 1;
2439                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2440                 if test $ac_cv_var_timezone = yes; then
2441                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2442                 else
2443                         AC_ERROR(unable to find a way to determine timezone)
2444                 fi
2445         fi
2447         dnl *********************************
2448         dnl *** Checks for math functions ***
2449         dnl *********************************
2450         AC_SEARCH_LIBS(sqrtf, m)
2451         if test "x$has_broken_apple_cpp" != "xyes"; then
2452                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
2453                         AC_TRY_LINK([#include <math.h>], 
2454                         [ finite(0.0); ], 
2455                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
2456                         AC_MSG_RESULT(no)))
2457         fi
2458         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
2459                 AC_TRY_LINK([#include <math.h>], 
2460                 [ isfinite(0.0); ], 
2461                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
2462                 AC_MSG_RESULT(no)))
2464         dnl ****************************************************************
2465         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2466         dnl *** have it in the library (duh))                            ***
2467         dnl ****************************************************************
2468         AC_CHECK_FUNCS(poll)
2470         dnl *************************
2471         dnl *** Check for signbit ***
2472         dnl *************************
2473         AC_MSG_CHECKING(for signbit)
2474         AC_TRY_LINK([#include <math.h>], [
2475                 int s = signbit(1.0);
2476         ], [
2477                 AC_MSG_RESULT(yes)
2478                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
2479         ], [
2480                 AC_MSG_RESULT(no)
2481         ]) 
2483         dnl **********************************
2484         dnl *** epoll                      ***
2485         dnl **********************************
2486         AC_CHECK_HEADERS(sys/epoll.h)
2487         haveepoll=no
2488         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2489         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2490                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2491         fi
2493         havekqueue=no
2495         AC_CHECK_HEADERS(sys/event.h)
2496         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2498         dnl **************************************
2499         dnl * Darwin has a race that prevents us from using reliably:
2500         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2501         dnl * Since kqueue is mostly used for scaling large web servers, 
2502         dnl * and very few folks run Mono on large web servers on OSX, falling
2503         dnl * back 
2504         dnl **************************************
2505         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2506                 if test "x$host_darwin" = "xno"; then
2507                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2508                 fi
2509         fi
2511         dnl ******************************
2512         dnl *** Checks for SIOCGIFCONF ***
2513         dnl ******************************
2514         AC_CHECK_HEADERS(sys/ioctl.h)
2515         AC_CHECK_HEADERS(net/if.h, [], [],
2516            [
2517            #ifdef HAVE_SYS_TYPES_H
2518            # include <sys/types.h>
2519            #endif
2520            #ifdef HAVE_SYS_SOCKET_H
2521            # include <sys/socket.h>
2522            #endif
2523            ])
2524         AC_MSG_CHECKING(for ifreq)
2525         AC_TRY_COMPILE([
2526                 #include <stdio.h>
2527                 #include <sys/ioctl.h>
2528                 #include <net/if.h>
2529                 ], [
2530                 struct ifconf ifc;
2531                 struct ifreq *ifr;
2532                 void *x;
2533                 ifc.ifc_len = 0;
2534                 ifc.ifc_buf = NULL;
2535                 x = (void *) &ifr->ifr_addr;
2536                 ],[
2537                         AC_MSG_RESULT(yes)
2538                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2539                 ], [
2540                         AC_MSG_RESULT(no)
2541                 ])
2542         dnl **********************************
2543         dnl ***     Checks for sin_len     ***
2544         dnl **********************************
2545         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2546         AC_TRY_COMPILE([
2547                 #include <netinet/in.h>
2548                 ], [
2549                 struct sockaddr_in saddr;
2550                 saddr.sin_len = sizeof (saddr);
2551                 ],[
2552                         AC_MSG_RESULT(yes)
2553                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2554                 ], [
2555                         AC_MSG_RESULT(no)
2556                 ])      
2557         dnl **********************************
2558         dnl ***    Checks for sin6_len     ***
2559         dnl **********************************
2560         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2561         AC_TRY_COMPILE([
2562                 #include <netinet/in.h>
2563                 ], [
2564                 struct sockaddr_in6 saddr6;
2565                 saddr6.sin6_len = sizeof (saddr6);
2566                 ],[
2567                         AC_MSG_RESULT(yes)
2568                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2569                 ], [
2570                         AC_MSG_RESULT(no)
2571                 ])
2572         dnl **********************************
2573         dnl *** Check for getifaddrs       ***
2574         dnl **********************************
2575         AC_MSG_CHECKING(for getifaddrs)
2576                 AC_TRY_LINK([
2577                 #include <stdio.h>
2578                 #include <sys/types.h>
2579                 #include <sys/socket.h>
2580                 #include <ifaddrs.h>
2581         ], [
2582                 getifaddrs(NULL);
2583         ], [
2584                 # Yes, we have it...
2585                 AC_MSG_RESULT(yes)
2586                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2587         ], [
2588                 AC_MSG_RESULT(no)
2589         ])
2590         dnl **********************************
2591         dnl *** Check for if_nametoindex   ***
2592         dnl **********************************
2593         AC_MSG_CHECKING(for if_nametoindex)
2594                 AC_TRY_LINK([
2595                 #include <stdio.h>
2596                 #include <sys/types.h>
2597                 #include <sys/socket.h>
2598                 #include <net/if.h>
2599         ], [
2600                 if_nametoindex(NULL);
2601         ], [
2602                 # Yes, we have it...
2603                 AC_MSG_RESULT(yes)
2604                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2605         ], [
2606                 AC_MSG_RESULT(no)
2607         ])
2608                         
2609         dnl **********************************
2610         dnl *** Checks for proclib         ***
2611         dnl **********************************
2612         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.)])
2613         dnl **********************************
2614         dnl *** Checks for MonoPosixHelper ***
2615         dnl **********************************
2616         AC_CHECK_HEADERS(checklist.h)
2617         AC_CHECK_HEADERS(pathconf.h)
2618         AC_CHECK_HEADERS(fstab.h)
2619         AC_CHECK_HEADERS(attr/xattr.h)
2620         AC_CHECK_HEADERS(sys/extattr.h)
2621         AC_CHECK_HEADERS(sys/sendfile.h)
2622         AC_CHECK_HEADERS(sys/statvfs.h)
2623         AC_CHECK_HEADERS(sys/statfs.h)
2624         AC_CHECK_HEADERS(sys/vfstab.h)
2625         AC_CHECK_HEADERS(sys/xattr.h)
2626         AC_CHECK_HEADERS(sys/mman.h)
2627         AC_CHECK_HEADERS(sys/param.h)
2628         AC_CHECK_HEADERS(sys/mount.h, [], [],
2629                 [
2630                 #ifdef HAVE_SYS_PARAM_H
2631                 # include <sys/param.h>
2632                 #endif
2633                 ])
2634         AC_CHECK_HEADERS(sys/mount.h)
2635         AC_CHECK_FUNCS(confstr)
2636         AC_CHECK_FUNCS(seekdir telldir)
2637         AC_CHECK_FUNCS(getdomainname)
2638         AC_CHECK_FUNCS(setdomainname)
2639         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2640         AC_CHECK_FUNCS(setgroups)
2641         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2642         AC_CHECK_FUNCS(getfsstat)
2643         AC_CHECK_FUNCS(lutimes futimes)
2644         AC_CHECK_FUNCS(mremap)
2645         AC_CHECK_FUNCS(remap_file_pages)
2646         AC_CHECK_FUNCS(posix_fadvise)
2647         AC_CHECK_FUNCS(posix_fallocate)
2648         AC_CHECK_FUNCS(posix_madvise)
2649         AC_CHECK_FUNCS(vsnprintf)
2650         AC_CHECK_FUNCS(sendfile)
2651         AC_CHECK_FUNCS(gethostid sethostid)
2652         AC_CHECK_FUNCS(sethostname)
2653         AC_CHECK_FUNCS(statfs)
2654         AC_CHECK_FUNCS(fstatfs)
2655         AC_CHECK_FUNCS(statvfs)
2656         AC_CHECK_FUNCS(fstatvfs)
2657         AC_CHECK_FUNCS(stime)
2658         AC_CHECK_FUNCS(strerror_r)
2659         AC_CHECK_FUNCS(ttyname_r)
2660         AC_CHECK_FUNCS(psignal)
2661         AC_CHECK_FUNCS(getlogin_r)
2662         AC_CHECK_FUNCS(lockf)
2663         AC_CHECK_FUNCS(swab)
2664         AC_CHECK_FUNCS(setusershell endusershell)
2665         AC_CHECK_FUNCS(futimens utimensat)
2666         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2667         AC_CHECK_FUNCS(readv writev preadv pwritev)
2668         AC_CHECK_FUNCS(setpgid)
2669         AC_CHECK_FUNCS(system)
2670         AC_CHECK_FUNCS(fork execv execve)
2671         AC_CHECK_FUNCS(accept4)
2672         AC_CHECK_FUNCS(localtime_r)
2673         AC_CHECK_FUNCS(mkdtemp)
2674         AC_CHECK_SIZEOF(size_t)
2675         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2676                 [#include <sys/types.h>
2677                  #include <sys/stat.h>
2678                  #include <unistd.h>])
2679         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2680                 [#include <sys/types.h>
2681                  #include <sys/stat.h>
2682                  #include <unistd.h>])
2683         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2684                 [#include <sys/time.h>])
2685         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2686                 [#include <sys/socket.h>])
2687         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2688                 [#include <unistd.h>
2689                  #include <fcntl.h>])
2690         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2691                 [#include <sys/uio.h>])
2692         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2693                 [#include <sys/socket.h>])
2694         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2695                 [#include <sys/poll.h>])
2696         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2697                 [#include <sys/socket.h>])
2698         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2699                 [#include <sys/socket.h>])
2700         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2701                 [#include <netinet/in.h>])
2702         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2703                 [#include <netinet/in.h>])
2704         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2705                 [#include <sys/un.h>])
2706         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2707                 [#include <sys/types.h>
2708                  #include <sys/stat.h>
2709                  #include <unistd.h>])
2710         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2711                 [#include <time.h>])
2712         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2713                 [#include <sys/time.h>
2714                  #include <sys/types.h>
2715                  #include <utime.h>])
2716         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2717                 [#include <sys/time.h>])
2718         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2719                 [#include <sys/types.h>
2720                  #include <utime.h>])
2721         AC_CHECK_MEMBERS(
2722                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2723                 [#include <sys/types.h>
2724                  #include <dirent.h>])
2725         AC_CHECK_MEMBERS(
2726                 [struct passwd.pw_gecos],,, 
2727                 [#include <sys/types.h>
2728                  #include <pwd.h>])
2729         AC_CHECK_MEMBERS(
2730                 [struct statfs.f_flags],,, 
2731                 [#include <sys/types.h>
2732                  #include <sys/vfs.h>])
2733         AC_CHECK_MEMBERS(
2734                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2735                 [#include <sys/types.h>
2736                  #include <sys/stat.h>
2737                  #include <unistd.h>])
2739         dnl Favour xattr through glibc, but use libattr if we have to
2740         AC_CHECK_FUNC(lsetxattr, ,
2741                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2742         )
2743         AC_SUBST(XATTR_LIB)
2745         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2746         AC_CHECK_MEMBERS(
2747                 [struct kinfo_proc.kp_proc],,, 
2748                 [#include <sys/types.h>
2749                  #include <sys/param.h>
2750                  #include <sys/sysctl.h>
2751                  #include <sys/proc.h>
2752                  ])
2754         dnl *********************************
2755         dnl *** Checks for Windows compilation ***
2756         dnl *********************************
2757         AC_CHECK_HEADERS(sys/time.h)
2758         AC_CHECK_HEADERS(sys/param.h)
2759         AC_CHECK_HEADERS(dirent.h)
2761         dnl ******************************************
2762         dnl *** Checks for OSX and iOS compilation ***
2763         dnl ******************************************
2764         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2766         dnl *********************************
2767         dnl *** Check for Console 2.0 I/O ***
2768         dnl *********************************
2769         AC_CHECK_HEADERS([curses.h])
2770         AC_CHECK_HEADERS([term.h], [], [],
2771         [#if HAVE_CURSES_H
2772          #include <curses.h>
2773          #endif
2774         ])
2775         AC_CHECK_HEADERS([termios.h])
2777         dnl *********************************
2778         dnl *** Checks for random         ***
2779         dnl *********************************
2780         if test x$host_darwin = xno; then
2781                 AC_CHECK_HEADERS(sys/random.h)
2782                 AC_CHECK_FUNCS(getrandom getentropy)
2783         fi
2784 else
2785         dnl *********************************
2786         dnl *** Checks for Windows compilation ***
2787         dnl *********************************
2788         AC_CHECK_HEADERS(winternl.h)
2790         jdk_headers_found=no
2791         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
2792         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
2793         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
2794         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
2795         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
2796         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
2797         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
2799         dnl *********************************
2800         dnl *** Check for struct ip_mreqn ***
2801         dnl *********************************
2802         AC_MSG_CHECKING(for struct ip_mreqn)
2803         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2804                 struct ip_mreqn mreq;
2805                 mreq.imr_address.s_addr = 0;
2806         ], [
2807                 # Yes, we have it...
2808                 AC_MSG_RESULT(yes)
2809                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
2810         ], [
2811                 # We'll just have to try and use struct ip_mreq
2812                 AC_MSG_RESULT(no)
2813                 AC_MSG_CHECKING(for struct ip_mreq)
2814                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2815                         struct ip_mreq mreq;
2816                         mreq.imr_interface.s_addr = 0;
2817                 ], [
2818                         # Yes, we have it...
2819                         AC_MSG_RESULT(yes)
2820                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
2821                 ], [
2822                         # No multicast support
2823                         AC_MSG_RESULT(no)
2824                 ])
2825         ])
2827         dnl **********************************
2828         dnl *** Check for getaddrinfo ***
2829         dnl **********************************
2830         AC_MSG_CHECKING(for getaddrinfo)
2831                 AC_TRY_LINK([
2832                 #include <stdio.h>
2833                 #include <winsock2.h>
2834                 #include <ws2tcpip.h>
2835         ], [
2836                 getaddrinfo(NULL,NULL,NULL,NULL);
2837         ], [
2838                 # Yes, we have it...
2839                 AC_MSG_RESULT(yes)
2840                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2841         ], [
2842                 AC_MSG_RESULT(no)
2843         ])
2845         dnl **********************************
2846         dnl *** Check for gethostbyname ***
2847         dnl **********************************
2848         AC_MSG_CHECKING(for gethostbyname)
2849                 AC_TRY_LINK([
2850                 #include <stdio.h>
2851                 #include <winsock2.h>
2852                 #include <ws2tcpip.h>
2853         ], [
2854                 gethostbyname(NULL);
2855         ], [
2856                 # Yes, we have it...
2857                 AC_MSG_RESULT(yes)
2858                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2859         ], [
2860                 AC_MSG_RESULT(no)
2861         ])
2863         dnl **********************************
2864         dnl *** Check for getprotobyname ***
2865         dnl **********************************
2866         AC_MSG_CHECKING(for getprotobyname)
2867                 AC_TRY_LINK([
2868                 #include <stdio.h>
2869                 #include <winsock2.h>
2870                 #include <ws2tcpip.h>
2871         ], [
2872                 getprotobyname(NULL);
2873         ], [
2874                 # Yes, we have it...
2875                 AC_MSG_RESULT(yes)
2876                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2877         ], [
2878                 AC_MSG_RESULT(no)
2879         ])
2881         dnl **********************************
2882         dnl *** Check for getnameinfo ***
2883         dnl **********************************
2884         AC_MSG_CHECKING(for getnameinfo)
2885                 AC_TRY_LINK([
2886                 #include <stdio.h>
2887                 #include <winsock2.h>
2888                 #include <ws2tcpip.h>
2889         ], [
2890                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2891         ], [
2892                 # Yes, we have it...
2893                 AC_MSG_RESULT(yes)
2894                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2895         ], [
2896                 AC_MSG_RESULT(no)
2897         ])
2899         dnl **********************************
2900         dnl *** Check for inet_ntop ***
2901         dnl **********************************
2902         AC_MSG_CHECKING(for inet_ntop)
2903                 AC_TRY_LINK([
2904                 #include <stdio.h>
2905                 #include <winsock2.h>
2906                 #include <ws2tcpip.h>
2907         ], [
2908                 inet_ntop (0, NULL, NULL, 0);
2909         ], [
2910                 # Yes, we have it...
2911                 AC_MSG_RESULT(yes)
2912                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2913         ], [
2914                 AC_MSG_RESULT(no)
2915         ])
2917         dnl **********************************
2918         dnl *** Check for inet_pton ***
2919         dnl **********************************
2920         AC_MSG_CHECKING(for inet_pton)
2921                 AC_TRY_LINK([
2922                 #include <stdio.h>
2923                 #include <winsock2.h>
2924                 #include <ws2tcpip.h>
2925         ], [
2926                 #ifndef inet_pton
2927                 (void) inet_pton;
2928                 #endif
2929                 inet_pton (0, NULL, NULL);
2930         ], [
2931                 # Yes, we have it...
2932                 AC_MSG_RESULT(yes)
2933                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
2934         ], [
2935                 AC_MSG_RESULT(no)
2936         ])
2938         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
2939         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
2940         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
2941         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
2942         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
2943         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
2944         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
2947 dnl socklen_t check
2948 AC_MSG_CHECKING(for socklen_t)
2949 AC_TRY_COMPILE([
2950 #include <sys/types.h>
2951 #include <sys/socket.h>
2953   socklen_t foo;
2955 ac_cv_c_socklen_t=yes
2956         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
2957         AC_MSG_RESULT(yes)
2959         AC_MSG_RESULT(no)
2962 AC_MSG_CHECKING(for array element initializer support)
2963 AC_TRY_COMPILE([#include <sys/socket.h>], [
2964         const int array[] = {[1] = 2,};
2965 ], [
2966         # Yes, we have it...
2967         AC_MSG_RESULT(yes)
2968         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
2969 ], [
2970         # We'll have to use signals
2971         AC_MSG_RESULT(no)
2974 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
2975         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
2976         AC_TRY_LINK([#include <math.h>], 
2977         [ static void *p = &trunc; ],
2978         [
2979                 AC_DEFINE(HAVE_TRUNC) 
2980                 AC_MSG_RESULT(yes)
2981                 ac_cv_trunc=yes
2982         ],
2983         AC_MSG_RESULT(no)))
2985 if test "x$ac_cv_truncl" != "xyes"; then
2986    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
2989 AC_CHECK_FUNCS(execvp)
2991 dnl ****************************
2992 dnl *** Look for /dev/random ***
2993 dnl ****************************
2995 AC_MSG_CHECKING([if usage of random device is requested])
2996 AC_ARG_ENABLE(dev-random,
2997 [  --disable-dev-random    disable the use of the random device (enabled by default)],
2998 try_dev_random=$enableval, try_dev_random=yes)
3000 AC_MSG_RESULT($try_dev_random)
3002 case "{$build}" in
3003     *-openbsd*)
3004     NAME_DEV_RANDOM="/dev/srandom"
3005     ;;
3007 dnl IBM i does not have /dev/random, use unblocking only
3009     *-*-os400*)
3010     NAME_DEV_RANDOM="/dev/urandom"
3011     ;;
3013 dnl Win32 does not have /dev/random, they have their own method...
3015     *-mingw*|*-*-cygwin*)
3016     ac_cv_have_dev_random=no
3017     ;;
3019 dnl Everywhere else, it's /dev/random
3021     *)
3022     NAME_DEV_RANDOM="/dev/random"
3023     ;;
3024 esac
3026 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3028 dnl Now check if the device actually exists
3030 if test "x$try_dev_random" = "xyes"; then
3031     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3032     [if test -r "$NAME_DEV_RANDOM" ; then
3033         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3034     if test "x$ac_cv_have_dev_random" = "xyes"; then
3035         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3036     fi
3037 else
3038     AC_MSG_CHECKING(for random device)
3039     ac_cv_have_dev_random=no
3040     AC_MSG_RESULT(has been disabled)
3043 if test "x$host_win32" = "xyes"; then
3044     AC_DEFINE(HAVE_CRYPT_RNG)
3047 if test "x$ac_cv_have_dev_random" = "xno" \
3048     && test "x$host_win32" = "xno"; then
3049     AC_MSG_WARN([[
3051 *** A system-provided entropy source was not found on this system.
3052 *** Because of this, the System.Security.Cryptography random number generator
3053 *** will throw a NotImplemented exception.
3055 *** If you are seeing this message, and you know your system DOES have an
3056 *** entropy collection in place, please contact <crichton@gimp.org> and
3057 *** provide information about the system and how to access the random device.
3059 *** Otherwise you can install either egd or prngd and set the environment
3060 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3061 ***]])
3064 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)
3066 AC_MSG_CHECKING([if big-arrays are to be enabled])
3067 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)
3068 if test "x$enable_big_arrays" = "xyes" ; then
3069     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3070         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3071     else
3072         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3073     fi
3075 AC_MSG_RESULT($enable_big_arrays)
3077 dnl **************
3078 dnl *** DTRACE ***
3079 dnl **************
3081 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3083 if test "x$enable_dtrace" = "xyes"; then
3084    if test "x$has_dtrace" = "xno"; then
3085           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3086    fi
3087    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3088    if test "x$DTRACE" = "xno"; then
3089           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3090           enable_dtrace=no
3091    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3092           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3093           enable_dtrace=no
3094    fi
3097 dtrace_g=no
3098 if test "x$enable_dtrace" = "xyes"; then
3099         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3100         DTRACEFLAGS=
3101         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3102                 case "$host" in
3103                         powerpc-*-darwin*)
3104                         DTRACEFLAGS="-arch ppc64"
3105                         ;;
3106                         i*86-*-darwin*)
3107                         DTRACEFLAGS="-arch x86_64"
3108                         ;;
3109                         *)
3110                         DTRACEFLAGS=-64
3111                         ;;
3112                 esac
3113         else
3114                 case "$host" in
3115                         powerpc-*-darwin*)
3116                         DTRACEFLAGS="-arch ppc"
3117                         ;;
3118                         i*86-*-darwin*)
3119                         DTRACEFLAGS="-arch i386"
3120                         ;;
3121                         *)
3122                         DTRACEFLAGS=-32
3123                         ;;
3124                 esac
3125         fi
3126         AC_SUBST(DTRACEFLAGS)
3127         case "$host" in
3128                 *-*-solaris*)
3129                 dtrace_g=yes
3130                 ;;
3131         esac
3132         AC_CHECK_HEADERS([sys/sdt.h])
3134 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3135 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3137 dnl **************************
3138 dnl *** AOT cross offsets  ***
3139 dnl **************************
3141 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3142     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3144 dnl **************
3145 dnl ***  LLVM  ***
3146 dnl **************
3148 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3149 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3150 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)
3151 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3153 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3155 if test "x$enable_llvm" = "xdefault"; then
3156    enable_llvm=$enable_llvm_default
3159 if test "x$enable_llvm" = "xyes"; then
3160    if test "x$with_llvm" != "x"; then
3161           LLVM_CONFIG=$with_llvm/bin/llvm-config
3162           if test x$host_win32 = xyes; then
3163                 LLVM_CONFIG=$LLVM_CONFIG.exe
3164           fi
3165           if test ! -x $LLVM_CONFIG; then
3166                  AC_MSG_ERROR([LLVM executable $LLVM_CONFIG not found.])
3167       fi
3168    else
3169       AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
3170       if test "x$LLVM_CONFIG" = "xno"; then
3171              AC_MSG_ERROR([llvm-config not found.])
3172       fi
3173    fi
3175    llvm_codegen="x86codegen"
3176    case "$target" in
3177    arm*)
3178                 llvm_codegen="armcodegen"
3179                 ;;
3180    esac
3182    if test "x$host_win32" = "xno"; then
3184    # Should be something like '2.6' or '2.7svn'
3185    llvm_version=`$LLVM_CONFIG --version`
3186    llvm_api_version=`$LLVM_CONFIG --mono-api-version 2>/dev/null`
3187    AC_MSG_CHECKING(LLVM version)
3188    AC_MSG_RESULT($llvm_version $llvm_api_version)
3189    if echo $llvm_version | grep -q 'mono'; then
3190           if test "x$enable_llvm_version_check" = "xyes"; then
3191                  if test "$llvm_version" != "$expected_llvm_version"; then
3192                         AC_MSG_ERROR([Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version"])
3193                  fi
3194           fi
3195    else
3196           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.])
3197    fi
3199    # The output of --cflags seems to include optimizations flags too
3200    if test $llvm_api_version -gt 100; then
3201           # The --cflags argument includes all kinds of warnings -pendantic etc.
3202           LLVM_CFLAGS="-I$with_llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3203           LLVM_CXXFLAGS="-I$with_llvm/include -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3204    else
3205           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'`
3206       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'`
3207    fi
3208    # LLVM is compiled with -fno-rtti, so we need this too, since our classes inherit
3209    # from LLVM classes.
3210    LLVM_CXXFLAGS="$LLVM_CXXFLAGS -fno-rtti -fexceptions"
3211    LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
3212    # This might include empty lines
3213    LLVM_SYSTEM_LIBS=`$LLVM_CONFIG --system-libs 2>/dev/null | grep -- -`
3214    llvm_jit_supported=yes
3215    llvm_jit_libs="jit mcjit $llvm_codegen"
3216    if test "x$host" != "x$target"; then
3217       # No need for jit libs
3218           llvm_jit_supported=no
3219       llvm_jit_libs=""
3220    elif test $llvm_api_version -gt 100; then
3221       llvm_jit_libs="orcjit $llvm_codegen"
3222    fi
3223    LLVM_LIBS=`$LLVM_CONFIG --libs analysis core bitwriter $llvm_jit_libs`
3224    if test "x$LLVM_LIBS" = "x"; then
3225           echo "$LLVM_CONFIG --libs failed."
3226           exit 1
3227    fi
3228    LLVM_LIBS="$LLVM_LIBS $LLVM_LDFLAGS $LLVM_SYSTEM_LIBS"
3229    # The c++ standard library used by llvm doesn't show up in $LLVM_SYSTEM_LIBS so add it manually
3230    if echo $LLVM_CXXFLAGS | grep -q -- '-stdlib=libc++'; then
3231       LLVM_LIBS="$LLVM_LIBS -lc++"
3232    else
3233       LLVM_LIBS="$LLVM_LIBS -lstdc++"
3234    fi
3236    expected_llvm_version="3.4svn-mono-mono/e656cac"
3238    else
3239        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"
3240        LLVM_CXXFLAGS="$LLVM_CFLAGS -std=gnu++11 -fvisibility-inlines-hidden -fno-rtti -Woverloaded-virtual -Wcast-qual"
3241        LLVM_LDFLAGS="-L$with_llvm/lib"
3242        LLVM_SYSTEM_LIBS="-lshell32 -lpsapi -limagehlp -ldbghelp -lm"
3243        LLVM_LIBS="-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter \
3244          -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo \
3245          -lLLVMARMAsmPrinter -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler \
3246          -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc \
3247          -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMJIT \
3248          -lLLVMAnalysis -lLLVMTarget \
3249          -lLLVMIRReader -lLLVMAsmParser -lLLVMLineEditor -lLLVMMCAnalysis -lLLVMInstrumentation \
3250          -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils \
3251          -lLLVMipa -lLLVMAnalysis -lLLVMProfileData -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld \
3252          -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMExecutionEngine -lLLVMMC -lLLVMCore \
3253          -lLLVMSupport -lstdc++"
3254        LLVM_LIBS="$LLVM_LIBS $LLVM_SYSTEM_LIBS"
3256        llvm_config_path=$with_llvm/include/llvm/Config/llvm-config.h
3257        llvm_api_version=`awk '/MONO_API_VERSION/ { print $3 }' $llvm_config_path`
3258    fi  
3260    if test "x$llvm_api_version" = "x"; then
3261           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=0"
3262           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=0"
3263    else
3264           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3265           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3266    fi   
3268    AC_DEFINE_UNQUOTED(LLVM_VERSION, "$llvm_version", [Full version of LLVM libraries])
3270    AC_SUBST(LLVM_CFLAGS)
3271    AC_SUBST(LLVM_CXXFLAGS)
3272    AC_SUBST(LLVM_LIBS)
3273    AC_SUBST(LLVM_LDFLAGS)
3274    AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3277 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3278 if test "x$enable_loadedllvm" = "xyes"; then
3279    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3281 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3283 if test "x$enable_llvm" = "xyes"; then
3284    enable_llvm_runtime=yes
3286 if test "x$enable_llvm_runtime" = "xyes"; then
3287    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3289 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3291 TARGET="unknown"
3292 ACCESS_UNALIGNED="yes"
3294 LIBC="libc.so.6"
3295 INTL="libc.so.6"
3296 SQLITE="libsqlite.so.0"
3297 SQLITE3="libsqlite3.so.0"
3298 X11="libX11.so"
3299 GDKX11="libgdk-x11-2.0.so.0"
3300 GTKX11="libgtk-x11-2.0.so.0"
3301 XINERAMA="libXinerama.so.1"
3303 sizeof_register="SIZEOF_VOID_P"
3305 jit_wanted=true
3306 boehm_supported=true
3307 BTLS_SUPPORTED=no
3308 BTLS_PLATFORM=
3310 if test "x$enable_wasm" = "xyes"; then
3311 TARGET=WASM
3312 HOST=WASM
3313 arch_target=wasm
3314 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
3315 AC_DEFINE(HOST_WASM, 1, [Host wasm])
3316 BTLS_SUPPORTED=no
3317 with_tls=pthread
3318 target_mach=no
3320 else
3322 case "$host" in
3323         mips*)
3324                 TARGET=MIPS;
3325                 arch_target=mips;
3326                 with_tls=pthread;
3327                 ACCESS_UNALIGNED="no"
3329                 AC_MSG_CHECKING(for mips n32)
3330                 AC_TRY_COMPILE([],[
3331                 #if _MIPS_SIM != _ABIN32
3332                 #error Not mips n32
3333                 #endif
3334                 ],[
3335                 AC_MSG_RESULT(yes)
3336                 sizeof_register=8
3337                 ],[
3338                 AC_MSG_RESULT(no)
3339                 ])
3340                 ;;
3341         i*86-*-*)
3342                 TARGET=X86;
3343                 arch_target=x86;
3344                 case $host_os in
3345                   solaris*)
3346                         LIBC="libc.so"
3347                         INTL="libintl.so"
3348                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3349                                 TARGET=AMD64
3350                                 arch_target=amd64
3351                         fi
3353                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3354                         # int astruct __attribute__ ((visibility ("hidden")));
3355                         # void foo ()
3356                         # {
3357                         #       void *p = &astruct;
3358                         # }
3359                         # gcc -fPIC --shared -o libfoo.so foo.c
3360                         # yields:
3361                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3362                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3363                         have_visibility_hidden=no
3364                         ;;
3365                   mingw*|cygwin*)
3366                         have_visibility_hidden=no                 
3367                         ;;
3368                   haiku*)
3369                         LIBC=libroot.so
3370                         ;;
3371                   linux*)
3372                         AOT_SUPPORTED="yes"
3373                         BTLS_SUPPORTED=yes
3374                         BTLS_PLATFORM=i386
3375                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3376                         ;;
3377                   darwin*)
3378                         AOT_SUPPORTED="yes"
3379                         BTLS_SUPPORTED=yes
3380                         BTLS_PLATFORM=i386
3381                         ;;
3382                   openbsd*|freebsd*|kfreebsd-gnu*)
3383                         AOT_SUPPORTED="yes"
3384                         BTLS_SUPPORTED=yes
3385                         BTLS_PLATFORM=i386
3386                         ;;
3387                 esac
3388                 ;;
3389         x86_64-*-* | amd64-*-*)
3390                 TARGET=AMD64;
3391                 arch_target=amd64;
3392                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3393                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3394                         sizeof_register=8
3395                 fi
3396                 case $host_os in
3397                   linux*)
3398                         AOT_SUPPORTED="yes"
3399                         BTLS_SUPPORTED=yes
3400                         BTLS_PLATFORM=x86_64
3401                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3402                         ;;
3403                   darwin*)
3404                         AOT_SUPPORTED="yes"
3405                         BTLS_SUPPORTED=yes
3406                         BTLS_PLATFORM=x86_64
3407                         boehm_supported=false
3408                         ;;
3409                   openbsd*|freebsd*|kfreebsd-gnu*)
3410                         AOT_SUPPORTED="yes"
3411                         BTLS_SUPPORTED=yes
3412                         BTLS_PLATFORM=x86_64
3413                         ;;
3414                   mingw*)
3415                         ;;
3416                 esac
3417                 ;;
3418         sparc*-*-*)
3419                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3420                    TARGET=SPARC64
3421                 else
3422                         TARGET=SPARC
3423                 fi
3424                 arch_target=sparc;
3425                 ACCESS_UNALIGNED="no"
3426                 case $host_os in
3427                   linux*) ;;
3428                   *)
3429                         LIBC="libc.so"
3430                         INTL="libintl.so"
3431                 esac
3432                 if test x"$GCC" = xyes; then
3433                         # We don't support v8 cpus
3434                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3435                 fi
3436                 if test x"$AR" = xfalse; then
3437                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3438                 fi
3439                 ;;
3440         *-mingw*|*-*-cygwin*)
3441                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3442                 have_visibility_hidden=no
3443                 INTL="intl"
3444                 ;;
3445         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3446         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3447         powerpc-*-freebsd* | powerpc-*-aix* | powerpc-*-os400* )
3448                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3449                         TARGET=POWERPC64;
3450                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3451                         CFLAGS="$CFLAGS -mminimal-toc"
3452                 else
3453                         TARGET=POWERPC;
3454                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3455                 fi
3456                 arch_target=ppc;
3457                 case $host_os in
3458                   aix*|os400*)
3459                         dnl on AIX/PASE, shared libraries can be inside archives
3460                         dnl if they are, we specify them by lib.a(lib.so)
3461                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
3462                         LIBC="libc.a(shr_64.o)"
3463                         INTL="libintl.a(libintl.so.9)"
3464                         ;;
3465                   linux*|darwin*)
3466                         ;;
3467                 esac
3468                 ;;
3469         armv7k-*-darwin*)
3470                 TARGET=ARM;
3471                 TARGET_SYS=WATCHOS
3472                 arch_target=arm;
3473                 arm_fpu=VFP_HARD
3474                 ACCESS_UNALIGNED="no"
3475                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3476                 ;;
3478         arm*-darwin*)
3479                 TARGET=ARM;
3480                 arch_target=arm;
3481                 ACCESS_UNALIGNED="no"
3482                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3483                 ;;
3484         arm*-linux*)
3485                 TARGET=ARM;
3486                 arch_target=arm;
3487                 ACCESS_UNALIGNED="no"
3488                 AOT_SUPPORTED="yes"
3489                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3490                 BTLS_SUPPORTED=yes
3491                 BTLS_PLATFORM=arm
3492                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3493                 case "$target" in
3494                 arm*-linux*-gnueabi)
3495                         BTLS_PLATFORM=armsoft
3496                         ;;
3497                 esac
3498                 ;;
3499         arm*-netbsd*-eabi*)
3500                 TARGET=ARM;
3501                 arch_target=arm;
3502                 ACCESS_UNALIGNED="no"
3503                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3504                 ;;
3505         aarch64-*)
3506                 # https://lkml.org/lkml/2012/7/15/133
3507                 TARGET=ARM64
3508                 arch_target=arm64
3509                 boehm_supported=false
3510                 AOT_SUPPORTED="yes"
3511                 BTLS_SUPPORTED=yes
3512                 BTLS_PLATFORM=aarch64
3513                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3514                 ;;
3515         s390x-*-linux*)
3516                 TARGET=S390X;
3517                 arch_target=s390x;
3518                 ACCESS_UNALIGNED="yes"
3519                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
3520                 ;;
3521 esac
3523 HOST=$TARGET
3525 if test "x$host" != "x$target"; then
3526    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
3527    enable_mcs_build=no
3528    enable_support_build=no
3529    BTLS_SUPPORTED=no
3530    case "$target" in
3531    arm*-darwin*)
3532                 TARGET=ARM;
3533                 arch_target=arm;
3534                 ACCESS_UNALIGNED="no"
3535                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3536                 # Can't use tls, since it depends on the runtime detection of tls offsets
3537                 # in mono-compiler.h
3538                 with_tls=pthread
3539                 case "$target" in
3540                 armv7k-*)
3541                         arm_fpu=VFP_HARD
3542                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
3543                         ;;
3544                 esac            
3545                 ;;
3546    powerpc64-ps3-linux-gnu)
3547                 TARGET=POWERPC64
3548                 arch_target=powerpc64
3549                 AC_DEFINE(TARGET_PS3, 1, [...])
3550                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3551                 # uses this define
3552                 AC_DEFINE(__mono_ppc64__, 1, [...])
3553                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3554                 sizeof_register=8
3555                 target_byte_order=G_BIG_ENDIAN
3556                 ;;
3557    powerpc64-xbox360-linux-gnu)
3558                 TARGET=POWERPC64
3559                 arch_target=powerpc64
3560                 AC_DEFINE(TARGET_XBOX360, 1, [...])
3561                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3562                 # uses this define
3563                 sizeof_register=8
3564                 target_byte_order=G_BIG_ENDIAN
3565                 ;;
3566    arm*-linux-*)
3567                 TARGET=ARM;
3568                 arch_target=arm;
3569                 AC_DEFINE(TARGET_ARM, 1, [...])
3570                 ACCESS_UNALIGNED="no"
3571                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3572                 # Can't use tls, since it depends on the runtime detection of tls offsets
3573                 # in mono-compiler.h
3574                 with_tls=pthread
3575                 target_mach=no
3576                 case "$target" in
3577                 armv7l-unknown-linux-gnueabi*)
3578                         # TEGRA
3579                         CPPFLAGS="$CPPFLAGS"
3580                         ;;
3581                 armv5-*-linux-androideabi*)
3582                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3583                         CPPFLAGS="$CPPFLAGS"
3584                         ;;
3585                 *-linux-androideabi*)
3586                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3587                         CPPFLAGS="$CPPFLAGS"
3588                         ;;
3589                 esac
3590                 ;;
3591    arm*-netbsd*-eabi*)
3592                 TARGET=ARM;
3593                 arch_target=arm;
3594                 AC_DEFINE(TARGET_ARM, 1, [...])
3595                 ACCESS_UNALIGNED="no"
3596                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3597                 # Can't use tls, since it depends on the runtime detection of tls offsets
3598                 # in mono-compiler.h
3599                 with_tls=pthread
3600                 target_mach=no
3601                 ;;
3602    i686*-linux-*)
3603                 TARGET=X86;
3604                 arch_target=x86;
3605                 AC_DEFINE(TARGET_X86, 1, [...])
3606                 CPPFLAGS="$CPPFLAGS"
3607                 # Can't use tls, since it depends on the runtime detection of tls offsets
3608                 # in mono-compiler.h            
3609                 with_tls=pthread
3610                 target_mach=no
3612                 case "$target" in
3613                 *-linux-android*)
3614                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3615                         ;;
3616                 esac
3617                 ;;
3618    x86_64*-linux-*)
3619                 TARGET=AMD64;
3620                 arch_target=amd64;
3621                 AC_DEFINE(TARGET_AMD64, 1, [...])
3622                 CPPFLAGS="$CPPFLAGS"
3623                 # Can't use tls, since it depends on the runtime detection of tls offsets
3624                 # in mono-compiler.h
3625                 with_tls=pthread
3626                 target_mach=no
3628                 case "$target" in
3629                 *-linux-android*)
3630                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3631                         ;;
3632                 esac
3633                 ;;
3634    x86_64-ps4-freebsd)
3635                 TARGET=AMD64;
3636                 arch_target=amd64;
3637                 AC_DEFINE(TARGET_AMD64, 1, [...])
3638                 AC_DEFINE(TARGET_PS4, 1, [...])
3639                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
3640                 CPPFLAGS="$CPPFLAGS"
3641                 # Can't use tls, since it depends on the runtime detection of tls offsets
3642                 # in mono-compiler.h
3643                 with_tls=pthread
3644                 target_mach=no
3645                 target_win32=no
3646                 ;;
3647    aarch64*-linux-*)
3648                 TARGET=ARM64;
3649                 arch_target=arm64;
3650                 AC_DEFINE(TARGET_ARM64, 1, [...])
3651                 CPPFLAGS="$CPPFLAGS"
3652                 # Can't use tls, since it depends on the runtime detection of tls offsets
3653                 # in mono-compiler.h
3654                 with_tls=pthread
3655                 target_mach=no
3656                 case "$target" in
3657                 *-linux-android*)
3658                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3659                         ;;
3660                 esac
3661                 ;;
3662         aarch64-*)
3663                 TARGET=ARM64
3664                 ;;
3665         *)
3666                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
3667         esac
3670 case "$TARGET" in
3671 X86)
3672         AC_DEFINE(TARGET_X86, 1, [...])
3673         ;;
3674 AMD64)
3675         AC_DEFINE(TARGET_AMD64, 1, [...])
3676         ;;
3677 ARM)
3678         AC_DEFINE(TARGET_ARM, 1, [...])
3679         ;;
3680 ARM64)
3681         AC_DEFINE(TARGET_ARM64, 1, [...])
3682         ;;
3683 POWERPC)
3684         AC_DEFINE(TARGET_POWERPC, 1, [...])
3685         ;;
3686 POWERPC64)
3687         AC_DEFINE(TARGET_POWERPC, 1, [...])
3688         AC_DEFINE(TARGET_POWERPC64, 1, [...])
3689         ;;
3690 S390X)
3691         AC_DEFINE(TARGET_S390X, 1, [...])
3692         ;;
3693 MIPS)
3694         AC_DEFINE(TARGET_MIPS, 1, [...])
3695         ;;
3696 SPARC)
3697         AC_DEFINE(TARGET_SPARC, 1, [...])
3698         ;;
3699 SPARC64)
3700         AC_DEFINE(TARGET_SPARC64, 1, [...])
3701         ;;
3702 esac
3704 case "$HOST" in
3705 X86)
3706         AC_DEFINE(HOST_X86, 1, [...])
3707         ;;
3708 AMD64)
3709         AC_DEFINE(HOST_AMD64, 1, [...])
3710         ;;
3711 ARM)
3712         AC_DEFINE(HOST_ARM, 1, [...])
3713         ;;
3714 ARM64)
3715         AC_DEFINE(HOST_ARM64, 1, [...])
3716         ;;
3717 POWERPC)
3718         AC_DEFINE(HOST_POWERPC, 1, [...])
3719         ;;
3720 POWERPC64)
3721         AC_DEFINE(HOST_POWERPC, 1, [...])
3722         AC_DEFINE(HOST_POWERPC64, 1, [...])
3723         ;;
3724 S390X)
3725         AC_DEFINE(HOST_S390X, 1, [...])
3726         ;;
3727 MIPS)
3728         AC_DEFINE(HOST_MIPS, 1, [...])
3729         ;;
3730 SPARC)
3731         AC_DEFINE(HOST_SPARC, 1, [...])
3732         ;;
3733 SPARC64)
3734         AC_DEFINE(HOST_SPARC64, 1, [...])
3735         ;;
3736 esac
3738 #WASM hack
3742 dnl *************
3743 dnl *** VTUNE ***
3744 dnl *************
3746 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
3747 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
3749 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
3751 if test "x$enable_vtune" = "xyes"; then
3752         if test "x$with_vtune" = "x"; then
3753                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
3754         else
3755                 VTUNE_PATH=$with_vtune
3756         fi
3757         VTUNE_INCLUDE=$VTUNE_PATH/include
3758         case "$TARGET" in
3759         X86)
3760                 VTUNE_LIB=$VTUNE_PATH/lib32
3761                 ;;
3762         AMD64)
3763                 VTUNE_LIB=$VTUNE_PATH/lib64
3764                 ;;
3765         *)
3766                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
3767                 ;;
3768         esac
3769         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
3770                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
3771         fi
3772         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
3773                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
3774         fi
3776         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
3777         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
3779         AC_SUBST(VTUNE_LIBS)
3780         AC_SUBST(VTUNE_CFLAGS)
3782 dnl Use GCC atomic ops if they work on the target.
3783 if test x$GCC = "xyes"; then
3784         case $TARGET in
3785         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
3786                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
3787                 ;;
3788         esac
3791 if test "x$target_mach" = "xyes"; then
3793    if test "x$TARGET_SYS" = "xWATCHOS"; then
3794           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
3795           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3796           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3797           BTLS_SUPPORTED=no
3798    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
3799           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3800           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3801           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3802           BTLS_SUPPORTED=no
3803    else
3804        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
3805        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
3806        #error fail this for ios
3807        #endif
3808        ], [
3809                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
3810           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
3811           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
3812           target_osx=yes
3813        ], [
3814           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3815           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3816           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3817           BTLS_SUPPORTED=no
3818                   target_ios=yes
3819        ])
3820         fi
3821    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
3824 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
3826 if test "x$sizeof_register" = "x4"; then
3827    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
3828 elif test "x$sizeof_register" = "x8"; then
3829    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
3830 else
3831    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
3834 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
3836 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
3837    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
3838 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
3839    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
3840 else
3841    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
3844 if test "x$have_visibility_hidden" = "xyes"; then
3845    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
3848 if test "x$have_deprecated" = "xyes"; then
3849    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
3852 dnl 
3853 dnl Simple Generational checks (sgen)
3855 SGEN_DEFINES=
3856 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
3857 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
3858 if test x$buildsgen = xyes; then
3859    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
3860    SGEN_DEFINES="-DHAVE_SGEN_GC"
3862         conc_gc_msg=""
3863    if test x$with_sgen_default_concurrent != xno; then
3864        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
3865            conc_gc_msg=" (concurrent by default)"
3866    fi
3868    if test "x$gc_msg" = "x"; then
3869       gc_msg="sgen$conc_gc_msg"
3870    else
3871       gc_msg="sgen$conc_gc_msg and $gc_msg"
3872    fi
3874 AC_SUBST(SGEN_DEFINES)
3875 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
3877 jit_status="Building and using the JIT"
3879 libsuffix=".so"
3881 case "$host" in
3882      *-*-darwin*)
3883         libsuffix=".dylib"
3884         LIBC="libc.dylib"
3885         INTL="libintl.dylib"
3886         SQLITE="libsqlite.0.dylib"
3887         SQLITE3="libsqlite3.0.dylib"
3888         X11="libX11.dylib"
3889         GDKX11="libgdk-x11-2.0.dylib"
3890         GTKX11="libgtk-x11-2.0.dylib"
3891         ;;
3892      *-*-*netbsd*)
3893         LIBC="libc.so"
3894         INTL="libintl.so"
3895         SQLITE="libsqlite.so"
3896         SQLITE3="libsqlite3.so"
3897         ;;
3898      *-*-kfreebsd*-gnu)
3899         LIBC="libc.so.0.1"
3900         INTL="libc.so.0.1"
3901         X11="libX11.so.6"
3902         ;;
3903     *-*-*freebsd*)
3904         LIBC="libc.so.7"
3905         INTL="libintl.so"
3906         SQLITE="libsqlite.so"
3907         SQLITE3="libsqlite3.so"
3908         ;;
3909     *-*-*openbsd*)
3910         LIBC="libc.so"
3911         INTL="libintl.so"
3912         SQLITE="libsqlite.so"
3913         SQLITE3="libsqlite3.so"
3914         ;;
3915     *-*-*linux*)
3916         AC_PATH_X
3917         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
3918         AC_MSG_CHECKING(for the soname of libX11.so)
3919         for i in $x_libraries $dlsearch_path; do
3920                 for r in 4 5 6; do
3921                         if test -f $i/libX11.so.$r; then
3922                                 X11=libX11.so.$r
3923                                 AC_MSG_RESULT($X11)
3924                         fi
3925                 done
3926         done
3927         
3928         if test "x$X11" = "xlibX11.so"; then
3929                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
3930                 X11=libX11.so.6
3931         fi
3932         ;;
3933 esac
3935 AC_SUBST(libsuffix)
3937 ######################################
3938 # EGLIB CHECKS
3939 ######################################
3941 GNUC_PRETTY=
3942 GNUC_UNUSED=
3943 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
3944 if test x$GCC = xyes; then
3945    GNUC_UNUSED='__attribute__((__unused__))'
3946    GNUC_NORETURN='__attribute__((__noreturn__))'
3947    case $host_cpu in
3948      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
3949    esac
3951 AC_SUBST(GNUC_PRETTY)
3952 AC_SUBST(GNUC_UNUSED)
3953 AC_SUBST(GNUC_NORETURN)
3954 AC_SUBST(BREAKPOINT)
3956 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
3958 case $host in
3959 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
3960     PATHSEP='\\'
3961     SEARCHSEP=';'
3962     OS="WIN32"
3963     PIDTYPE='void *'
3964     ;;
3966     PATHSEP='/'
3967     SEARCHSEP=':'
3968     OS="UNIX"
3969     PIDTYPE='int'
3970     ;;
3971 esac
3973 case $host in
3974         *-*-solaris*)
3975         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
3976         ;;
3977 esac
3979 case $target in
3980 arm*-darwin*|aarch64*-*)
3981     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
3982     ;;
3983 i*86-*-darwin*)
3984     ORDER=G_LITTLE_ENDIAN
3985     ;;
3986 *-*-haiku*)
3987     LDFLAGS="$LDFLAGS -ltextencoding"
3988     ;;
3989 *-*-openbsd*)
3990     CFLAGS="$CFLAGS -pthread"
3991     LDFLAGS="$LDFLAGS -pthread"
3992     ;;
3993 esac
3995 AC_SUBST(ORDER)
3996 AC_SUBST(CFLAGS)
3997 AC_SUBST(PATHSEP)
3998 AC_SUBST(SEARCHSEP)
3999 AC_SUBST(OS)
4000 AC_SUBST(PIDTYPE)
4002 # Defined for all targets/platforms using classic Windows API support.
4003 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4004 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4006 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf strerror_r)
4007 AC_CHECK_FUNCS(getrlimit)
4008 AC_CHECK_FUNCS(fork execv execve)
4010 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4012 if test x$with_overridable_allocators = xyes; then
4013         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4014   AC_MSG_NOTICE([Overridable allocator support enabled])
4015 else
4016   AC_MSG_NOTICE([Overridable allocator support disabled])
4020 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4021 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4022 # removed once support for 10.6 is dropped.
4024 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4026 if test x$target_osx = xyes; then
4027 AC_CHECK_FUNCS(getpwuid_r)
4028 elif test x$target_ios = xno; then
4029 AC_CHECK_FUNCS(strndup getpwuid_r)
4032 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4033 AM_ICONV()
4034 AC_SEARCH_LIBS(sqrtf, m)
4036 # nanosleep may not be part of libc, also search it in other libraries
4037 AC_SEARCH_LIBS(nanosleep, rt)
4039 AC_SEARCH_LIBS(dlopen, dl)
4040 old_ldflags="${LDFLAGS}"
4041 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4042 if test $lt_cv_prog_gnu_ld = yes; then
4043         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4044 else
4045         case $host in
4046         *-*-aix*|*-*-os400*)
4047                 ;;
4048         *)
4049                 dnl Try to use export-dynamic anyways
4050                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4051                 ;;
4052         esac
4054 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4055 if test $found_export_dynamic = no; then
4056         LDFLAGS="${old_ldflags}"
4059 AC_MSG_CHECKING(for varargs macros)
4060 AC_TRY_COMPILE([],[
4061 int foo (int i, int j);
4062 #define bar(...) foo (1, __VA_ARGS__)
4063 void main () {
4064          bar (2);
4066 ],have_iso_varargs=yes,have_iso_varargs=no)
4067 AC_MSG_RESULT($have_iso_varargs)
4068 G_HAVE_ISO_VARARGS=0
4069 if test "x$have_iso_varargs" = "xyes"; then
4070    G_HAVE_ISO_VARARGS=1
4072 AC_SUBST(G_HAVE_ISO_VARARGS)
4074 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)
4075 AC_CHECK_LIB([iconv], [locale_charset],[],[AC_CHECK_LIB([charset], [locale_charset],[LIBS+=" -liconv -lcharset"])])
4076 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4077 AC_SUBST(HAVE_ALLOCA_H)
4079 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_int; then
4080    GPOINTER_TO_INT="((gint) (ptr))"
4081    GPOINTER_TO_UINT="((guint) (ptr))"
4082    GINT_TO_POINTER="((gpointer) (v))"
4083    GUINT_TO_POINTER="((gpointer) (v))"
4084    GSIZE="int"
4085    GSIZE_FORMAT='"u"'
4086 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long; then
4087    GPOINTER_TO_INT="((gint)(long) (ptr))"
4088    GPOINTER_TO_UINT="((guint)(long) (ptr))"
4089    GINT_TO_POINTER="((gpointer)(glong) (v))"
4090    GUINT_TO_POINTER="((gpointer)(gulong) (v))"
4091    GSIZE="long"
4092    GSIZE_FORMAT='"lu"'
4093 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long_long; then
4094    GPOINTER_TO_INT="((gint)(long long) (ptr))"
4095    GPOINTER_TO_UINT="((guint)(unsigned long long) (ptr))"
4096    GINT_TO_POINTER="((gpointer)(long long) (v))"
4097    GUINT_TO_POINTER="((gpointer)(unsigned long long) (v))"
4098    GSIZE="long long"
4099    GSIZE_FORMAT='"I64u"'
4100 else
4101    AC_MSG_ERROR([unsupported pointer size])
4104 AC_SUBST(GPOINTER_TO_INT)
4105 AC_SUBST(GPOINTER_TO_UINT)
4106 AC_SUBST(GINT_TO_POINTER)
4107 AC_SUBST(GUINT_TO_POINTER)
4108 AC_SUBST(GSIZE)
4109 AC_SUBST(GSIZE_FORMAT)
4110 AC_SUBST(G_GUINT64_FORMAT)
4111 AC_SUBST(G_GINT64_FORMAT)
4112 AC_SUBST(G_GUINT32_FORMAT)
4113 AC_SUBST(G_GINT32_FORMAT)
4116 # END OF EGLIB CHECKS
4119 AC_ARG_WITH([libgdiplus],
4120         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4121         [], [with_libgdiplus=installed])
4123 # default install location
4124 libgdiplus_install_loc=libgdiplus${libsuffix}
4125 case "$host" in
4126     *-*-*linux*)
4127     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4128     ;;
4129 esac
4131 case $with_libgdiplus in
4132     no)
4133     libgdiplus_loc=
4134     ;;
4136     installed)
4137     libgdiplus_loc=
4138     if test x$cross_compiling = xno; then
4139         if test x$host_darwin = xyes; then
4140             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4141             if test -x $a; then
4142               libgdiplus_install_loc=$a
4143               libgdiplus_loc=$a
4144             fi
4145         fi
4146     fi
4147     ;;
4149     yes|sibling)
4150     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4151     ;;
4153     /*) # absolute path, assume it is an install location
4154     libgdiplus_loc=$with_libgdiplus
4155     libgdiplus_install_loc=$with_libgdiplus
4156     ;;
4158     *)
4159     libgdiplus_loc=`pwd`/$with_libgdiplus
4160     ;;
4161 esac
4162 AC_SUBST(libgdiplus_loc)
4163 AC_SUBST(libgdiplus_install_loc)
4165 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)
4166 if test "x$icall_symbol_map" = "xyes"; then
4167    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4170 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4171 if test "x$icall_export" = "xyes"; then
4172    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4175 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4176 if test "x$icall_tables" = "xno"; then
4177    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4180 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4182 if test "x$with_tls" = "x__thread"; then
4183         AC_DEFINE(HAVE_KW_THREAD, 1, [Have __thread keyword])
4184         # Pass the information to libgc
4185         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4186         AC_MSG_CHECKING(if the tls_model attribute is supported)
4187         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4188                 ], [
4189                         AC_MSG_RESULT(yes)
4190                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4191                 ], [
4192                         AC_MSG_RESULT(no)
4193         ])
4196 if test ${TARGET} = ARM; then
4197         dnl ******************************************
4198         dnl *** Check to see what FPU is available ***
4199         dnl ******************************************
4200         AC_MSG_CHECKING(which FPU to use)
4202         #
4203         # This is a bit tricky:
4204         #
4205         # if (__ARM_PCS_VFP) {
4206         #       /* mfloat-abi=hard == VFP with hard ABI */
4207         # } elif (!__SOFTFP__) {
4208         #       /* mfloat-abi=softfp == VFP with soft ABI */
4209         # } else {
4210         #       /* mfloat-abi=soft == no VFP */
4211         # }
4212         #
4213         # The exception is iOS (w/ GCC) where none of the above
4214         # are defined (but iOS always uses the 'softfp' ABI).
4215         #
4216         # No support for FPA.
4217         #
4219         fpu=NONE
4221         # iOS GCC always uses the 'softfp' ABI.
4222         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4223                 fpu=VFP
4224         fi
4226         # Are we using the 'hard' ABI?
4227         if test x$fpu = xNONE; then
4228                 AC_TRY_COMPILE([], [
4229                         #ifndef __ARM_PCS_VFP
4230                         #error "Float ABI is not 'hard'"
4231                         #endif
4232                 ], [
4233                         fpu=VFP_HARD
4234                 ], [
4235                         fpu=NONE
4236                 ])
4237         fi
4239         # No 'hard' ABI. 'soft' or 'softfp'?
4240         if test x$fpu = xNONE; then
4241                 AC_TRY_COMPILE([], [
4242                         #ifdef __SOFTFP__
4243                         #error "Float ABI is not 'softfp'"
4244                         #endif
4245                 ], [
4246                         fpu=VFP
4247                 ], [
4248                         fpu=NONE
4249                 ])
4250         fi
4252         if test x$arm_fpu != x; then
4253            fpu=$arm_fpu
4254         fi
4256         AC_MSG_RESULT($fpu)
4257         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4258         unset fpu
4260         dnl *********************************************
4261         dnl *** Check which ARM version(s) we can use ***
4262         dnl *********************************************
4263         AC_MSG_CHECKING(which ARM version to use)
4265         AC_TRY_COMPILE([], [
4266                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4267                 #error Not on ARM v5.
4268                 #endif
4269         ], [
4270                 arm_v5=yes
4272                 arm_ver=ARMv5
4273         ], [])
4275         AC_TRY_COMPILE([], [
4276                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4277                 #error Not on ARM v6.
4278                 #endif
4279         ], [
4280                 arm_v5=yes
4281                 arm_v6=yes
4283                 arm_ver=ARMv6
4284         ], [])
4286         AC_TRY_COMPILE([], [
4287                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4288                 #error Not on ARM v7.
4289                 #endif
4290         ], [
4291                 arm_v5=yes
4292                 arm_v6=yes
4293                 arm_v7=yes
4295                 arm_ver=ARMv7
4296         ], [])
4298         AC_MSG_RESULT($arm_ver)
4300         if test x$arm_v5 = xyes; then
4301                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4302                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4303         fi
4305         if test x$arm_v6 = xyes; then
4306                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4307                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4308         fi
4310         if test x$arm_v7 = xyes; then
4311                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4312                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4313         fi
4316 if test ${TARGET} = unknown; then
4317         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4318         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4321 if test "x$platform_android" = "xyes"; then
4322         case "x${TARGET}" in
4323         xARM)
4324                 case "x$arm_ver" in
4325                 xARMv5)
4326                         BTLS_SUPPORTED=yes
4327                         BTLS_PLATFORM=android-armv5
4328                         ;;
4329                 xARMv6)
4330                         BTLS_SUPPORTED=yes
4331                         BTLS_PLATFORM=android-armv6
4332                         ;;
4333                 xARMv7)
4334                         BTLS_SUPPORTED=yes
4335                         BTLS_PLATFORM=android-armv7
4336                         ;;
4337                 *)
4338                         BTLS_SUPPORTED=no
4339                         ;;
4340                 esac
4341                 ;;
4342         xARM64)
4343                 BTLS_SUPPORTED=yes
4344                 BTLS_PLATFORM=android-v8a
4345                 ;;
4346         xX86)
4347                 BTLS_SUPPORTED=yes
4348                 BTLS_PLATFORM=android-x86
4349                 ;;
4350         xAMD64)
4351                 BTLS_SUPPORTED=yes
4352                 BTLS_PLATFORM=android-x64
4353                 ;;
4354         *)
4355                 BTLS_SUPPORTED=no
4356                 ;;
4357         esac
4360 if test ${ACCESS_UNALIGNED} = no; then
4361         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4364 if test x$host_darwin = xyes; then
4365         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4366         AS_IF(
4367                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4368                 [AC_MSG_RESULT([no])],
4369                 [
4370                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4371                         AR_FLAGS="Scru"
4372                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4373                         AC_MSG_RESULT([yes])
4374                 ]
4375         )
4378 case "x$libgc" in
4379         xincluded)
4380                 # Pass CPPFLAGS to libgc configure
4381                 # We should use a separate variable for this to avoid passing useless and
4382                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4383                 # This should be executed late so we pick up the final version of CPPFLAGS
4384                 # The problem with this approach, is that during a reconfigure, the main
4385                 # configure scripts gets invoked with these arguments, so we use separate
4386                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4387                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4388                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4389                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4390                 fi
4391                 # Don't pass -finstrument-for-thread-suspension in, 
4392                 # if these are instrumented it will be very bad news 
4393                 # (infinite recursion, undefined parking behavior, etc)
4394                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4395                 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\""
4396                 if test "x$support_boehm" = "xyes"; then
4397                         AC_CONFIG_SUBDIRS(libgc)
4398                 fi
4399                 ;;
4400 esac
4402 MALLOC_MEMPOOLS=no
4403 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4404         if test x$with_malloc_mempools = xyes; then
4405                 MALLOC_MEMPOOLS=yes
4406                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4407         fi
4411 DISABLE_MCS_DOCS=default
4412 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4413         if test x$with_mcs_docs != xyes; then
4414                 DISABLE_MCS_DOCS=yes
4415         fi
4417 if test -n "$INSTALL_4_x_TRUE"; then :
4418         DISABLE_MCS_DOCS=yes
4420 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4421    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4424 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)],[
4425         if test x$with_lazy_gc_thread_creation != xno ; then
4426                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4427         fi
4428 ], [with_lazy_gc_thread_creation=no])
4430 AC_ARG_WITH(cooperative_gc, [  --with-cooperative-gc=yes|no      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [with_cooperative_gc=default])
4432 if test x$with_cooperative_gc = xdefault; then
4433         with_cooperative_gc=$with_cooperative_gc_default
4436 if test x$with_cooperative_gc != xno; then
4437         AC_DEFINE(USE_COOP_GC,1,[Enable cooperative stop-the-world garbage collection.])
4440 AM_CONDITIONAL([ENABLE_COOP], [test x$with_cooperative_gc != xno])
4442 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],[
4444         if test x$enable_checked_build != x ; then
4445                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
4446         fi
4447         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
4448                 eval "mono_checked_build_test_enable_$feature='yes'"
4449         done
4451         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
4452                 eval "mono_checked_build_test_enable_gc='yes'"
4453                 eval "mono_checked_build_test_enable_metadata='yes'"
4454                 eval "mono_checked_build_test_enable_thread='yes'"
4455                 eval "mono_checked_build_test_enable_private_types='yes'"
4456         fi
4458         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
4459                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
4460         fi
4462         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
4463                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
4464         fi
4466         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
4467                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
4468         fi
4470         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
4471                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
4472         fi
4473 ], [])
4475 AC_CHECK_HEADER([malloc.h], 
4476                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
4477                         [Define to 1 if you have /usr/include/malloc.h.])],,)
4479 if test x"$GCC" = xyes; then
4480         # Implicit function declarations are not 64 bit safe
4481         # Do this late, since this causes lots of configure tests to fail
4482         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
4483         # jay has a lot of implicit declarations
4484         JAY_CFLAGS="-Wno-implicit-function-declaration"
4487 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
4488 # instead of libmono-static.a
4489 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
4490    LIBMONO_LA=libmini-static.la
4491 else
4492    if test x$buildsgen = xyes; then
4493       LIBMONO_LA=libmonosgen-$API_VER.la
4494    else
4495       LIBMONO_LA=libmonoboehm-$API_VER.la
4496    fi
4498 AC_SUBST(LIBMONO_LA)
4500 dnl **************
4501 dnl ***  Btls  ***
4502 dnl **************
4504 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
4505 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
4507 AM_CONDITIONAL(BTLS, test x$enable_btls = xyes)
4509 btls_android=no
4510 if test "x$enable_btls" = "xyes"; then
4511         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
4512         if test "x$CMAKE" = "xno"; then
4513                 AC_MSG_ERROR("cmake not found")
4514         fi
4516         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
4517         AC_SUBST(BTLS_ROOT)
4519         btls_arch=
4520         btls_cflags=
4521         BTLS_CMAKE_ARGS=
4523         case "$BTLS_PLATFORM" in
4524         i386)
4525                 btls_arch=i386
4526                 btls_cflags="-m32"
4527                 case $host_os in
4528                         darwin*)
4529                                 btls_cflags="$btls_cflags -arch i386"
4530                 esac
4531                 ;;
4532         x86_64)
4533                 btls_arch=x86_64
4534                 ;;
4535         arm)
4536                 btls_arch=arm
4537                 ;;
4538         armsoft)
4539                 btls_arch=arm
4540                 btls_cflags="-DOPENSSL_NO_ASM=1"
4541                 ;;
4542         aarch64)
4543                 btls_arch=aarch64
4544                 ;;
4545         android-armv5)
4546                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4547                 ;;
4548         android-armv6)
4549                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4550                 ;;
4551         android-armv7)
4552                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
4553                 ;;
4554         android-v8a)
4555                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
4556                 ;;
4557         android-x86)
4558                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
4559                 ;;
4560         android-x64)
4561                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
4562                 ;;
4563         *)
4564                 AC_MSG_ERROR(Invalid BTLS platform)
4565         esac
4567         if test "x$platform_android" = "xyes"; then
4568                 btls_android=yes
4569                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
4570                 if test "x$with_btls_android_ndk" != "x"; then
4571                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
4572                 else
4573                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
4574                 fi
4575         fi
4577         if test "x$btls_arch" != "x"; then
4578                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
4579         fi
4581         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
4582         AC_SUBST(BTLS_ARCH)
4583         AC_SUBST(BTLS_CFLAGS)
4584         AC_SUBST(BTLS_PLATFORM)
4585         AC_SUBST(BTLS_CMAKE_ARGS)
4587         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
4588 else
4589         enable_btls=no
4592 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
4594 if test x$DISABLE_MCS_DOCS = xyes; then
4595    docs_dir=""
4596 else
4597    docs_dir=docs
4599 AC_SUBST(docs_dir)
4601 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
4602 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
4603 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
4605 libmono_ldflags="$libmono_ldflags $LIBS"
4607 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
4608 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
4609 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
4610 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
4611 AM_CONDITIONAL(X86, test x$TARGET = xX86)
4612 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
4613 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
4614 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
4615 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
4616 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
4617 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
4618 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
4619 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
4620 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
4621 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
4622 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
4623 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
4624 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
4626 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
4628 AC_SUBST(LIBC)
4629 AC_SUBST(INTL)
4630 AC_SUBST(SQLITE)
4631 AC_SUBST(SQLITE3)
4632 AC_SUBST(X11)
4633 AC_SUBST(GDKX11)
4634 AC_SUBST(GTKX11)
4635 AC_SUBST(XINERAMA)
4636 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
4637 AC_SUBST(arch_target)
4638 AC_SUBST(CFLAGS)
4639 AC_SUBST(CPPFLAGS)
4640 AC_SUBST(LDFLAGS)
4642 #This must always be defined when building the runtime
4643 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
4645 mono_build_root=`pwd`
4646 AC_SUBST(mono_build_root)
4648 mono_runtime=mono/mini/mono
4649 AC_SUBST(mono_runtime)
4651 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.6.0/tools/csc.exe
4653 if test $csc_compiler = mcs; then
4654   CSC=$mcs_topdir/class/lib/build/mcs.exe
4655 else
4656   CSC=$CSC_LOCATION
4659 mono_cfg_root=$mono_build_root/runtime
4660 if test x$host_win32 = xyes; then
4661   if test "x$cross_compiling" = "xno"; then
4662     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
4663     CSC=`cygpath -m -a $CSC`
4664     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
4665   else
4666     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
4667   fi
4668 else
4669   mono_cfg_dir=$mono_cfg_root/etc
4671 AC_SUBST(mono_cfg_dir)
4673 AC_SUBST(CSC)
4675 AC_CONFIG_FILES([po/mcs/Makefile.in])
4677 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
4678 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
4680 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
4681 [   depth=../../../..
4682     case $srcdir in
4683     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4684     .) reldir=$depth ;;
4685     *) reldir=$depth/$srcdir ;;
4686     esac
4687     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
4688     cd runtime/etc/mono/1.0
4689     rm -f machine.config
4690     $LN_S $reldir/data/net_1_1/machine.config machine.config
4691     cd $depth
4692 ],[LN_S='$LN_S'])
4694 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
4695 [   depth=../../../..
4696     case $srcdir in
4697     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4698     .) reldir=$depth ;;
4699     *) reldir=$depth/$srcdir ;;
4700     esac
4701     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4702     cd runtime/etc/mono/2.0
4703     rm -f machine.config
4704     $LN_S $reldir/data/net_2_0/machine.config machine.config
4705     cd $depth
4706 ],[LN_S='$LN_S'])
4708 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
4709 [   depth=../../../..
4710     case $srcdir in
4711     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4712     .) reldir=$depth ;;
4713     *) reldir=$depth/$srcdir ;;
4714     esac
4715     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4716     cd runtime/etc/mono/2.0
4717     rm -f web.config
4718     $LN_S $reldir/data/net_2_0/web.config web.config
4719     cd $depth
4720 ],[LN_S='$LN_S'])
4722 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
4723 [   depth=../../..
4724     case $srcdir in
4725     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4726     .) reldir=$depth ;;
4727     *) reldir=$depth/$srcdir ;;
4728     esac
4729     $ac_aux_dir/install-sh -d runtime/etc/mono/
4730     cd runtime/etc/mono/
4731     rm -f browscap.ini
4732     $LN_S $reldir/data/browscap.ini browscap.ini
4733     cd $depth
4734 ],[LN_S='$LN_S'])
4736 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
4737 [   depth=../../../../..
4738     case $srcdir in
4739     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4740     .) reldir=$depth ;;
4741     *) reldir=$depth/$srcdir ;;
4742     esac
4743     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
4744     cd runtime/etc/mono/2.0/Browsers
4745     rm -f Compat.browser
4746     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4747     cd $depth
4748 ],[LN_S='$LN_S'])
4750 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
4751 [   depth=../../../../..
4752     case $srcdir in
4753     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4754     .) reldir=$depth ;;
4755     *) reldir=$depth/$srcdir ;;
4756     esac
4757     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
4758     cd runtime/etc/mono/4.0/Browsers
4759     rm -f Compat.browser
4760     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4761     cd $depth
4762 ],[LN_S='$LN_S'])
4764 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
4765 [   depth=../../../../..
4766     case $srcdir in
4767     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4768     .) reldir=$depth ;;
4769     *) reldir=$depth/$srcdir ;;
4770     esac
4771     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
4772     cd runtime/etc/mono/4.5/Browsers
4773     rm -f Compat.browser
4774     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4775     cd $depth
4776 ],[LN_S='$LN_S'])
4778 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
4779 [   depth=../../../..
4780     case $srcdir in
4781     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4782     .) reldir=$depth ;;
4783     *) reldir=$depth/$srcdir ;;
4784     esac
4785     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4786     cd runtime/etc/mono/4.0
4787     rm -f machine.config
4788     $LN_S $reldir/data/net_4_0/machine.config machine.config
4789     cd $depth
4790 ],[LN_S='$LN_S'])
4792 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
4793 [   depth=../../../..
4794     case $srcdir in
4795     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4796     .) reldir=$depth ;;
4797     *) reldir=$depth/$srcdir ;;
4798     esac
4799     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4800     cd runtime/etc/mono/4.0
4801     rm -f web.config
4802     $LN_S $reldir/data/net_4_0/web.config web.config
4803     cd $depth
4804 ],[LN_S='$LN_S'])
4806 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
4807 [   depth=../../../..
4808     case $srcdir in
4809     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4810     .) reldir=$depth ;;
4811     *) reldir=$depth/$srcdir ;;
4812     esac
4813     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4814     cd runtime/etc/mono/4.5
4815     rm -f machine.config
4816     $LN_S $reldir/data/net_4_5/machine.config machine.config
4817     cd $depth
4818 ],[LN_S='$LN_S'])
4820 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
4821 [   depth=../../../..
4822     case $srcdir in
4823     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4824     .) reldir=$depth ;;
4825     *) reldir=$depth/$srcdir ;;
4826     esac
4827     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4828     cd runtime/etc/mono/4.5
4829     rm -f web.config
4830     $LN_S $reldir/data/net_4_5/web.config web.config
4831     cd $depth
4832 ],[LN_S='$LN_S'])
4834 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])
4835 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])
4837 AC_OUTPUT([
4838 Makefile
4839 mono-uninstalled.pc
4840 acceptance-tests/Makefile
4841 llvm/Makefile
4842 scripts/mono-find-provides
4843 scripts/mono-find-requires
4844 mono/Makefile
4845 mono/btls/Makefile
4846 mono/utils/Makefile
4847 mono/utils/jemalloc/Makefile
4848 mono/metadata/Makefile
4849 mono/dis/Makefile
4850 mono/cil/Makefile
4851 mono/arch/Makefile
4852 mono/arch/x86/Makefile
4853 mono/arch/amd64/Makefile
4854 mono/arch/ppc/Makefile
4855 mono/arch/sparc/Makefile
4856 mono/arch/s390x/Makefile
4857 mono/arch/arm/Makefile
4858 mono/arch/arm64/Makefile
4859 mono/arch/mips/Makefile
4860 mono/sgen/Makefile
4861 mono/tests/Makefile
4862 mono/tests/tests-config
4863 mono/tests/gc-descriptors/Makefile
4864 mono/tests/testing_gac/Makefile
4865 mono/unit-tests/Makefile
4866 mono/benchmark/Makefile
4867 mono/mini/Makefile
4868 mono/profiler/Makefile
4869 mono/eglib/Makefile
4870 mono/eglib/eglib-config.h
4871 m4/Makefile
4872 ikvm-native/Makefile
4873 scripts/Makefile
4874 man/Makefile
4875 docs/Makefile
4876 data/Makefile
4877 data/net_2_0/Makefile
4878 data/net_4_0/Makefile
4879 data/net_4_5/Makefile
4880 data/net_2_0/Browsers/Makefile
4881 data/net_4_0/Browsers/Makefile
4882 data/net_4_5/Browsers/Makefile
4883 data/mint.pc
4884 data/mono-2.pc
4885 data/monosgen-2.pc
4886 data/mono.pc
4887 data/mono-cairo.pc
4888 data/mono-nunit.pc
4889 data/mono-options.pc
4890 data/mono-lineeditor.pc
4891 data/monodoc.pc
4892 data/dotnet.pc
4893 data/dotnet35.pc
4894 data/wcf.pc
4895 data/cecil.pc
4896 data/system.web.extensions_1.0.pc
4897 data/system.web.extensions.design_1.0.pc
4898 data/system.web.mvc.pc
4899 data/system.web.mvc2.pc
4900 data/system.web.mvc3.pc
4901 data/aspnetwebstack.pc
4902 data/reactive.pc
4903 samples/Makefile
4904 support/Makefile
4905 data/config
4906 tools/Makefile
4907 tools/locale-builder/Makefile
4908 tools/sgen/Makefile
4909 tools/monograph/Makefile
4910 tools/pedump/Makefile
4911 runtime/Makefile
4912 msvc/Makefile
4913 po/Makefile
4916 # Update all submodules recursively to ensure everything is checked out
4917 $srcdir/scripts/update_submodules.sh
4919 if test x$host_win32 = xyes; then
4920    # Get rid of 'cyg' prefixes in library names
4921    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
4922    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
4923    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
4924    # executable doesn't work...
4925    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
4928 if test x$host_darwin = xyes; then
4929    # This doesn't seem to be required and it slows down parallel builds
4930    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
4934   case $prefix in
4935   NONE) prefix=$ac_default_prefix ;;
4936   esac
4937   case $exec_prefix in
4938   NONE) exec_prefix='${prefix}' ;;
4939   esac
4941   #
4942   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
4943   # any existing config.make.  This allows people to share the same source tree
4944   # with different build directories, one native and one cross
4945   #
4946   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
4948     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
4950     echo "prefix=$prefix" > $mcs_topdir/build/config.make
4951     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
4952     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
4953     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
4954     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
4955     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
4956     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
4957     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
4958     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
4960     case $INSTALL in
4961     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
4962     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
4963     esac
4965     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
4967     export VERSION
4968     [myver=$($AWK 'BEGIN {
4969       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
4970       if(length(vsplit [1]) > 4) {
4971         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
4972       }
4973       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
4974     }')]
4976     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
4977     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
4979     if test x$host_darwin = xyes; then
4980       echo "BUILD_PLATFORM = darwin" >> $mcs_topdir/build/config.make
4981     elif test x$host_win32 = xyes; then
4982       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
4983     else
4984       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
4985     fi
4987     if test x$host_darwin = xyes; then
4988       echo "HOST_PLATFORM ?= darwin" >> $mcs_topdir/build/config.make
4989     elif test x$host_win32 = xyes; then
4990       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
4991     else
4992       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
4993     fi
4995     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
4996       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
4997     fi
4999         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5000            enable_system_aot=yes
5001         fi
5003     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5004       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5005     fi
5007     if test x$DISABLE_MCS_DOCS = xyes; then
5008       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5009     fi
5011     if test x$has_extension_module != xno; then
5012         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5013     fi
5014     
5015     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5016     
5017     if test "x$test_bcl_opt" = "xyes"; then    
5018       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5019     fi
5021     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5023     if test $csc_compiler = mcs; then
5024       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5025     fi
5027     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5028       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5029       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5030       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5031     fi
5033     if test "x$AOT_MODE" != "x" ; then
5034       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5035     fi
5037     if test "x$enable_btls" = "xyes"; then
5038       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5039     fi
5041   fi
5045 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5047 btls_platform_string=
5048 if test x$enable_btls = xyes; then
5049         if test x$btls_android = xyes; then
5050                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5051         else
5052                 btls_platform_string=" ($BTLS_PLATFORM)"
5053         fi
5056 echo "
5057         mcs source:    $mcsdir
5058         C# Compiler:   $csc_compiler
5060    Engine:
5061         Host:          $host
5062         Target:        $target
5063         GC:            $gc_msg 
5064         TLS:           $with_tls
5065         SIGALTSTACK:   $with_sigaltstack
5066         Engine:        $jit_status
5067         BigArrays:     $enable_big_arrays
5068         DTrace:        $enable_dtrace
5069         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm)
5070         Spectre:       $spectre_mitigation_status
5072    Libraries:
5073         .NET 4.x:        $with_profile4_x
5074         Xamarin.Android: $with_monodroid
5075         Xamarin.iOS:     $with_monotouch
5076         Xamarin.WatchOS: $with_monotouch_watch
5077         Xamarin.TVOS:    $with_monotouch_tv
5078         Xamarin.Mac:     $with_xammac
5079         Windows AOT:     $with_winaot
5080         Orbis:           $with_orbis
5081         Unreal:          $with_unreal
5082         WebAssembly:     $with_wasm
5083         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5084         JNI support:     $jdk_headers_found
5085         libgdiplus:      $libgdiplus_msg
5086         zlib:            $zlib_msg
5087         BTLS:            $enable_btls$btls_platform_string
5088         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5089         $disabled
5091 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5092    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)