[tests] Run abort-cctor.exe on the coop Jenkins job
[mono-project.git] / configure.ac
blob5e1105655d19f69b91002b362163348d22be0f81
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=3
44 MONO_CORLIB_VERSION=`printf "1%02d%02d%02d%03d" $MONO_VERSION_MAJOR $MONO_VERSION_MINOR 0 $MONO_CORLIB_COUNTER`
46 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,$MONO_CORLIB_VERSION,[Version of the corlib-runtime interface])
47 AC_SUBST(MONO_CORLIB_VERSION)
49 case $host_os in
50 *cygwin* )
51                  echo "Run configure using ./configure --host=i686-pc-mingw32"
52                  exit 1
53 esac
55 # In case of cygwin, override LN_S, irrespective of what it determines.
56 # The build uses cygwin, but the actual runtime doesn't.
57 case $host_os in
58 *cygwin* ) LN_S='cp -p';;
59 esac
62 # libgc defaults
64 libgc_configure_args=
66 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
67 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
68 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
69 CFLAGS_FOR_LIBGC=$CFLAGS
70 CPPFLAGS_FOR_BTLS=$CPPFLAGS
71 CFLAGS_FOR_BTLS=$CFLAGS
73 # libgc uses some deprecated APIs
74 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
77 # These are the flags that need to be stored in the mono.pc file for 
78 # compiling code that will embed Mono
80 libmono_cflags=""
81 libmono_ldflags=""
82 AC_SUBST(libmono_cflags)
83 AC_SUBST(libmono_ldflags)
85 # Variable to have relocatable .pc files (lib, or lib64)
86 # realpath isn't always available, and requires that all but the tip of the provided
87 # path exists. Fall back to the old behaviour, but realpath allows depth >1
88 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
89 # too deep for the old method to work
90 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
91 AC_SUBST(reloc_libdir)
93 # Set to yes if Unix sockets cannot be created in an anonymous namespace
94 need_link_unlink=no
96 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
97 extra_runtime_ldflags=""
100 # Hack for WASM
101 # Current autotools (v1.15) doesn't have a triplet we can use for wasm so the kludge we do is to
102 # work around it by using a feature flag instead
103 AC_ARG_ENABLE(wasm,[  --enable-wasm    Hack to set the current runtime to target wasm], enable_wasm=$enableval)
105 # Thread configuration inspired by sleepycat's db
106 AC_MSG_CHECKING([host platform characteristics])
108 libgc_threads=no
109 has_dtrace=no
110 parallel_mark=yes
111 ikvm_native=yes
113 host_win32=no
114 target_win32=no
115 platform_android=no
116 platform_tizen=no
117 platform_ios=no
118 host_darwin=no
121 if test "x$enable_wasm" = "xyes"; then
122 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
123 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
124 libdl="-ldl"
125 libgc_threads=pthreads
126 platform_wasm=yes
128 else
130 case "$host" in
131         *-mingw*|*-*-cygwin*)
132                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
133                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
134                 host_win32=yes
135                 mono_cv_clang=no
136                 if test "x$cross_compiling" = "xno"; then
137                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
138                                 target_win32=yes
139                         fi
140                 else
141                         if test "x$host" = "x$target"; then
142                                 target_win32=yes
143                         fi
144                 fi
145                 HOST_CC="gcc"
146                 # Windows Vista or later is required
147                 CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
148                 LDFLAGS="$LDFLAGS -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
149                 libmono_cflags="-mms-bitfields -mwindows"
150                 libmono_ldflags="-mms-bitfields -mwindows"
151                 libdl=
152                 libgc_threads=win32
153                 with_sigaltstack=no
154                 with_tls=pthread
155                 with_sgen_default_concurrent=yes
156                 LN_S=cp
157                 # This forces libgc to use the DllMain based thread registration code on win32
158                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
159                 ;;
160         *-*-*netbsd*)
161                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
162                 libmono_cflags="-D_REENTRANT"
163                 LDFLAGS="$LDFLAGS -pthread"
164                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
165                 libmono_ldflags="-pthread"
166                 need_link_unlink=yes
167                 libdl="-ldl"
168                 libgc_threads=pthreads
169                 with_sigaltstack=no
170                 use_sigposix=yes
171                 with_sgen_default_concurrent=yes
172                 ;;
173         *-*-kfreebsd*-gnu)
174                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
175                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
176                 libmono_ldflags="-lpthread -pthread"
177                 libdl="-ldl"
178                 libgc_threads=pthreads
179                 need_link_unlink=yes
180                 with_sigaltstack=no
181                 use_sigposix=yes
182                 with_sgen_default_concurrent=yes
183                 ;;
184         *-*-*freebsd*)
185                 if test "x$PTHREAD_CFLAGS" = "x"; then
186                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
187                         libmono_cflags=
188                 else
189                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
190                         libmono_cflags="$PTHREAD_CFLAGS"
191                 fi
192                 if test "x$PTHREAD_LIBS" = "x"; then
193                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
194                         libmono_ldflags="-pthread"
195                 else
196                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
197                         libmono_ldflags="$PTHREAD_LIBS"
198                 fi
199                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
200                 need_link_unlink=yes
201                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
202                 libdl=
203                 libgc_threads=pthreads
204                 use_sigposix=yes
205                 has_dtrace=yes
206                 with_sgen_default_concurrent=yes
207                 ;;
208         *-*-*openbsd*)
209                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
210                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
211                 if test "x$disable_munmap" != "xyes"; then
212                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
213                 fi
214                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
215                 LDFLAGS="$LDFLAGS -pthread"
216                 need_link_unlink=yes
217                 AC_DEFINE(PTHREAD_POINTER_ID)
218                 libdl=
219                 libgc_threads=pthreads
220                 with_tls=pthread
221                 with_sigaltstack=no
222                 use_sigposix=yes
223                 with_sgen_default_concurrent=yes
224                 ;;
225         *-*-linux-android*)
226                 platform_android=yes
227                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
228                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
230                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
231                 if test "x$disable_munmap" != "xyes"; then
232                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
233                 fi
234                 libmono_cflags="-D_REENTRANT"
235                 libdl="-ldl"
236                 libgc_threads=pthreads
237                 use_sigposix=yes
239                 with_tls=pthread
240                 with_sigaltstack=no
241                 with_static_mono=no
243                 # Android doesn't support boehm, as it's missing <link.h>
244                 support_boehm=no
245                 with_gc=sgen
247                 # isinf(3) requires -lm; see isinf check below
248                 LDFLAGS="$LDFLAGS -lm"
250                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
251                 # PAGE_SIZE; breaks mono/io-layer/collection.c
252                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
253                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
254                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
256                 # to bypass the underscore linker check, can't work when cross-compiling
257                 mono_cv_uscore=yes
258                 mono_cv_clang=no
259                 ;;
260         *-*-linux*)
261                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
262                 if test "x$disable_munmap" != "xyes"; then
263                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
264                 fi
265                 libmono_cflags="-D_REENTRANT"
266                 libdl="-ldl"
267                 libgc_threads=pthreads
268                 use_sigposix=yes
269                 if test "x$cross_compiling" != "xno"; then
270                         # to bypass the underscore linker check, not
271                         # available during cross-compilation
272                         mono_cv_uscore=no
273                 fi
274                 case "$host" in
275                 *-tizen-linux-*)
276                         platform_tizen=yes
277                         ;;
278                 esac
279                 case "$host" in
280                 aarch64-*)
281                         support_boehm=no
282                         with_gc=sgen
283                         ;;
284                 powerpc*-*-linux*)
285                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
286                         disable_munmap=yes
287                         ;;
288                 esac
289                 with_sgen_default_concurrent=yes
290                 ;;
291         *-*-nacl*)
292                 echo "nacl no longer supported."
293                 exit 1
294                 ;;
295         *-*-hpux*)
296                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
297                 # +ESdbgasm only valid on bundled cc on RISC
298                 # silently ignored for ia64
299                 if test $GCC != "yes"; then
300                         CFLAGS="$CFLAGS +ESdbgasm"
301                         # Arrange for run-time dereferencing of null
302                         # pointers to produce a SIGSEGV signal.
303                         LDFLAGS="$LDFLAGS -z"
304                 fi
305                 CFLAGS="$CFLAGS +ESdbgasm"
306                 LDFLAGS="$LDFLAGS -z"
307                 libmono_cflags="-D_REENTRANT"
308                 libmono_ldflags="-lpthread"
309                 libgc_threads=pthreads
310                 need_link_unlink=yes
311                 use_sigposix=yes
312                 ;;
313         *-*-solaris*)
314                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
315                 need_link_unlink=yes
316                 libmono_cflags="-D_REENTRANT"
317                 libgc_threads=pthreads
318                 has_dtrace=yes
319                 use_sigposix=yes
320                 enable_solaris_tar_check=yes
321                 ;;
322         *-*-darwin*)
323                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
324                 host_darwin=yes
325                 target_mach=yes
326                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
327                 libmono_cflags="-D_THREAD_SAFE"
328                 need_link_unlink=yes
329                 AC_DEFINE(PTHREAD_POINTER_ID)
330                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
331                 libdl=
332                 libgc_threads=pthreads
333                 has_dtrace=yes
334                 if test "x$cross_compiling" = "xyes"; then
335                         has_broken_apple_cpp=yes
336                 fi
337                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
338                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
339                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
340                 case "$host" in
341                         dnl Snow Leopard and newer config.guess reports as this
342                         i*86-*-darwin*)
343                                 BROKEN_DARWIN_FLAGS="-arch i386 -D_XOPEN_SOURCE"
344                                 BROKEN_DARWIN_CPPFLAGS="-D_XOPEN_SOURCE"
345                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
346                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
347                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
348                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
349                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
350                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
351                                 with_sgen_default_concurrent=yes
352                                 ;;
353                         x*64-*-darwin*)
354                                 with_sgen_default_concurrent=yes
355                                 ;;
356                         arm*-darwin*)
357                                 platform_ios=yes
358                                 has_dtrace=no
359                                 ;;
360                         aarch64*-darwin*)
361                                 platform_ios=yes
362                                 ;;
363                 esac
364                 ;;
365         *-*-haiku*)
366                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_THREAD_SAFE"
367                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
368                 libdl=
369                 LIBS="$LIBS -lnetwork -ltextencoding"
370                 need_link_unlink=yes
371                 AC_DEFINE(PTHREAD_POINTER_ID)
372                 dnl Haiku does not support static TLS with __thread
373                 with_tls=pthread
374                 libgc_threads=pthreads
375                 use_sigposix=yes
376                 ;;
377         *-*-aix*|*-*-os400*)
378                 dnl Set up a 64-bit build
379                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
380                 LDFLAGS="-maix64"
381                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
382                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
383                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
384                 dnl specifiy 64-bit mode for tools.
385                 AR="/usr/bin/ar -X64"
386                 NM="/usr/bin/nm -X64"
387                 dnl SGen is the future (changes to Boehm support code would be
388                 dnl required if you wish to re-enable Boehm)
389                 support_boehm=no
390                 with_gc=sgen
391                 need_link_unlink=yes
392                 use_sigposix=yes
393                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
394                 with_sigaltstack=no
395                 dnl use pthread TLS, __thread has issues with the compiler flags we use
396                 with_tls=pthread
397                 dnl ppc Linux is the same? test further
398                 disable_munmap=yes
399                 ;;
400         *)
401                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
402                 libdl="-ldl"
403                 ;;
404 esac
406 # WASM hack
409 AC_MSG_RESULT(ok)
411 if test x$need_link_unlink = xyes; then
412    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
415 if test x$host_win32 = xyes; then
416    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
419 if test x$target_win32 = xyes; then
420    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
423 if test x$host_darwin = xyes; then
424    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
427 # Defined for all targets/platforms using classic Windows API support.
428 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
429 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
431 AC_SUBST(extra_runtime_ldflags)
432 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
433 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
434 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
435 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
436 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
437 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
438 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
439 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
440 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
442 if test -z "$HOST_DARWIN_TRUE"; then :
443 PLATFORM_AOT_SUFFIX=.dylib
446 if test -z "$HOST_LINUX_TRUE"; then :
447 PLATFORM_AOT_SUFFIX=.so
450 if test -z "$HOST_WIN32_TRUE"; then :
451 PLATFORM_AOT_SUFFIX=.dll
454 AC_SUBST(PLATFORM_AOT_SUFFIX)
456 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
458 AC_CHECK_TOOL(CC, gcc, gcc)
459 AC_PROG_CC
460 AC_CHECK_TOOL(CXX, g++, g++)
461 AC_PROG_CXX
462 AM_PROG_AS
463 AC_PROG_INSTALL
464 AC_PROG_AWK
465 AM_PROG_CC_C_O
466 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
467 : ${CCAS='$(CC)'}
468 # Set ASFLAGS if not already set.
469 : ${CCASFLAGS='$(CFLAGS)'}
470 AC_SUBST(CCAS)
471 AC_SUBST(CCASFLAGS)
473 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
474 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
475 if test "x$CXX" = "xg++"; then
476         if test "x$GXX" != "xyes"; then
477                 # automake/libtool is so broken, it requires g++ even if the c++ sources
478                 # are inside automake conditionals
479                 AC_MSG_ERROR([You need to install g++])
480         fi
483 dnl may require a specific autoconf version
484 dnl AC_PROG_CC_FOR_BUILD
485 dnl CC_FOR_BUILD not automatically detected
486 CC_FOR_BUILD=$CC
487 CFLAGS_FOR_BUILD=$CFLAGS
488 BUILD_EXEEXT=
489 if test "x$cross_compiling" = "xyes"; then
490         CC_FOR_BUILD=cc
491         CFLAGS_FOR_BUILD=
492         BUILD_EXEEXT=""
494 AC_SUBST(CC_FOR_BUILD)
495 AC_SUBST(CFLAGS_FOR_BUILD)
496 AC_SUBST(HOST_CC)
497 AC_SUBST(BUILD_EXEEXT)
499 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
500 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
502 # Set STDC_HEADERS
503 AC_HEADER_STDC
504 AC_LIBTOOL_WIN32_DLL
505 # This causes monodis to not link correctly
506 #AC_DISABLE_FAST_INSTALL
508 #lookup makedev() header
509 AC_HEADER_MAJOR
511 AM_PROG_LIBTOOL
512 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
513 DOLT
515 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
516 AC_SUBST(export_ldflags)
518 # Test whenever ld supports -version-script
519 AC_PROG_LD
520 AC_PROG_LD_GNU
522 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=10000,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_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1426         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1429 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1431 if test "x$mono_feature_disable_simd" = "xyes"; then
1432         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1433         AC_MSG_NOTICE([Disabled SIMD support])
1436 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1437         AC_DEFINE(DISABLE_SOFT_DEBUG, 1, [Disable Soft Debugger Agent.])
1438         AC_MSG_NOTICE([Disabled Soft Debugger.])
1441 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1442         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1443         AC_MSG_NOTICE([Disabled Performance Counters.])
1445 if test "x$mono_feature_disable_normalization" = "xyes"; then
1446         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1447         AC_MSG_NOTICE([Disabled String normalization support.])
1450 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1451 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1452         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1453         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1456 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1457         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1458         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1461 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1462         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1463         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1466 if test "x$mono_feature_disable_remoting" = "xyes"; then
1467         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1468         AC_MSG_NOTICE([Disabled remoting])
1471 if test "x$mono_feature_disable_security" = "xyes"; then
1472         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1473         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1476 if test "x$mono_feature_disable_lldb" = "xyes"; then
1477         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1478         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1481 if test "x$mono_feature_disable_mdb" = "xyes"; then
1482         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1483         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1486 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1487         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1488         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1492 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1493         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1494         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1497 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1498         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1499         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1502 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1503         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1504         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1507 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1508 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1510 has_extension_module=no
1511 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1513         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1514                 if test x$extension = xdefault ; then
1515                         has_extension_module=yes;
1516                 fi
1517         done
1518         if test x$enable_extension_module = xyes; then
1519                 has_extension_module=yes;
1520         fi
1521 ], [])
1523 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1525 if test x$has_extension_module != xno ; then
1526         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1527         AC_MSG_NOTICE([Enabling mono extension module.])
1530 # Deprecated
1531 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1533 AC_MSG_CHECKING(for visibility __attribute__)
1534 AC_COMPILE_IFELSE([
1535         AC_LANG_SOURCE([[
1536                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1537                 int main () { doit (); return 0; }
1538         ]])
1539 ], [
1540    have_visibility_hidden=yes
1541    AC_MSG_RESULT(yes)
1542 ], [
1543    have_visibility_hidden=no
1544    AC_MSG_RESULT(no)
1548 dnl Boehm GC configuration
1551 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1553 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1554 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1556 if test "x$support_boehm" = "xyes"; then
1558         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1559         if test x$enable_parallel_mark = xyes; then
1560                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1561         fi
1563         gc_msg=""
1564         LIBGC_CPPFLAGS=
1565         LIBGC_LIBS=
1566         LIBGC_STATIC_LIBS=
1567         libgc_dir=
1568         case "x$libgc" in
1569                 xincluded)
1570                         if test "x$support_boehm" = "xyes"; then
1571                                 libgc_dir=libgc
1572                         fi
1574                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1575                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1576                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1578                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1580                         if test x$target_win32 = xyes; then
1581                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1582                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1583                         fi
1585                         gc_msg="Included Boehm GC with typed GC"
1586                         if test x$enable_parallel_mark = xyes; then
1587                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1588                                 gc_msg="$gc_msg and parallel mark"
1589                         else
1590                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1591                         fi
1592                         ;;
1594                 xboehm|xbohem|xyes)
1595                         AC_MSG_WARN("External Boehm is no longer supported")
1596                         ;;
1598                 xsgen)
1599                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1600                         ;;
1602                 xnone)
1603                         AC_MSG_WARN("Compiling mono without GC.")
1604                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1605                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1606                         gc_msg="none"
1607                         ;;
1608                 *)
1609                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1610                         ;;
1611         esac
1613         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])
1614         if test "x$large_heap" = "xyes"; then
1615            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1616         fi
1618         AC_SUBST(LIBGC_CPPFLAGS)
1619         AC_SUBST(LIBGC_LIBS)
1620         AC_SUBST(LIBGC_STATIC_LIBS)
1621         AC_SUBST(libgc_dir)
1622         AC_SUBST(BOEHM_DEFINES)
1625 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1628 dnl End of Boehm GC Configuration
1631 dnl *************************************
1632 dnl *** Checks for zero length arrays ***
1633 dnl *************************************
1634 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1635 AC_TRY_COMPILE([
1636         struct s {
1637                 int  length;
1638                 char data [0];
1639         };
1640 ], [], [
1641         AC_MSG_RESULT(yes)
1642         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1643 ], [
1644         AC_MSG_RESULT(no)
1645         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1648 dnl ***********************************
1649 dnl *** Checks for signals
1650 dnl ***********************************
1651 AC_CHECK_HEADERS(signal.h)
1652 AC_CHECK_FUNCS(sigaction)
1653 AC_CHECK_FUNCS(kill)
1654 AC_CHECK_FUNCS(signal)
1656 # signal() is declared inline in Android headers
1657 # so we need to workaround it by overriding the check.
1658 if test x$platform_android = xyes; then
1659         AC_DEFINE(HAVE_SIGNAL,1)
1662 if test x$host_win32 = xno; then
1663         dnl *************************************
1664         dnl *** Checks for time capabilities ***
1665         dnl *************************************
1667         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1668         AC_TRY_COMPILE([#include <time.h>], [
1669                 const int foo = CLOCK_MONOTONIC;
1670         ],[
1671                 AC_MSG_RESULT(yes)
1672                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1673         ], [
1674                 AC_MSG_RESULT(no)
1675         ])
1677         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1678         AC_TRY_COMPILE([#include <time.h>], [
1679                 const int foo = CLOCK_MONOTONIC_COARSE;
1680         ],[
1681                 AC_MSG_RESULT(yes)
1682                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1683         ], [
1684                 AC_MSG_RESULT(no)
1685         ])
1687         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1688         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1689         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1691         dnl hires monotonic clock support
1692         AC_SEARCH_LIBS(clock_gettime, rt)
1693         AC_CHECK_FUNCS(clock_nanosleep)
1695         dnl dynamic loader support
1696         AC_CHECK_FUNC(dlopen, DL_LIB="",
1697                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1698         )
1699         if test x$dl_support = xno; then
1700                 AC_MSG_WARN([No dynamic loading support available])
1701         else
1702                 LIBS="$LIBS $DL_LIB"
1703                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1704                 dnl from glib's configure.ac
1705                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1706                         mono_cv_uscore,[
1707                         AC_TRY_RUN([#include <dlfcn.h>
1708                         int mono_underscore_test (void) { return 42; }
1709                         int main() {
1710                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1711                           handle = dlopen ((void*)0, 0);
1712                           if (handle) {
1713                             f1 = dlsym (handle, "mono_underscore_test");
1714                             f2 = dlsym (handle, "_mono_underscore_test");
1715                           } return (!f2 || f1);
1716                         }],
1717                                 [mono_cv_uscore=yes],
1718                                 [mono_cv_uscore=no],
1719                         [])
1720                 ])
1721                 if test "x$mono_cv_uscore" = "xyes"; then
1722                         MONO_DL_NEED_USCORE=1
1723                 else
1724                         MONO_DL_NEED_USCORE=0
1725                 fi
1726                 AC_SUBST(MONO_DL_NEED_USCORE)
1727                 AC_CHECK_FUNC(dlerror)
1728         fi
1730         dnl ******************************************************************
1731         dnl *** Checks for the IKVM JNI interface library                  ***
1732         dnl ******************************************************************
1733         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])
1735         ikvm_native_dir=
1736         if test x$with_ikvm_native = xyes; then
1737                 ikvm_native_dir=ikvm-native
1738                 jdk_headers_found="IKVM Native"
1739         fi
1741         AC_SUBST(ikvm_native_dir)
1743         AC_CHECK_HEADERS(execinfo.h)
1745         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1747         AC_CHECK_FUNCS(getgrgid_r)
1748         AC_CHECK_FUNCS(getgrnam_r)
1749         AC_CHECK_FUNCS(getresuid)
1750         AC_CHECK_FUNCS(setresuid)
1751         AC_CHECK_FUNCS(kqueue)
1752         AC_CHECK_FUNCS(backtrace_symbols)
1753         AC_CHECK_FUNCS(mkstemp)
1754         AC_CHECK_FUNCS(mmap)
1755         AC_CHECK_FUNCS(madvise)
1756         AC_CHECK_FUNCS(getrusage)
1757         AC_CHECK_FUNCS(getpriority)
1758         AC_CHECK_FUNCS(setpriority)
1759         AC_CHECK_FUNCS(dl_iterate_phdr)
1760         AC_CHECK_FUNCS(dladdr)
1761         AC_CHECK_FUNCS(sysconf)
1762         AC_CHECK_FUNCS(getrlimit)
1763         AC_CHECK_FUNCS(prctl)
1765         AC_CHECK_FUNCS(sched_getaffinity)
1766         AC_CHECK_FUNCS(sched_setaffinity)
1767         AC_CHECK_FUNCS(sched_getcpu)
1769         if test x$platform_android != xyes; then
1770                 AC_CHECK_FUNCS(getpwnam_r)
1771                 AC_CHECK_FUNCS(getpwuid_r)
1772         fi
1774         AC_FUNC_STRERROR_R()
1776         dnl ****************************************************************
1777         dnl *** Check for sched_setaffinity from glibc versions before   ***
1778         dnl *** 2.3.4. The older versions of the function only take 2    ***
1779         dnl *** parameters, not 3.                                       ***
1780         dnl ***                                                          ***
1781         dnl *** Because the interface change was not made in a minor     ***
1782         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1783         dnl *** won't always indicate the interface sched_affinity has.  ***
1784         dnl ****************************************************************
1785         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1786         AC_TRY_COMPILE([#include <sched.h>], [
1787             int mask = 1; 
1788             sched_setaffinity(0, &mask);
1789         ], [
1790                 # Yes, we have it...
1791                 AC_MSG_RESULT(yes)
1792                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1793         ], [
1794                 # We have the new, three-parameter version
1795                 AC_MSG_RESULT(no)
1796         ])
1797         AC_TRY_COMPILE([#include <sched.h>], [
1798              CPU_COUNT((void *) 0);
1799         ], [
1800                 AC_MSG_RESULT(yes)
1801                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1802         ], [
1803                 # We have the new, three-parameter version
1804                 AC_MSG_RESULT(no)
1805         ])
1807         dnl ******************************************************************
1808         dnl *** Check for large file support                               ***
1809         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1810         dnl ******************************************************************
1811         
1812         # Check that off_t can represent 2**63 - 1 correctly, working around
1813         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1814         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1815         large_offt=no
1816         AC_DEFUN([LARGE_FILES], [
1817                 large_CPPFLAGS=$CPPFLAGS
1818                 CPPFLAGS="$CPPFLAGS $1"
1819                 AC_TRY_COMPILE([
1820                         #include <sys/types.h>
1821                         #include <limits.h>
1822                 ], [
1823                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1824                         #define COMPILE_TIME_ASSERT(pred) \
1825                                 switch(0){case 0:case pred:;}
1826                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1827                 ], [
1828                         AC_MSG_RESULT(ok)
1829                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1830                         large_CPPFLAGS="$large_CPPFLAGS $1"
1831                         large_offt=yes
1832                 ], [
1833                         AC_MSG_RESULT(no)
1834                 ])
1835                 CPPFLAGS=$large_CPPFLAGS
1836         ])
1838         AC_MSG_CHECKING(if off_t is 64 bits wide)
1839         LARGE_FILES("")
1840         if test $large_offt = no; then
1841                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1842                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1843         fi
1844         if test $large_offt = no; then
1845                 AC_MSG_WARN([No 64 bit file size support available])
1846         fi
1847         
1848         dnl *****************************
1849         dnl *** Checks for libsocket  ***
1850         dnl *****************************
1851         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1853         case "$host" in
1854                 *-*-*freebsd*)
1855                         dnl *****************************
1856                         dnl *** Checks for libinotify ***
1857                         dnl *****************************
1858                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1859         esac
1861         dnl *******************************
1862         dnl *** Checks for MSG_NOSIGNAL ***
1863         dnl *******************************
1864         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1865         AC_TRY_COMPILE([#include <sys/socket.h>], [
1866                 int f = MSG_NOSIGNAL;
1867         ], [
1868                 # Yes, we have it...
1869                 AC_MSG_RESULT(yes)
1870                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
1871         ], [
1872                 # We'll have to use signals
1873                 AC_MSG_RESULT(no)
1874         ])
1876         dnl *****************************
1877         dnl *** Checks for IPPROTO_IP ***
1878         dnl *****************************
1879         AC_MSG_CHECKING(for IPPROTO_IP)
1880         AC_TRY_COMPILE([#include <netinet/in.h>], [
1881                 int level = IPPROTO_IP;
1882         ], [
1883                 # Yes, we have it...
1884                 AC_MSG_RESULT(yes)
1885                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
1886         ], [
1887                 # We'll have to use getprotobyname
1888                 AC_MSG_RESULT(no)
1889         ])
1891         dnl *******************************
1892         dnl *** Checks for IPPROTO_IPV6 ***
1893         dnl *******************************
1894         AC_MSG_CHECKING(for IPPROTO_IPV6)
1895         AC_TRY_COMPILE([#include <netinet/in.h>], [
1896                 int level = IPPROTO_IPV6;
1897         ], [
1898                 # Yes, we have it...
1899                 AC_MSG_RESULT(yes)
1900                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
1901         ], [
1902                 # We'll have to use getprotobyname
1903                 AC_MSG_RESULT(no)
1904         ])
1906         dnl ******************************
1907         dnl *** Checks for IPPROTO_TCP ***
1908         dnl ******************************
1909         AC_MSG_CHECKING(for IPPROTO_TCP)
1910         AC_TRY_COMPILE([#include <netinet/in.h>], [
1911                 int level = IPPROTO_TCP;
1912         ], [
1913                 # Yes, we have it...
1914                 AC_MSG_RESULT(yes)
1915                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
1916         ], [
1917                 # We'll have to use getprotobyname
1918                 AC_MSG_RESULT(no)
1919         ])
1921         dnl *****************************
1922         dnl *** Checks for SOL_IP     ***
1923         dnl *****************************
1924         AC_MSG_CHECKING(for SOL_IP)
1925         AC_TRY_COMPILE([#include <netdb.h>], [
1926                 int level = SOL_IP;
1927         ], [
1928                 # Yes, we have it...
1929                 AC_MSG_RESULT(yes)
1930                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
1931         ], [
1932                 # We'll have to use getprotobyname
1933                 AC_MSG_RESULT(no)
1934         ])
1936         dnl *****************************
1937         dnl *** Checks for SOL_IPV6     ***
1938         dnl *****************************
1939         AC_MSG_CHECKING(for SOL_IPV6)
1940         AC_TRY_COMPILE([#include <netdb.h>], [
1941                 int level = SOL_IPV6;
1942         ], [
1943                 # Yes, we have it...
1944                 AC_MSG_RESULT(yes)
1945                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
1946         ], [
1947                 # We'll have to use getprotobyname
1948                 AC_MSG_RESULT(no)
1949         ])
1951         dnl *****************************
1952         dnl *** Checks for SOL_TCP    ***
1953         dnl *****************************
1954         AC_MSG_CHECKING(for SOL_TCP)
1955         AC_TRY_COMPILE([#include <netdb.h>], [
1956                 int level = SOL_TCP;
1957         ], [
1958                 # Yes, we have it...
1959                 AC_MSG_RESULT(yes)
1960                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
1961         ], [
1962                 # We'll have to use getprotobyname
1963                 AC_MSG_RESULT(no)
1964         ])
1966         dnl *****************************
1967         dnl *** Checks for IP_PKTINFO ***
1968         dnl *****************************
1969         AC_MSG_CHECKING(for IP_PKTINFO)
1970         AC_TRY_COMPILE([#include <linux/in.h>], [
1971                 int level = IP_PKTINFO;
1972         ], [
1973                 # Yes, we have it...
1974                 AC_MSG_RESULT(yes)
1975                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1976         ], [
1977                 AC_MSG_RESULT(no)
1978         ])
1980         dnl *****************************
1981         dnl *** Checks for IPV6_PKTINFO ***
1982         dnl *****************************
1983         AC_MSG_CHECKING(for IPV6_PKTINFO)
1984         AC_TRY_COMPILE([#include <netdb.h>], [
1985                 int level = IPV6_PKTINFO;
1986         ], [
1987                 # Yes, we have it...
1988                 AC_MSG_RESULT(yes)
1989                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
1990         ], [
1991                 AC_MSG_RESULT(no)
1992         ])
1994         dnl **********************************
1995         dnl *** Checks for IP_DONTFRAG     ***
1996         dnl **********************************
1997         AC_MSG_CHECKING(for IP_DONTFRAG)
1998         AC_TRY_COMPILE([#include <netinet/in.h>], [
1999                 int level = IP_DONTFRAG;
2000         ], [
2001                 # Yes, we have it...
2002                 AC_MSG_RESULT(yes)
2003                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2004         ], [
2005                 AC_MSG_RESULT(no)
2006         ])
2008         dnl **********************************
2009         dnl *** Checks for IP_DONTFRAGMENT ***
2010         dnl **********************************
2011         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2012         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2013                 int level = IP_DONTFRAGMENT;
2014         ], [
2015                 # Yes, we have it...
2016                 AC_MSG_RESULT(yes)
2017                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2018         ], [
2019                 AC_MSG_RESULT(no)
2020         ])
2022         dnl **********************************
2023         dnl *** Checks for IP_MTU_DISCOVER ***
2024         dnl **********************************
2025         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2026         AC_TRY_COMPILE([#include <linux/in.h>], [
2027                 int level = IP_MTU_DISCOVER;
2028         ], [
2029                 # Yes, we have it...
2030                 AC_MSG_RESULT(yes)
2031                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2032         ], [
2033                 AC_MSG_RESULT(no)
2034         ])
2036         dnl **********************************
2037         dnl *** Checks for  IP_PMTUDISC_DO ***
2038         dnl **********************************
2039         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2040         AC_TRY_COMPILE([#include <linux/in.h>], [
2041                 int level = IP_PMTUDISC_DO;
2042         ], [
2043                 # Yes, we have it...
2044                 AC_MSG_RESULT(yes)
2045                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2046         ], [
2047                 AC_MSG_RESULT(no)
2048         ])
2050         dnl *********************************
2051         dnl *** Check for struct ip_mreqn ***
2052         dnl *********************************
2053         AC_MSG_CHECKING(for struct ip_mreqn)
2054         AC_TRY_COMPILE([#include <netinet/in.h>], [
2055                 struct ip_mreqn mreq;
2056                 mreq.imr_address.s_addr = 0;
2057         ], [
2058                 # Yes, we have it...
2059                 AC_MSG_RESULT(yes)
2060                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2061         ], [
2062                 # We'll just have to try and use struct ip_mreq
2063                 AC_MSG_RESULT(no)
2064                 AC_MSG_CHECKING(for struct ip_mreq)
2065                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2066                         struct ip_mreq mreq;
2067                         mreq.imr_interface.s_addr = 0;
2068                 ], [
2069                         # Yes, we have it...
2070                         AC_MSG_RESULT(yes)
2071                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2072                 ], [
2073                         # No multicast support
2074                         AC_MSG_RESULT(no)
2075                 ])
2076         ])
2077         
2078         dnl **********************************
2079         dnl *** Check for getaddrinfo ***
2080         dnl **********************************
2081         AC_MSG_CHECKING(for getaddrinfo)
2082                 AC_TRY_LINK([
2083                 #include <stdio.h>
2084                 #include <netdb.h>
2085         ], [
2086                 getaddrinfo(NULL,NULL,NULL,NULL);
2087         ], [
2088                 # Yes, we have it...
2089                 AC_MSG_RESULT(yes)
2090                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2091         ], [
2092                 AC_MSG_RESULT(no)
2093         ])
2095         dnl **********************************
2096         dnl *** Check for gethostbyname2_r ***
2097         dnl **********************************
2098         AC_MSG_CHECKING(for gethostbyname2_r)
2099                 AC_TRY_LINK([
2100                 #include <stdio.h>
2101                 #include <netdb.h>
2102         ], [
2104                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2105         ], [
2106                 # Yes, we have it...
2107                 AC_MSG_RESULT(yes)
2108                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2109         ], [
2110                 AC_MSG_RESULT(no)
2111         ])
2113         dnl **********************************
2114         dnl *** Check for gethostbyname2 ***
2115         dnl **********************************
2116         AC_MSG_CHECKING(for gethostbyname2)
2117                 AC_TRY_LINK([
2118                 #include <stdio.h>
2119                 #include <netdb.h>
2120         ], [
2121                 gethostbyname2(NULL,0);
2122         ], [
2123                 # Yes, we have it...
2124                 AC_MSG_RESULT(yes)
2125                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2126         ], [
2127                 AC_MSG_RESULT(no)
2128         ])
2130         dnl **********************************
2131         dnl *** Check for gethostbyname ***
2132         dnl **********************************
2133         AC_MSG_CHECKING(for gethostbyname)
2134                 AC_TRY_LINK([
2135                 #include <stdio.h>
2136                 #include <netdb.h>
2137         ], [
2138                 gethostbyname(NULL);
2139         ], [
2140                 # Yes, we have it...
2141                 AC_MSG_RESULT(yes)
2142                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2143         ], [
2144                 AC_MSG_RESULT(no)
2145         ])
2147         dnl **********************************
2148         dnl *** Check for getprotobyname ***
2149         dnl **********************************
2150         AC_MSG_CHECKING(for getprotobyname)
2151                 AC_TRY_LINK([
2152                 #include <stdio.h>
2153                 #include <netdb.h>
2154         ], [
2155                 getprotobyname(NULL);
2156         ], [
2157                 # Yes, we have it...
2158                 AC_MSG_RESULT(yes)
2159                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2160         ], [
2161                 AC_MSG_RESULT(no)
2162         ])
2164         dnl **********************************
2165         dnl *** Check for getnameinfo ***
2166         dnl **********************************
2167         AC_MSG_CHECKING(for getnameinfo)
2168                 AC_TRY_LINK([
2169                 #include <stdio.h>
2170                 #include <netdb.h>
2171         ], [
2172                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2173         ], [
2174                 # Yes, we have it...
2175                 AC_MSG_RESULT(yes)
2176                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2177         ], [
2178                 AC_MSG_RESULT(no)
2179         ])
2182         dnl **********************************
2183         dnl *** Check for inet_ntop ***
2184         dnl **********************************
2185         AC_MSG_CHECKING(for inet_ntop)
2186                 AC_TRY_LINK([
2187                 #include <stdio.h>
2188                 #include <arpa/inet.h>
2189         ], [
2190                 inet_ntop (0, NULL, NULL, 0);
2191         ], [
2192                 # Yes, we have it...
2193                 AC_MSG_RESULT(yes)
2194                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2195         ], [
2196                 AC_MSG_RESULT(no)
2197         ])
2199         dnl *****************************
2200         dnl *** Checks for libnsl     ***
2201         dnl *****************************
2202         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2204         AC_CHECK_FUNCS(inet_pton inet_aton)
2206         dnl *****************************
2207         dnl *** Checks for libxnet    ***
2208         dnl *****************************
2209         case "${host}" in
2210                 *solaris* )
2211                         AC_MSG_CHECKING(for Solaris XPG4 support)
2212                         if test -f /usr/lib/libxnet.so; then
2213                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2214                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2215                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2216                                 LIBS="$LIBS -lxnet"
2217                                 AC_MSG_RESULT(yes)
2218                         else
2219                                 AC_MSG_RESULT(no)
2220                         fi
2222                         if test "$GCC" = "yes"; then
2223                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2224                         fi
2225                 ;;
2226         esac
2228         dnl *****************************
2229         dnl *** Checks for libpthread ***
2230         dnl *****************************
2231 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2232 # and libpthread does not exist
2234         case "${host}" in
2235                 *-*-*haiku*)
2236                         dnl Haiku has pthread in libroot (libc equiv)
2237                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2238                 ;;
2239                 *-*-*freebsd*)
2240                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2241                 ;;
2242                 *-*-*openbsd*)
2243                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2244                 ;;
2245                 *)
2246                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2247                 ;;
2248         esac
2249         AC_CHECK_HEADERS(pthread.h)
2250         AC_CHECK_HEADERS(pthread_np.h)
2251         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2252         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2253         AC_CHECK_FUNCS(pthread_kill)
2254         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2255         AC_TRY_COMPILE([ #include <pthread.h>], [
2256                 pthread_mutexattr_t attr;
2257                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2258         ], [
2259                 AC_MSG_RESULT(ok)
2260         ], [
2261                 AC_MSG_RESULT(no)
2262                 AC_ERROR(Posix system lacks support for recursive mutexes)
2263         ])
2264         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2265         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2266         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2268         dnl **********************************
2269         dnl *** Check for mincore ***
2270         dnl **********************************
2271         AC_MSG_CHECKING(for mincore)
2272                 AC_TRY_LINK([
2273                 #include <stdio.h>
2274                 #include <sys/types.h>
2275                 #include <sys/mman.h>
2276         ], [
2277                 mincore(NULL, 0, NULL);
2278         ], [
2279                 # Yes, we have it...
2280                 AC_MSG_RESULT(yes)
2281                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
2282         ], [
2283                 AC_MSG_RESULT(no)
2284         ])
2286         dnl ***********************************
2287         dnl *** Checks for working __thread ***
2288         dnl ***********************************
2289         AC_MSG_CHECKING(for working __thread)
2290         if test "x$with_tls" != "x__thread"; then
2291                 AC_MSG_RESULT(disabled)
2292         elif test "x$cross_compiling" = "xyes"; then
2293                 AC_MSG_RESULT(cross compiling, assuming yes)
2294         else
2295                 AC_TRY_RUN([
2296                         #if defined(__APPLE__) && defined(__clang__)
2297                         #error "__thread does not currently work with clang on Mac OS X"
2298                         #endif
2299                         
2300                         #include <pthread.h>
2301                         __thread int i;
2302                         static int res1, res2;
2304                         void thread_main (void *arg)
2305                         {
2306                                 i = arg;
2307                                 sleep (1);
2308                                 if (arg == 1)
2309                                         res1 = (i == arg);
2310                                 else
2311                                         res2 = (i == arg);
2312                         }
2314                         int main () {
2315                                 pthread_t t1, t2;
2317                                 i = 5;
2319                                 pthread_create (&t1, NULL, thread_main, 1);
2320                                 pthread_create (&t2, NULL, thread_main, 2);
2322                                 pthread_join (t1, NULL);
2323                                 pthread_join (t2, NULL);
2325                                 return !(res1 + res2 == 2);
2326                         }
2327                 ], [
2328                                 AC_MSG_RESULT(yes)
2329                 ], [
2330                                 AC_MSG_RESULT(no)
2331                                 with_tls=pthread
2332                 ])
2333         fi
2335         dnl **************************************
2336         dnl *** Checks for working sigaltstack ***
2337         dnl **************************************
2338         AC_MSG_CHECKING(for working sigaltstack)
2339         if test "x$with_sigaltstack" != "xyes"; then
2340                 AC_MSG_RESULT(disabled)
2341         elif test "x$cross_compiling" = "xyes"; then
2342                 AC_MSG_RESULT(cross compiling, assuming yes)
2343         else
2344                 AC_TRY_RUN([
2345                         #include <stdio.h>
2346                         #include <stdlib.h>
2347                         #include <unistd.h>
2348                         #include <signal.h>
2349                         #include <pthread.h>
2350                         #include <sys/wait.h>
2351                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2352                         #define SA_STACK SA_ONSTACK
2353                         #endif
2354                         static void
2355                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2356                         {
2357                                 exit (0);
2358                         }
2360                         volatile char*__ptr = NULL;
2361                         static void *
2362                         loop (void *ignored)
2363                         {
2364                                 *__ptr = 0;
2365                                 return NULL;
2366                         }
2368                         static void
2369                         child ()
2370                         {
2371                                 struct sigaction sa;
2372                                 stack_t sas;
2373                                 pthread_t id;
2374                                 pthread_attr_t attr;
2376                                 sa.sa_sigaction = sigsegv_signal_handler;
2377                                 sigemptyset (&sa.sa_mask);
2378                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2379                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2380                                         perror ("sigaction");
2381                                         return;
2382                                 }
2384                                 /* x86 darwin deliver segfaults using SIGBUS */
2385                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2386                                         perror ("sigaction");
2387                                         return;
2388                                 }
2389                                 sas.ss_sp = malloc (SIGSTKSZ);
2390                                 sas.ss_size = SIGSTKSZ;
2391                                 sas.ss_flags = 0;
2392                                 if (sigaltstack (&sas, NULL) == -1) {
2393                                         perror ("sigaltstack");
2394                                         return;
2395                                 }
2397                                 pthread_attr_init (&attr);
2398                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2399                                         printf ("pthread_create\n");
2400                                         return;
2401                                 }
2403                                 sleep (100);
2404                         }
2406                         int
2407                         main ()
2408                         {
2409                                 pid_t son;
2410                                 int status;
2411                                 int i;
2413                                 son = fork ();
2414                                 if (son == -1) {
2415                                         return 1;
2416                                 }
2418                                 if (son == 0) {
2419                                         child ();
2420                                         return 0;
2421                                 }
2423                                 for (i = 0; i < 300; ++i) {
2424                                         waitpid (son, &status, WNOHANG);
2425                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2426                                                 return 0;
2427                                         usleep (10000);
2428                                 }
2430                                 kill (son, SIGKILL);
2431                                 return 1;
2432                         }
2434                 ], [
2435                                 AC_MSG_RESULT(yes)
2436                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2437                 ], [
2438                                 with_sigaltstack=no
2439                                 AC_MSG_RESULT(no)
2440                 ])
2441         fi
2443         dnl ********************************
2444         dnl *** Checks for semaphore lib ***
2445         dnl ********************************
2446         # 'Real Time' functions on Solaris
2447         # posix4 on Solaris 2.6
2448         # pthread (first!) on Linux
2449         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2451         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2452         AC_CHECK_FUNCS(shm_open)
2454         dnl ********************************
2455         dnl *** Checks for timezone stuff **
2456         dnl ********************************
2457         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2458                 AC_TRY_COMPILE([
2459                         #include <time.h>
2460                         ], [
2461                         struct tm tm;
2462                         tm.tm_gmtoff = 1;
2463                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2464         if test $ac_cv_struct_tm_gmtoff = yes; then
2465                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2466         else
2467                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2468                         AC_TRY_COMPILE([
2469                                 #include <time.h>
2470                         ], [
2471                                 timezone = 1;
2472                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2473                 if test $ac_cv_var_timezone = yes; then
2474                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2475                 else
2476                         AC_ERROR(unable to find a way to determine timezone)
2477                 fi
2478         fi
2480         dnl *********************************
2481         dnl *** Checks for math functions ***
2482         dnl *********************************
2483         AC_SEARCH_LIBS(sqrtf, m)
2484         if test "x$has_broken_apple_cpp" != "xyes"; then
2485                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
2486                         AC_TRY_LINK([#include <math.h>], 
2487                         [ finite(0.0); ], 
2488                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
2489                         AC_MSG_RESULT(no)))
2490         fi
2491         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
2492                 AC_TRY_LINK([#include <math.h>], 
2493                 [ isfinite(0.0); ], 
2494                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
2495                 AC_MSG_RESULT(no)))
2497         dnl ****************************************************************
2498         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2499         dnl *** have it in the library (duh))                            ***
2500         dnl ****************************************************************
2501         AC_CHECK_FUNCS(poll)
2503         dnl *************************
2504         dnl *** Check for signbit ***
2505         dnl *************************
2506         AC_MSG_CHECKING(for signbit)
2507         AC_TRY_LINK([#include <math.h>], [
2508                 int s = signbit(1.0);
2509         ], [
2510                 AC_MSG_RESULT(yes)
2511                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
2512         ], [
2513                 AC_MSG_RESULT(no)
2514         ]) 
2516         dnl **********************************
2517         dnl *** epoll                      ***
2518         dnl **********************************
2519         AC_CHECK_HEADERS(sys/epoll.h)
2520         haveepoll=no
2521         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2522         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2523                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2524         fi
2526         havekqueue=no
2528         AC_CHECK_HEADERS(sys/event.h)
2529         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2531         dnl **************************************
2532         dnl * Darwin has a race that prevents us from using reliably:
2533         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2534         dnl * Since kqueue is mostly used for scaling large web servers, 
2535         dnl * and very few folks run Mono on large web servers on OSX, falling
2536         dnl * back 
2537         dnl **************************************
2538         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2539                 if test "x$host_darwin" = "xno"; then
2540                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2541                 fi
2542         fi
2544         dnl ******************************
2545         dnl *** Checks for SIOCGIFCONF ***
2546         dnl ******************************
2547         AC_CHECK_HEADERS(sys/ioctl.h)
2548         AC_CHECK_HEADERS(net/if.h, [], [],
2549            [
2550            #ifdef HAVE_SYS_TYPES_H
2551            # include <sys/types.h>
2552            #endif
2553            #ifdef HAVE_SYS_SOCKET_H
2554            # include <sys/socket.h>
2555            #endif
2556            ])
2557         AC_MSG_CHECKING(for ifreq)
2558         AC_TRY_COMPILE([
2559                 #include <stdio.h>
2560                 #include <sys/ioctl.h>
2561                 #include <net/if.h>
2562                 ], [
2563                 struct ifconf ifc;
2564                 struct ifreq *ifr;
2565                 void *x;
2566                 ifc.ifc_len = 0;
2567                 ifc.ifc_buf = NULL;
2568                 x = (void *) &ifr->ifr_addr;
2569                 ],[
2570                         AC_MSG_RESULT(yes)
2571                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2572                 ], [
2573                         AC_MSG_RESULT(no)
2574                 ])
2575         dnl **********************************
2576         dnl ***     Checks for sin_len     ***
2577         dnl **********************************
2578         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2579         AC_TRY_COMPILE([
2580                 #include <netinet/in.h>
2581                 ], [
2582                 struct sockaddr_in saddr;
2583                 saddr.sin_len = sizeof (saddr);
2584                 ],[
2585                         AC_MSG_RESULT(yes)
2586                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2587                 ], [
2588                         AC_MSG_RESULT(no)
2589                 ])      
2590         dnl **********************************
2591         dnl ***    Checks for sin6_len     ***
2592         dnl **********************************
2593         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2594         AC_TRY_COMPILE([
2595                 #include <netinet/in.h>
2596                 ], [
2597                 struct sockaddr_in6 saddr6;
2598                 saddr6.sin6_len = sizeof (saddr6);
2599                 ],[
2600                         AC_MSG_RESULT(yes)
2601                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2602                 ], [
2603                         AC_MSG_RESULT(no)
2604                 ])
2605         dnl **********************************
2606         dnl *** Check for getifaddrs       ***
2607         dnl **********************************
2608         AC_MSG_CHECKING(for getifaddrs)
2609                 AC_TRY_LINK([
2610                 #include <stdio.h>
2611                 #include <sys/types.h>
2612                 #include <sys/socket.h>
2613                 #include <ifaddrs.h>
2614         ], [
2615                 getifaddrs(NULL);
2616         ], [
2617                 # Yes, we have it...
2618                 AC_MSG_RESULT(yes)
2619                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2620         ], [
2621                 AC_MSG_RESULT(no)
2622         ])
2623         dnl **********************************
2624         dnl *** Check for if_nametoindex   ***
2625         dnl **********************************
2626         AC_MSG_CHECKING(for if_nametoindex)
2627                 AC_TRY_LINK([
2628                 #include <stdio.h>
2629                 #include <sys/types.h>
2630                 #include <sys/socket.h>
2631                 #include <net/if.h>
2632         ], [
2633                 if_nametoindex(NULL);
2634         ], [
2635                 # Yes, we have it...
2636                 AC_MSG_RESULT(yes)
2637                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2638         ], [
2639                 AC_MSG_RESULT(no)
2640         ])
2641                         
2642         dnl **********************************
2643         dnl *** Checks for proclib         ***
2644         dnl **********************************
2645         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.)])
2646         dnl **********************************
2647         dnl *** Checks for MonoPosixHelper ***
2648         dnl **********************************
2649         AC_CHECK_HEADERS(checklist.h)
2650         AC_CHECK_HEADERS(pathconf.h)
2651         AC_CHECK_HEADERS(fstab.h)
2652         AC_CHECK_HEADERS(attr/xattr.h)
2653         AC_CHECK_HEADERS(sys/extattr.h)
2654         AC_CHECK_HEADERS(sys/sendfile.h)
2655         AC_CHECK_HEADERS(sys/statvfs.h)
2656         AC_CHECK_HEADERS(sys/statfs.h)
2657         AC_CHECK_HEADERS(sys/vfstab.h)
2658         AC_CHECK_HEADERS(sys/xattr.h)
2659         AC_CHECK_HEADERS(sys/mman.h)
2660         AC_CHECK_HEADERS(sys/param.h)
2661         AC_CHECK_HEADERS(sys/mount.h, [], [],
2662                 [
2663                 #ifdef HAVE_SYS_PARAM_H
2664                 # include <sys/param.h>
2665                 #endif
2666                 ])
2667         AC_CHECK_HEADERS(sys/mount.h)
2668         AC_CHECK_FUNCS(confstr)
2669         AC_CHECK_FUNCS(seekdir telldir)
2670         AC_CHECK_FUNCS(getdomainname)
2671         AC_CHECK_FUNCS(setdomainname)
2672         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2673         AC_CHECK_FUNCS(setgroups)
2674         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2675         AC_CHECK_FUNCS(getfsstat)
2676         AC_CHECK_FUNCS(lutimes futimes)
2677         AC_CHECK_FUNCS(mremap)
2678         AC_CHECK_FUNCS(remap_file_pages)
2679         AC_CHECK_FUNCS(posix_fadvise)
2680         AC_CHECK_FUNCS(posix_fallocate)
2681         AC_CHECK_FUNCS(posix_madvise)
2682         AC_CHECK_FUNCS(vsnprintf)
2683         AC_CHECK_FUNCS(sendfile)
2684         AC_CHECK_FUNCS(gethostid sethostid)
2685         AC_CHECK_FUNCS(sethostname)
2686         AC_CHECK_FUNCS(statfs)
2687         AC_CHECK_FUNCS(fstatfs)
2688         AC_CHECK_FUNCS(statvfs)
2689         AC_CHECK_FUNCS(fstatvfs)
2690         AC_CHECK_FUNCS(stime)
2691         AC_CHECK_FUNCS(strerror_r)
2692         AC_CHECK_FUNCS(ttyname_r)
2693         AC_CHECK_FUNCS(psignal)
2694         AC_CHECK_FUNCS(getlogin_r)
2695         AC_CHECK_FUNCS(lockf)
2696         AC_CHECK_FUNCS(swab)
2697         AC_CHECK_FUNCS(setusershell endusershell)
2698         AC_CHECK_FUNCS(futimens utimensat)
2699         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2700         AC_CHECK_FUNCS(readv writev preadv pwritev)
2701         AC_CHECK_FUNCS(setpgid)
2702         AC_CHECK_FUNCS(system)
2703         AC_CHECK_FUNCS(fork execv execve)
2704         AC_CHECK_FUNCS(accept4)
2705         AC_CHECK_FUNCS(localtime_r)
2706         AC_CHECK_FUNCS(mkdtemp)
2707         AC_CHECK_SIZEOF(size_t)
2708         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2709                 [#include <sys/types.h>
2710                  #include <sys/stat.h>
2711                  #include <unistd.h>])
2712         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2713                 [#include <sys/types.h>
2714                  #include <sys/stat.h>
2715                  #include <unistd.h>])
2716         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2717                 [#include <sys/time.h>])
2718         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2719                 [#include <sys/socket.h>])
2720         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2721                 [#include <unistd.h>
2722                  #include <fcntl.h>])
2723         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2724                 [#include <sys/uio.h>])
2725         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2726                 [#include <sys/socket.h>])
2727         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2728                 [#include <sys/poll.h>])
2729         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2730                 [#include <sys/socket.h>])
2731         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2732                 [#include <sys/socket.h>])
2733         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2734                 [#include <netinet/in.h>])
2735         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2736                 [#include <netinet/in.h>])
2737         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2738                 [#include <sys/un.h>])
2739         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2740                 [#include <sys/types.h>
2741                  #include <sys/stat.h>
2742                  #include <unistd.h>])
2743         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2744                 [#include <time.h>])
2745         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2746                 [#include <sys/time.h>
2747                  #include <sys/types.h>
2748                  #include <utime.h>])
2749         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2750                 [#include <sys/time.h>])
2751         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2752                 [#include <sys/types.h>
2753                  #include <utime.h>])
2754         AC_CHECK_MEMBERS(
2755                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2756                 [#include <sys/types.h>
2757                  #include <dirent.h>])
2758         AC_CHECK_MEMBERS(
2759                 [struct passwd.pw_gecos],,, 
2760                 [#include <sys/types.h>
2761                  #include <pwd.h>])
2762         AC_CHECK_MEMBERS(
2763                 [struct statfs.f_flags],,, 
2764                 [#include <sys/types.h>
2765                  #include <sys/vfs.h>])
2766         AC_CHECK_MEMBERS(
2767                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2768                 [#include <sys/types.h>
2769                  #include <sys/stat.h>
2770                  #include <unistd.h>])
2772         dnl Favour xattr through glibc, but use libattr if we have to
2773         AC_CHECK_FUNC(lsetxattr, ,
2774                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2775         )
2776         AC_SUBST(XATTR_LIB)
2778         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2779         AC_CHECK_MEMBERS(
2780                 [struct kinfo_proc.kp_proc],,, 
2781                 [#include <sys/types.h>
2782                  #include <sys/param.h>
2783                  #include <sys/sysctl.h>
2784                  #include <sys/proc.h>
2785                  ])
2787         dnl *********************************
2788         dnl *** Checks for Windows compilation ***
2789         dnl *********************************
2790         AC_CHECK_HEADERS(sys/time.h)
2791         AC_CHECK_HEADERS(sys/param.h)
2792         AC_CHECK_HEADERS(dirent.h)
2794         dnl ******************************************
2795         dnl *** Checks for OSX and iOS compilation ***
2796         dnl ******************************************
2797         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2799         dnl *********************************
2800         dnl *** Check for Console 2.0 I/O ***
2801         dnl *********************************
2802         AC_CHECK_HEADERS([curses.h])
2803         AC_CHECK_HEADERS([term.h], [], [],
2804         [#if HAVE_CURSES_H
2805          #include <curses.h>
2806          #endif
2807         ])
2808         AC_CHECK_HEADERS([termios.h])
2810         dnl *********************************
2811         dnl *** Checks for random         ***
2812         dnl *********************************
2813         if test x$host_darwin = xno; then
2814                 AC_CHECK_HEADERS(sys/random.h)
2815                 AC_CHECK_FUNCS(getrandom getentropy)
2816         fi
2817 else
2818         dnl *********************************
2819         dnl *** Checks for Windows compilation ***
2820         dnl *********************************
2821         AC_CHECK_HEADERS(winternl.h)
2823         jdk_headers_found=no
2824         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
2825         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
2826         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
2827         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
2828         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
2829         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
2830         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
2832         dnl *********************************
2833         dnl *** Check for struct ip_mreqn ***
2834         dnl *********************************
2835         AC_MSG_CHECKING(for struct ip_mreqn)
2836         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2837                 struct ip_mreqn mreq;
2838                 mreq.imr_address.s_addr = 0;
2839         ], [
2840                 # Yes, we have it...
2841                 AC_MSG_RESULT(yes)
2842                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
2843         ], [
2844                 # We'll just have to try and use struct ip_mreq
2845                 AC_MSG_RESULT(no)
2846                 AC_MSG_CHECKING(for struct ip_mreq)
2847                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2848                         struct ip_mreq mreq;
2849                         mreq.imr_interface.s_addr = 0;
2850                 ], [
2851                         # Yes, we have it...
2852                         AC_MSG_RESULT(yes)
2853                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
2854                 ], [
2855                         # No multicast support
2856                         AC_MSG_RESULT(no)
2857                 ])
2858         ])
2860         dnl **********************************
2861         dnl *** Check for getaddrinfo ***
2862         dnl **********************************
2863         AC_MSG_CHECKING(for getaddrinfo)
2864                 AC_TRY_LINK([
2865                 #include <stdio.h>
2866                 #include <winsock2.h>
2867                 #include <ws2tcpip.h>
2868         ], [
2869                 getaddrinfo(NULL,NULL,NULL,NULL);
2870         ], [
2871                 # Yes, we have it...
2872                 AC_MSG_RESULT(yes)
2873                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2874         ], [
2875                 AC_MSG_RESULT(no)
2876         ])
2878         dnl **********************************
2879         dnl *** Check for gethostbyname ***
2880         dnl **********************************
2881         AC_MSG_CHECKING(for gethostbyname)
2882                 AC_TRY_LINK([
2883                 #include <stdio.h>
2884                 #include <winsock2.h>
2885                 #include <ws2tcpip.h>
2886         ], [
2887                 gethostbyname(NULL);
2888         ], [
2889                 # Yes, we have it...
2890                 AC_MSG_RESULT(yes)
2891                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2892         ], [
2893                 AC_MSG_RESULT(no)
2894         ])
2896         dnl **********************************
2897         dnl *** Check for getprotobyname ***
2898         dnl **********************************
2899         AC_MSG_CHECKING(for getprotobyname)
2900                 AC_TRY_LINK([
2901                 #include <stdio.h>
2902                 #include <winsock2.h>
2903                 #include <ws2tcpip.h>
2904         ], [
2905                 getprotobyname(NULL);
2906         ], [
2907                 # Yes, we have it...
2908                 AC_MSG_RESULT(yes)
2909                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2910         ], [
2911                 AC_MSG_RESULT(no)
2912         ])
2914         dnl **********************************
2915         dnl *** Check for getnameinfo ***
2916         dnl **********************************
2917         AC_MSG_CHECKING(for getnameinfo)
2918                 AC_TRY_LINK([
2919                 #include <stdio.h>
2920                 #include <winsock2.h>
2921                 #include <ws2tcpip.h>
2922         ], [
2923                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2924         ], [
2925                 # Yes, we have it...
2926                 AC_MSG_RESULT(yes)
2927                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2928         ], [
2929                 AC_MSG_RESULT(no)
2930         ])
2932         dnl **********************************
2933         dnl *** Check for inet_ntop ***
2934         dnl **********************************
2935         AC_MSG_CHECKING(for inet_ntop)
2936                 AC_TRY_LINK([
2937                 #include <stdio.h>
2938                 #include <winsock2.h>
2939                 #include <ws2tcpip.h>
2940         ], [
2941                 inet_ntop (0, NULL, NULL, 0);
2942         ], [
2943                 # Yes, we have it...
2944                 AC_MSG_RESULT(yes)
2945                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2946         ], [
2947                 AC_MSG_RESULT(no)
2948         ])
2950         dnl **********************************
2951         dnl *** Check for inet_pton ***
2952         dnl **********************************
2953         AC_MSG_CHECKING(for inet_pton)
2954                 AC_TRY_LINK([
2955                 #include <stdio.h>
2956                 #include <winsock2.h>
2957                 #include <ws2tcpip.h>
2958         ], [
2959                 #ifndef inet_pton
2960                 (void) inet_pton;
2961                 #endif
2962                 inet_pton (0, NULL, NULL);
2963         ], [
2964                 # Yes, we have it...
2965                 AC_MSG_RESULT(yes)
2966                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
2967         ], [
2968                 AC_MSG_RESULT(no)
2969         ])
2971         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
2972         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
2973         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
2974         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
2975         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
2976         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
2977         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
2980 dnl socklen_t check
2981 AC_MSG_CHECKING(for socklen_t)
2982 AC_TRY_COMPILE([
2983 #include <sys/types.h>
2984 #include <sys/socket.h>
2986   socklen_t foo;
2988 ac_cv_c_socklen_t=yes
2989         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
2990         AC_MSG_RESULT(yes)
2992         AC_MSG_RESULT(no)
2995 AC_MSG_CHECKING(for array element initializer support)
2996 AC_TRY_COMPILE([#include <sys/socket.h>], [
2997         const int array[] = {[1] = 2,};
2998 ], [
2999         # Yes, we have it...
3000         AC_MSG_RESULT(yes)
3001         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
3002 ], [
3003         # We'll have to use signals
3004         AC_MSG_RESULT(no)
3007 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
3008         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
3009         AC_TRY_LINK([#include <math.h>], 
3010         [ static void *p = &trunc; ],
3011         [
3012                 AC_DEFINE(HAVE_TRUNC) 
3013                 AC_MSG_RESULT(yes)
3014                 ac_cv_trunc=yes
3015         ],
3016         AC_MSG_RESULT(no)))
3018 if test "x$ac_cv_truncl" != "xyes"; then
3019    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
3022 AC_CHECK_FUNCS(execvp)
3024 dnl ****************************
3025 dnl *** Look for /dev/random ***
3026 dnl ****************************
3028 AC_MSG_CHECKING([if usage of random device is requested])
3029 AC_ARG_ENABLE(dev-random,
3030 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3031 try_dev_random=$enableval, try_dev_random=yes)
3033 AC_MSG_RESULT($try_dev_random)
3035 case "{$build}" in
3037 dnl IBM i does not have /dev/random, use unblocking only
3039     *-*-os400*)
3040     NAME_DEV_RANDOM="/dev/urandom"
3041     ;;
3043 dnl Win32 does not have /dev/random, they have their own method...
3045     *-mingw*|*-*-cygwin*)
3046     ac_cv_have_dev_random=no
3047     ;;
3049 dnl Everywhere else, it's /dev/random
3051     *)
3052     NAME_DEV_RANDOM="/dev/random"
3053     ;;
3054 esac
3056 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3058 dnl Now check if the device actually exists
3060 if test "x$try_dev_random" = "xyes"; then
3061     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3062     [if test -r "$NAME_DEV_RANDOM" ; then
3063         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3064     if test "x$ac_cv_have_dev_random" = "xyes"; then
3065         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3066     fi
3067 else
3068     AC_MSG_CHECKING(for random device)
3069     ac_cv_have_dev_random=no
3070     AC_MSG_RESULT(has been disabled)
3073 if test "x$host_win32" = "xyes"; then
3074     AC_DEFINE(HAVE_CRYPT_RNG)
3077 if test "x$ac_cv_have_dev_random" = "xno" \
3078     && test "x$host_win32" = "xno"; then
3079     AC_MSG_WARN([[
3081 *** A system-provided entropy source was not found on this system.
3082 *** Because of this, the System.Security.Cryptography random number generator
3083 *** will throw a NotImplemented exception.
3085 *** If you are seeing this message, and you know your system DOES have an
3086 *** entropy collection in place, please report an issue on GitHub and
3087 *** provide information about the system and how to access the random device.
3089 *** Otherwise you can install either egd or prngd and set the environment
3090 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3091 ***]])
3094 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)
3096 AC_MSG_CHECKING([if big-arrays are to be enabled])
3097 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)
3098 if test "x$enable_big_arrays" = "xyes" ; then
3099     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3100         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3101     else
3102         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3103     fi
3105 AC_MSG_RESULT($enable_big_arrays)
3107 dnl **************
3108 dnl *** DTRACE ***
3109 dnl **************
3111 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3113 if test "x$enable_dtrace" = "xyes"; then
3114    if test "x$has_dtrace" = "xno"; then
3115           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3116    fi
3117    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3118    if test "x$DTRACE" = "xno"; then
3119           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3120           enable_dtrace=no
3121    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3122           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3123           enable_dtrace=no
3124    fi
3127 dtrace_g=no
3128 if test "x$enable_dtrace" = "xyes"; then
3129         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3130         DTRACEFLAGS=
3131         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3132                 case "$host" in
3133                         powerpc-*-darwin*)
3134                         DTRACEFLAGS="-arch ppc64"
3135                         ;;
3136                         i*86-*-darwin*)
3137                         DTRACEFLAGS="-arch x86_64"
3138                         ;;
3139                         *)
3140                         DTRACEFLAGS=-64
3141                         ;;
3142                 esac
3143         else
3144                 case "$host" in
3145                         powerpc-*-darwin*)
3146                         DTRACEFLAGS="-arch ppc"
3147                         ;;
3148                         i*86-*-darwin*)
3149                         DTRACEFLAGS="-arch i386"
3150                         ;;
3151                         *)
3152                         DTRACEFLAGS=-32
3153                         ;;
3154                 esac
3155         fi
3156         AC_SUBST(DTRACEFLAGS)
3157         case "$host" in
3158                 *-*-solaris*)
3159                 dtrace_g=yes
3160                 ;;
3161         esac
3162         AC_CHECK_HEADERS([sys/sdt.h])
3164 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3165 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3167 dnl **************************
3168 dnl *** AOT cross offsets  ***
3169 dnl **************************
3171 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3172     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3174 dnl **************
3175 dnl ***  LLVM  ***
3176 dnl **************
3178 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3179 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3180 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)
3181 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3183 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3185 if test "x$enable_llvm" = "xdefault"; then
3186    enable_llvm=$enable_llvm_default
3189 if test "x$enable_llvm" = "xyes"; then
3190    if test "x$with_llvm" != "x"; then
3191           LLVM_CONFIG=$with_llvm/bin/llvm-config
3192           if test x$host_win32 = xyes; then
3193                 LLVM_CONFIG=$LLVM_CONFIG.exe
3194           fi
3195           if test ! -x $LLVM_CONFIG; then
3196                  AC_MSG_ERROR([LLVM executable $LLVM_CONFIG not found.])
3197       fi
3198    else
3199       AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
3200       if test "x$LLVM_CONFIG" = "xno"; then
3201              AC_MSG_ERROR([llvm-config not found.])
3202       fi
3203    fi
3205    llvm_codegen="x86codegen"
3206    case "$target" in
3207    arm*)
3208                 llvm_codegen="armcodegen"
3209                 ;;
3210    esac
3212    if test "x$host_win32" = "xno"; then
3214    # Should be something like '2.6' or '2.7svn'
3215    llvm_version=`$LLVM_CONFIG --version`
3216    llvm_api_version=`$LLVM_CONFIG --mono-api-version 2>/dev/null`
3217    AC_MSG_CHECKING(LLVM version)
3218    AC_MSG_RESULT($llvm_version $llvm_api_version)
3219    if echo $llvm_version | grep -q 'mono'; then
3220           if test "x$enable_llvm_version_check" = "xyes"; then
3221                  if test "$llvm_version" != "$expected_llvm_version"; then
3222                         AC_MSG_ERROR([Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version"])
3223                  fi
3224           fi
3225    else
3226           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.])
3227    fi
3229    # The output of --cflags seems to include optimizations flags too
3230    if test $llvm_api_version -gt 100; then
3231           # The --cflags argument includes all kinds of warnings -pendantic etc.
3232           LLVM_CFLAGS="-I$with_llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3233           LLVM_CXXFLAGS="-I$with_llvm/include -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3234    else
3235           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'`
3236       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'`
3237    fi
3238    # LLVM is compiled with -fno-rtti, so we need this too, since our classes inherit
3239    # from LLVM classes.
3240    LLVM_CXXFLAGS="$LLVM_CXXFLAGS -fno-rtti -fexceptions"
3241    LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
3242    # This might include empty lines
3243    LLVM_SYSTEM_LIBS=`$LLVM_CONFIG --system-libs 2>/dev/null | grep -- -`
3244    llvm_jit_supported=yes
3245    llvm_jit_libs="jit mcjit $llvm_codegen"
3246    if test "x$host" != "x$target"; then
3247       # No need for jit libs
3248           llvm_jit_supported=no
3249       llvm_jit_libs=""
3250    elif test $llvm_api_version -gt 100; then
3251       llvm_jit_libs="orcjit $llvm_codegen"
3252    fi
3253    LLVM_LIBS=`$LLVM_CONFIG --libs analysis core bitwriter $llvm_jit_libs`
3254    if test "x$LLVM_LIBS" = "x"; then
3255           echo "$LLVM_CONFIG --libs failed."
3256           exit 1
3257    fi
3258    LLVM_LIBS="$LLVM_LIBS $LLVM_LDFLAGS $LLVM_SYSTEM_LIBS"
3259    # The c++ standard library used by llvm doesn't show up in $LLVM_SYSTEM_LIBS so add it manually
3260    if echo $LLVM_CXXFLAGS | grep -q -- '-stdlib=libc++'; then
3261       LLVM_LIBS="$LLVM_LIBS -lc++"
3262    else
3263       LLVM_LIBS="$LLVM_LIBS -lstdc++"
3264    fi
3266    expected_llvm_version="3.4svn-mono-mono/e656cac"
3268    else
3269        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"
3270        LLVM_CXXFLAGS="$LLVM_CFLAGS -std=gnu++11 -fvisibility-inlines-hidden -fno-rtti -Woverloaded-virtual -Wcast-qual"
3271        LLVM_LDFLAGS="-L$with_llvm/lib"
3272        LLVM_SYSTEM_LIBS="-lshell32 -lpsapi -limagehlp -ldbghelp -lm"
3273        LLVM_LIBS="-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter \
3274          -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo \
3275          -lLLVMARMAsmPrinter -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler \
3276          -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc \
3277          -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMJIT \
3278          -lLLVMAnalysis -lLLVMTarget \
3279          -lLLVMIRReader -lLLVMAsmParser -lLLVMLineEditor -lLLVMMCAnalysis -lLLVMInstrumentation \
3280          -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils \
3281          -lLLVMipa -lLLVMAnalysis -lLLVMProfileData -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld \
3282          -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMExecutionEngine -lLLVMMC -lLLVMCore \
3283          -lLLVMSupport -lstdc++"
3284        LLVM_LIBS="$LLVM_LIBS $LLVM_SYSTEM_LIBS"
3286        llvm_config_path=$with_llvm/include/llvm/Config/llvm-config.h
3287        llvm_api_version=`awk '/MONO_API_VERSION/ { print $3 }' $llvm_config_path`
3288    fi  
3290    if test "x$llvm_api_version" = "x"; then
3291           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=0"
3292           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=0"
3293    else
3294           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3295           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3296    fi   
3298    AC_DEFINE_UNQUOTED(LLVM_VERSION, "$llvm_version", [Full version of LLVM libraries])
3300    AC_SUBST(LLVM_CFLAGS)
3301    AC_SUBST(LLVM_CXXFLAGS)
3302    AC_SUBST(LLVM_LIBS)
3303    AC_SUBST(LLVM_LDFLAGS)
3304    AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3307 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3308 if test "x$enable_loadedllvm" = "xyes"; then
3309    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3311 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3313 if test "x$enable_llvm" = "xyes"; then
3314    enable_llvm_runtime=yes
3316 if test "x$enable_llvm_runtime" = "xyes"; then
3317    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3319 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3321 TARGET="unknown"
3322 ACCESS_UNALIGNED="yes"
3324 LIBC="libc.so.6"
3325 INTL="libc.so.6"
3326 SQLITE="libsqlite.so.0"
3327 SQLITE3="libsqlite3.so.0"
3328 X11="libX11.so"
3329 GDKX11="libgdk-x11-2.0.so.0"
3330 GTKX11="libgtk-x11-2.0.so.0"
3331 XINERAMA="libXinerama.so.1"
3333 sizeof_register="SIZEOF_VOID_P"
3335 jit_wanted=true
3336 boehm_supported=true
3337 BTLS_SUPPORTED=no
3338 BTLS_PLATFORM=
3340 if test "x$enable_wasm" = "xyes"; then
3341 TARGET=WASM
3342 HOST=WASM
3343 arch_target=wasm
3344 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
3345 AC_DEFINE(HOST_WASM, 1, [Host wasm])
3346 BTLS_SUPPORTED=no
3347 with_tls=pthread
3348 target_mach=no
3350 else
3352 case "$host" in
3353         mips*)
3354                 TARGET=MIPS;
3355                 arch_target=mips;
3356                 with_tls=pthread;
3357                 ACCESS_UNALIGNED="no"
3359                 AC_MSG_CHECKING(for mips n32)
3360                 AC_TRY_COMPILE([],[
3361                 #if _MIPS_SIM != _ABIN32
3362                 #error Not mips n32
3363                 #endif
3364                 ],[
3365                 AC_MSG_RESULT(yes)
3366                 sizeof_register=8
3367                 ],[
3368                 AC_MSG_RESULT(no)
3369                 ])
3370                 ;;
3371         i*86-*-*)
3372                 TARGET=X86;
3373                 arch_target=x86;
3374                 case $host_os in
3375                   solaris*)
3376                         LIBC="libc.so"
3377                         INTL="libintl.so"
3378                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3379                                 TARGET=AMD64
3380                                 arch_target=amd64
3381                         fi
3383                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3384                         # int astruct __attribute__ ((visibility ("hidden")));
3385                         # void foo ()
3386                         # {
3387                         #       void *p = &astruct;
3388                         # }
3389                         # gcc -fPIC --shared -o libfoo.so foo.c
3390                         # yields:
3391                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3392                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3393                         have_visibility_hidden=no
3394                         ;;
3395                   mingw*|cygwin*)
3396                         have_visibility_hidden=no                 
3397                         ;;
3398                   haiku*)
3399                         LIBC=libroot.so
3400                         ;;
3401                   linux*)
3402                         AOT_SUPPORTED="yes"
3403                         BTLS_SUPPORTED=yes
3404                         BTLS_PLATFORM=i386
3405                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3406                         ;;
3407                   darwin*)
3408                         AOT_SUPPORTED="yes"
3409                         BTLS_SUPPORTED=yes
3410                         BTLS_PLATFORM=i386
3411                         ;;
3412                   openbsd*|freebsd*|kfreebsd-gnu*)
3413                         AOT_SUPPORTED="yes"
3414                         BTLS_SUPPORTED=yes
3415                         BTLS_PLATFORM=i386
3416                         ;;
3417                 esac
3418                 ;;
3419         x86_64-*-* | amd64-*-*)
3420                 TARGET=AMD64;
3421                 arch_target=amd64;
3422                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3423                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3424                         sizeof_register=8
3425                 fi
3426                 case $host_os in
3427                   linux*)
3428                         AOT_SUPPORTED="yes"
3429                         BTLS_SUPPORTED=yes
3430                         BTLS_PLATFORM=x86_64
3431                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3432                         ;;
3433                   darwin*)
3434                         AOT_SUPPORTED="yes"
3435                         BTLS_SUPPORTED=yes
3436                         BTLS_PLATFORM=x86_64
3437                         boehm_supported=false
3438                         ;;
3439                   openbsd*|freebsd*|kfreebsd-gnu*)
3440                         AOT_SUPPORTED="yes"
3441                         BTLS_SUPPORTED=yes
3442                         BTLS_PLATFORM=x86_64
3443                         ;;
3444                   mingw*)
3445                         ;;
3446                 esac
3447                 ;;
3448         sparc*-*-*)
3449                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3450                    TARGET=SPARC64
3451                 else
3452                         TARGET=SPARC
3453                 fi
3454                 arch_target=sparc;
3455                 ACCESS_UNALIGNED="no"
3456                 case $host_os in
3457                   linux*) ;;
3458                   *)
3459                         LIBC="libc.so"
3460                         INTL="libintl.so"
3461                 esac
3462                 if test x"$GCC" = xyes; then
3463                         # We don't support v8 cpus
3464                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3465                 fi
3466                 if test x"$AR" = xfalse; then
3467                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3468                 fi
3469                 ;;
3470         *-mingw*|*-*-cygwin*)
3471                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3472                 have_visibility_hidden=no
3473                 INTL="intl"
3474                 ;;
3475         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3476         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3477         powerpc-*-freebsd* | powerpc-*-aix* | powerpc-*-os400* )
3478                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3479                         TARGET=POWERPC64;
3480                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3481                         CFLAGS="$CFLAGS -mminimal-toc"
3482                 else
3483                         TARGET=POWERPC;
3484                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3485                 fi
3486                 arch_target=ppc;
3487                 case $host_os in
3488                   aix*|os400*)
3489                         BTLS_SUPPORTED=yes
3490                         BTLS_PLATFORM=powerpc
3491                         dnl on AIX/PASE, shared libraries can be inside archives
3492                         dnl if they are, we specify them by lib.a(lib.so)
3493                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
3494                         LIBC="libc.a(shr_64.o)"
3495                         INTL="libintl.a(libintl.so.8)"
3496                         ;;
3497                   linux*)
3498                         BTLS_SUPPORTED=yes
3499                         BTLS_PLATFORM=powerpc
3500                         ;;
3501                 esac
3502                 ;;
3503         armv7k-*-darwin*)
3504                 TARGET=ARM;
3505                 TARGET_SYS=WATCHOS
3506                 arch_target=arm;
3507                 arm_fpu=VFP_HARD
3508                 ACCESS_UNALIGNED="no"
3509                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3510                 ;;
3512         arm*-darwin*)
3513                 TARGET=ARM;
3514                 arch_target=arm;
3515                 ACCESS_UNALIGNED="no"
3516                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3517                 ;;
3518         arm*-linux*)
3519                 TARGET=ARM;
3520                 arch_target=arm;
3521                 ACCESS_UNALIGNED="no"
3522                 AOT_SUPPORTED="yes"
3523                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3524                 BTLS_SUPPORTED=yes
3525                 BTLS_PLATFORM=arm
3526                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3527                 case "$target" in
3528                 arm*-linux*-gnueabi)
3529                         BTLS_PLATFORM=armsoft
3530                         ;;
3531                 esac
3532                 ;;
3533         arm*-netbsd*-eabi*)
3534                 TARGET=ARM;
3535                 arch_target=arm;
3536                 ACCESS_UNALIGNED="no"
3537                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3538                 ;;
3539         aarch64-*)
3540                 # https://lkml.org/lkml/2012/7/15/133
3541                 TARGET=ARM64
3542                 arch_target=arm64
3543                 boehm_supported=false
3544                 AOT_SUPPORTED="yes"
3545                 BTLS_SUPPORTED=yes
3546                 BTLS_PLATFORM=aarch64
3547                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3548                 ;;
3549         s390x-*-linux*)
3550                 TARGET=S390X;
3551                 arch_target=s390x;
3552                 ACCESS_UNALIGNED="yes"
3553                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
3554                 ;;
3555 esac
3557 HOST=$TARGET
3559 if test "x$host" != "x$target"; then
3560    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
3561    enable_mcs_build=no
3562    enable_support_build=no
3563    BTLS_SUPPORTED=no
3564    case "$target" in
3565    arm*-darwin*)
3566                 TARGET=ARM;
3567                 arch_target=arm;
3568                 ACCESS_UNALIGNED="no"
3569                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3570                 # Can't use tls, since it depends on the runtime detection of tls offsets
3571                 # in mono-compiler.h
3572                 with_tls=pthread
3573                 case "$target" in
3574                 armv7k-*)
3575                         arm_fpu=VFP_HARD
3576                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
3577                         ;;
3578                 esac            
3579                 ;;
3580    powerpc64-ps3-linux-gnu)
3581                 TARGET=POWERPC64
3582                 arch_target=powerpc64
3583                 AC_DEFINE(TARGET_PS3, 1, [...])
3584                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3585                 # uses this define
3586                 AC_DEFINE(__mono_ppc64__, 1, [...])
3587                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3588                 sizeof_register=8
3589                 target_byte_order=G_BIG_ENDIAN
3590                 ;;
3591    powerpc64-xbox360-linux-gnu)
3592                 TARGET=POWERPC64
3593                 arch_target=powerpc64
3594                 AC_DEFINE(TARGET_XBOX360, 1, [...])
3595                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3596                 # uses this define
3597                 sizeof_register=8
3598                 target_byte_order=G_BIG_ENDIAN
3599                 ;;
3600    arm*-linux-*)
3601                 TARGET=ARM;
3602                 arch_target=arm;
3603                 AC_DEFINE(TARGET_ARM, 1, [...])
3604                 ACCESS_UNALIGNED="no"
3605                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3606                 # Can't use tls, since it depends on the runtime detection of tls offsets
3607                 # in mono-compiler.h
3608                 with_tls=pthread
3609                 target_mach=no
3610                 case "$target" in
3611                 armv7l-unknown-linux-gnueabi*)
3612                         # TEGRA
3613                         CPPFLAGS="$CPPFLAGS"
3614                         ;;
3615                 armv5-*-linux-androideabi*)
3616                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3617                         CPPFLAGS="$CPPFLAGS"
3618                         ;;
3619                 *-linux-androideabi*)
3620                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3621                         CPPFLAGS="$CPPFLAGS"
3622                         ;;
3623                 esac
3624                 ;;
3625    arm*-netbsd*-eabi*)
3626                 TARGET=ARM;
3627                 arch_target=arm;
3628                 AC_DEFINE(TARGET_ARM, 1, [...])
3629                 ACCESS_UNALIGNED="no"
3630                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3631                 # Can't use tls, since it depends on the runtime detection of tls offsets
3632                 # in mono-compiler.h
3633                 with_tls=pthread
3634                 target_mach=no
3635                 ;;
3636    i686*-linux-*)
3637                 TARGET=X86;
3638                 arch_target=x86;
3639                 AC_DEFINE(TARGET_X86, 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
3646                 case "$target" in
3647                 *-linux-android*)
3648                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3649                         ;;
3650                 esac
3651                 ;;
3652    x86_64*-linux-*)
3653                 TARGET=AMD64;
3654                 arch_target=amd64;
3655                 AC_DEFINE(TARGET_AMD64, 1, [...])
3656                 CPPFLAGS="$CPPFLAGS"
3657                 # Can't use tls, since it depends on the runtime detection of tls offsets
3658                 # in mono-compiler.h
3659                 with_tls=pthread
3660                 target_mach=no
3662                 case "$target" in
3663                 *-linux-android*)
3664                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3665                         ;;
3666                 esac
3667                 ;;
3668    x86_64-ps4-freebsd)
3669                 TARGET=AMD64;
3670                 arch_target=amd64;
3671                 AC_DEFINE(TARGET_AMD64, 1, [...])
3672                 AC_DEFINE(TARGET_PS4, 1, [...])
3673                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
3674                 CPPFLAGS="$CPPFLAGS"
3675                 # Can't use tls, since it depends on the runtime detection of tls offsets
3676                 # in mono-compiler.h
3677                 with_tls=pthread
3678                 target_mach=no
3679                 target_win32=no
3680                 ;;
3681    aarch64*-linux-*)
3682                 TARGET=ARM64;
3683                 arch_target=arm64;
3684                 AC_DEFINE(TARGET_ARM64, 1, [...])
3685                 CPPFLAGS="$CPPFLAGS"
3686                 # Can't use tls, since it depends on the runtime detection of tls offsets
3687                 # in mono-compiler.h
3688                 with_tls=pthread
3689                 target_mach=no
3690                 case "$target" in
3691                 *-linux-android*)
3692                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3693                         ;;
3694                 esac
3695                 ;;
3696         aarch64-*)
3697                 TARGET=ARM64
3698                 ;;
3699         *)
3700                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
3701         esac
3704 case "$TARGET" in
3705 X86)
3706         AC_DEFINE(TARGET_X86, 1, [...])
3707         ;;
3708 AMD64)
3709         AC_DEFINE(TARGET_AMD64, 1, [...])
3710         ;;
3711 ARM)
3712         AC_DEFINE(TARGET_ARM, 1, [...])
3713         ;;
3714 ARM64)
3715         AC_DEFINE(TARGET_ARM64, 1, [...])
3716         ;;
3717 POWERPC)
3718         AC_DEFINE(TARGET_POWERPC, 1, [...])
3719         ;;
3720 POWERPC64)
3721         AC_DEFINE(TARGET_POWERPC, 1, [...])
3722         AC_DEFINE(TARGET_POWERPC64, 1, [...])
3723         ;;
3724 S390X)
3725         AC_DEFINE(TARGET_S390X, 1, [...])
3726         ;;
3727 MIPS)
3728         AC_DEFINE(TARGET_MIPS, 1, [...])
3729         ;;
3730 SPARC)
3731         AC_DEFINE(TARGET_SPARC, 1, [...])
3732         ;;
3733 SPARC64)
3734         AC_DEFINE(TARGET_SPARC64, 1, [...])
3735         ;;
3736 esac
3738 case "$HOST" in
3739 X86)
3740         AC_DEFINE(HOST_X86, 1, [...])
3741         ;;
3742 AMD64)
3743         AC_DEFINE(HOST_AMD64, 1, [...])
3744         ;;
3745 ARM)
3746         AC_DEFINE(HOST_ARM, 1, [...])
3747         ;;
3748 ARM64)
3749         AC_DEFINE(HOST_ARM64, 1, [...])
3750         ;;
3751 POWERPC)
3752         AC_DEFINE(HOST_POWERPC, 1, [...])
3753         ;;
3754 POWERPC64)
3755         AC_DEFINE(HOST_POWERPC, 1, [...])
3756         AC_DEFINE(HOST_POWERPC64, 1, [...])
3757         ;;
3758 S390X)
3759         AC_DEFINE(HOST_S390X, 1, [...])
3760         ;;
3761 MIPS)
3762         AC_DEFINE(HOST_MIPS, 1, [...])
3763         ;;
3764 SPARC)
3765         AC_DEFINE(HOST_SPARC, 1, [...])
3766         ;;
3767 SPARC64)
3768         AC_DEFINE(HOST_SPARC64, 1, [...])
3769         ;;
3770 esac
3772 #WASM hack
3776 dnl *************
3777 dnl *** VTUNE ***
3778 dnl *************
3780 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
3781 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
3783 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
3785 if test "x$enable_vtune" = "xyes"; then
3786         if test "x$with_vtune" = "x"; then
3787                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
3788         else
3789                 VTUNE_PATH=$with_vtune
3790         fi
3791         VTUNE_INCLUDE=$VTUNE_PATH/include
3792         case "$TARGET" in
3793         X86)
3794                 VTUNE_LIB=$VTUNE_PATH/lib32
3795                 ;;
3796         AMD64)
3797                 VTUNE_LIB=$VTUNE_PATH/lib64
3798                 ;;
3799         *)
3800                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
3801                 ;;
3802         esac
3803         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
3804                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
3805         fi
3806         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
3807                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
3808         fi
3810         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
3811         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
3813         AC_SUBST(VTUNE_LIBS)
3814         AC_SUBST(VTUNE_CFLAGS)
3816 dnl Use GCC atomic ops if they work on the target.
3817 if test x$GCC = "xyes"; then
3818         case $TARGET in
3819         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
3820                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
3821                 ;;
3822         esac
3825 if test "x$target_mach" = "xyes"; then
3827    if test "x$TARGET_SYS" = "xWATCHOS"; then
3828           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
3829           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3830           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3831           BTLS_SUPPORTED=no
3832    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
3833           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3834           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3835           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3836           BTLS_SUPPORTED=no
3837    else
3838        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
3839        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
3840        #error fail this for ios
3841        #endif
3842        ], [
3843                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
3844           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
3845           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
3846           target_osx=yes
3847        ], [
3848           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3849           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3850           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3851           BTLS_SUPPORTED=no
3852                   target_ios=yes
3853        ])
3854         fi
3855    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
3858 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
3860 if test "x$sizeof_register" = "x4"; then
3861    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
3862 elif test "x$sizeof_register" = "x8"; then
3863    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
3864 else
3865    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
3868 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
3870 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
3871    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
3872 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
3873    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
3874 else
3875    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
3878 if test "x$have_visibility_hidden" = "xyes"; then
3879    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
3882 if test "x$have_deprecated" = "xyes"; then
3883    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
3886 dnl 
3887 dnl Simple Generational checks (sgen)
3889 SGEN_DEFINES=
3890 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
3891 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
3892 if test x$buildsgen = xyes; then
3893    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
3894    SGEN_DEFINES="-DHAVE_SGEN_GC"
3896         conc_gc_msg=""
3897    if test x$with_sgen_default_concurrent != xno; then
3898        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
3899            conc_gc_msg=" (concurrent by default)"
3900    fi
3902    if test "x$gc_msg" = "x"; then
3903       gc_msg="sgen$conc_gc_msg"
3904    else
3905       gc_msg="sgen$conc_gc_msg and $gc_msg"
3906    fi
3908 AC_SUBST(SGEN_DEFINES)
3909 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
3911 jit_status="Building and using the JIT"
3913 libsuffix=".so"
3915 case "$host" in
3916      *-*-darwin*)
3917         libsuffix=".dylib"
3918         LIBC="libc.dylib"
3919         INTL="libintl.dylib"
3920         SQLITE="libsqlite.0.dylib"
3921         SQLITE3="libsqlite3.0.dylib"
3922         X11="libX11.dylib"
3923         GDKX11="libgdk-x11-2.0.dylib"
3924         GTKX11="libgtk-x11-2.0.dylib"
3925         ;;
3926      *-*-*netbsd*)
3927         LIBC="libc.so"
3928         INTL="libintl.so"
3929         SQLITE="libsqlite.so"
3930         SQLITE3="libsqlite3.so"
3931         ;;
3932      *-*-kfreebsd*-gnu)
3933         LIBC="libc.so.0.1"
3934         INTL="libc.so.0.1"
3935         X11="libX11.so.6"
3936         ;;
3937     *-*-*freebsd*)
3938         LIBC="libc.so.7"
3939         INTL="libintl.so"
3940         SQLITE="libsqlite.so"
3941         SQLITE3="libsqlite3.so"
3942         ;;
3943     *-*-*openbsd*)
3944         LIBC="libc.so"
3945         INTL="libintl.so"
3946         SQLITE="libsqlite.so"
3947         SQLITE3="libsqlite3.so"
3948         ;;
3949     *-*-*linux*)
3950         AC_PATH_X
3951         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
3952         AC_MSG_CHECKING(for the soname of libX11.so)
3953         for i in $x_libraries $dlsearch_path; do
3954                 for r in 4 5 6; do
3955                         if test -f $i/libX11.so.$r; then
3956                                 X11=libX11.so.$r
3957                                 AC_MSG_RESULT($X11)
3958                         fi
3959                 done
3960         done
3961         
3962         if test "x$X11" = "xlibX11.so"; then
3963                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
3964                 X11=libX11.so.6
3965         fi
3966         ;;
3967 esac
3969 AC_SUBST(libsuffix)
3971 ######################################
3972 # EGLIB CHECKS
3973 ######################################
3975 GNUC_PRETTY=
3976 GNUC_UNUSED=
3977 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
3978 if test x$GCC = xyes; then
3979    GNUC_UNUSED='__attribute__((__unused__))'
3980    GNUC_NORETURN='__attribute__((__noreturn__))'
3981    case $host_cpu in
3982      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
3983    esac
3985 AC_SUBST(GNUC_PRETTY)
3986 AC_SUBST(GNUC_UNUSED)
3987 AC_SUBST(GNUC_NORETURN)
3988 AC_SUBST(BREAKPOINT)
3990 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
3992 case $host in
3993 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
3994     PATHSEP='\\'
3995     SEARCHSEP=';'
3996     OS="WIN32"
3997     PIDTYPE='void *'
3998     ;;
4000     PATHSEP='/'
4001     SEARCHSEP=':'
4002     OS="UNIX"
4003     PIDTYPE='int'
4004     ;;
4005 esac
4007 case $host in
4008         *-*-solaris*)
4009         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4010         ;;
4011 esac
4013 case $target in
4014 arm*-darwin*|aarch64*-*)
4015     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4016     ;;
4017 i*86-*-darwin*)
4018     ORDER=G_LITTLE_ENDIAN
4019     ;;
4020 *-*-haiku*)
4021     LDFLAGS="$LDFLAGS -ltextencoding"
4022     ;;
4023 *-*-openbsd*)
4024     CFLAGS="$CFLAGS -pthread"
4025     LDFLAGS="$LDFLAGS -pthread"
4026     ;;
4027 esac
4029 AC_SUBST(ORDER)
4030 AC_SUBST(CFLAGS)
4031 AC_SUBST(PATHSEP)
4032 AC_SUBST(SEARCHSEP)
4033 AC_SUBST(OS)
4034 AC_SUBST(PIDTYPE)
4036 # Defined for all targets/platforms using classic Windows API support.
4037 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4038 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4040 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf strerror_r)
4041 AC_CHECK_FUNCS(getrlimit)
4042 AC_CHECK_FUNCS(fork execv execve)
4044 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4046 if test x$with_overridable_allocators = xyes; then
4047         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4048   AC_MSG_NOTICE([Overridable allocator support enabled])
4049 else
4050   AC_MSG_NOTICE([Overridable allocator support disabled])
4054 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4055 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4056 # removed once support for 10.6 is dropped.
4058 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4060 if test x$target_osx = xyes; then
4061 AC_CHECK_FUNCS(getpwuid_r)
4062 elif test x$target_ios = xno; then
4063 AC_CHECK_FUNCS(strndup getpwuid_r)
4066 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4067 AM_ICONV()
4068 AC_SEARCH_LIBS(sqrtf, m)
4070 # nanosleep may not be part of libc, also search it in other libraries
4071 AC_SEARCH_LIBS(nanosleep, rt)
4073 AC_SEARCH_LIBS(dlopen, dl)
4074 old_ldflags="${LDFLAGS}"
4075 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4076 if test $lt_cv_prog_gnu_ld = yes; then
4077         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4078 else
4079         case $host in
4080         *-*-aix*|*-*-os400*)
4081                 ;;
4082         *)
4083                 dnl Try to use export-dynamic anyways
4084                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4085                 ;;
4086         esac
4088 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4089 if test $found_export_dynamic = no; then
4090         LDFLAGS="${old_ldflags}"
4093 AC_MSG_CHECKING(for varargs macros)
4094 AC_TRY_COMPILE([],[
4095 int foo (int i, int j);
4096 #define bar(...) foo (1, __VA_ARGS__)
4097 void main () {
4098          bar (2);
4100 ],have_iso_varargs=yes,have_iso_varargs=no)
4101 AC_MSG_RESULT($have_iso_varargs)
4102 G_HAVE_ISO_VARARGS=0
4103 if test "x$have_iso_varargs" = "xyes"; then
4104    G_HAVE_ISO_VARARGS=1
4106 AC_SUBST(G_HAVE_ISO_VARARGS)
4108 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)
4109 AC_CHECK_LIB([iconv], [locale_charset],[],[AC_CHECK_LIB([charset], [locale_charset],[LIBS+=" -liconv -lcharset"])])
4110 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4111 AC_SUBST(HAVE_ALLOCA_H)
4113 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_int; then
4114    GPOINTER_TO_INT="((gint) (ptr))"
4115    GPOINTER_TO_UINT="((guint) (ptr))"
4116    GINT_TO_POINTER="((gpointer) (v))"
4117    GUINT_TO_POINTER="((gpointer) (v))"
4118    GSIZE="int"
4119    GSIZE_FORMAT='"u"'
4120 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long; then
4121    GPOINTER_TO_INT="((gint)(long) (ptr))"
4122    GPOINTER_TO_UINT="((guint)(long) (ptr))"
4123    GINT_TO_POINTER="((gpointer)(glong) (v))"
4124    GUINT_TO_POINTER="((gpointer)(gulong) (v))"
4125    GSIZE="long"
4126    GSIZE_FORMAT='"lu"'
4127 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long_long; then
4128    GPOINTER_TO_INT="((gint)(long long) (ptr))"
4129    GPOINTER_TO_UINT="((guint)(unsigned long long) (ptr))"
4130    GINT_TO_POINTER="((gpointer)(long long) (v))"
4131    GUINT_TO_POINTER="((gpointer)(unsigned long long) (v))"
4132    GSIZE="long long"
4133    GSIZE_FORMAT='"I64u"'
4134 else
4135    AC_MSG_ERROR([unsupported pointer size])
4138 AC_SUBST(GPOINTER_TO_INT)
4139 AC_SUBST(GPOINTER_TO_UINT)
4140 AC_SUBST(GINT_TO_POINTER)
4141 AC_SUBST(GUINT_TO_POINTER)
4142 AC_SUBST(GSIZE)
4143 AC_SUBST(GSIZE_FORMAT)
4144 AC_SUBST(G_GUINT64_FORMAT)
4145 AC_SUBST(G_GINT64_FORMAT)
4146 AC_SUBST(G_GUINT32_FORMAT)
4147 AC_SUBST(G_GINT32_FORMAT)
4150 # END OF EGLIB CHECKS
4153 AC_ARG_WITH([libgdiplus],
4154         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4155         [], [with_libgdiplus=installed])
4157 # default install location
4158 libgdiplus_install_loc=libgdiplus${libsuffix}
4159 case "$host" in
4160     *-*-*linux*)
4161     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4162     ;;
4163 esac
4165 case $with_libgdiplus in
4166     no)
4167     libgdiplus_loc=
4168     ;;
4170     installed)
4171     libgdiplus_loc=
4172     if test x$cross_compiling = xno; then
4173         if test x$host_darwin = xyes; then
4174             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4175             if test -x $a; then
4176               libgdiplus_install_loc=$a
4177               libgdiplus_loc=$a
4178             fi
4179         fi
4180     fi
4181     ;;
4183     yes|sibling)
4184     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4185     ;;
4187     /*) # absolute path, assume it is an install location
4188     libgdiplus_loc=$with_libgdiplus
4189     libgdiplus_install_loc=$with_libgdiplus
4190     ;;
4192     *)
4193     libgdiplus_loc=`pwd`/$with_libgdiplus
4194     ;;
4195 esac
4196 AC_SUBST(libgdiplus_loc)
4197 AC_SUBST(libgdiplus_install_loc)
4199 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)
4200 if test "x$icall_symbol_map" = "xyes"; then
4201    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4204 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4205 if test "x$icall_export" = "xyes"; then
4206    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4209 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4210 if test "x$icall_tables" = "xno"; then
4211    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4214 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4216 if test "x$with_tls" = "x__thread"; then
4217         AC_DEFINE(HAVE_KW_THREAD, 1, [Have __thread keyword])
4218         # Pass the information to libgc
4219         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4220         AC_MSG_CHECKING(if the tls_model attribute is supported)
4221         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4222                 ], [
4223                         AC_MSG_RESULT(yes)
4224                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4225                 ], [
4226                         AC_MSG_RESULT(no)
4227         ])
4230 if test ${TARGET} = ARM; then
4231         dnl ******************************************
4232         dnl *** Check to see what FPU is available ***
4233         dnl ******************************************
4234         AC_MSG_CHECKING(which FPU to use)
4236         #
4237         # This is a bit tricky:
4238         #
4239         # if (__ARM_PCS_VFP) {
4240         #       /* mfloat-abi=hard == VFP with hard ABI */
4241         # } elif (!__SOFTFP__) {
4242         #       /* mfloat-abi=softfp == VFP with soft ABI */
4243         # } else {
4244         #       /* mfloat-abi=soft == no VFP */
4245         # }
4246         #
4247         # The exception is iOS (w/ GCC) where none of the above
4248         # are defined (but iOS always uses the 'softfp' ABI).
4249         #
4250         # No support for FPA.
4251         #
4253         fpu=NONE
4255         # iOS GCC always uses the 'softfp' ABI.
4256         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4257                 fpu=VFP
4258         fi
4260         # Are we using the 'hard' ABI?
4261         if test x$fpu = xNONE; then
4262                 AC_TRY_COMPILE([], [
4263                         #ifndef __ARM_PCS_VFP
4264                         #error "Float ABI is not 'hard'"
4265                         #endif
4266                 ], [
4267                         fpu=VFP_HARD
4268                 ], [
4269                         fpu=NONE
4270                 ])
4271         fi
4273         # No 'hard' ABI. 'soft' or 'softfp'?
4274         if test x$fpu = xNONE; then
4275                 AC_TRY_COMPILE([], [
4276                         #ifdef __SOFTFP__
4277                         #error "Float ABI is not 'softfp'"
4278                         #endif
4279                 ], [
4280                         fpu=VFP
4281                 ], [
4282                         fpu=NONE
4283                 ])
4284         fi
4286         if test x$arm_fpu != x; then
4287            fpu=$arm_fpu
4288         fi
4290         AC_MSG_RESULT($fpu)
4291         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4292         unset fpu
4294         dnl *********************************************
4295         dnl *** Check which ARM version(s) we can use ***
4296         dnl *********************************************
4297         AC_MSG_CHECKING(which ARM version to use)
4299         AC_TRY_COMPILE([], [
4300                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4301                 #error Not on ARM v5.
4302                 #endif
4303         ], [
4304                 arm_v5=yes
4306                 arm_ver=ARMv5
4307         ], [])
4309         AC_TRY_COMPILE([], [
4310                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4311                 #error Not on ARM v6.
4312                 #endif
4313         ], [
4314                 arm_v5=yes
4315                 arm_v6=yes
4317                 arm_ver=ARMv6
4318         ], [])
4320         AC_TRY_COMPILE([], [
4321                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4322                 #error Not on ARM v7.
4323                 #endif
4324         ], [
4325                 arm_v5=yes
4326                 arm_v6=yes
4327                 arm_v7=yes
4329                 arm_ver=ARMv7
4330         ], [])
4332         AC_MSG_RESULT($arm_ver)
4334         if test x$arm_v5 = xyes; then
4335                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4336                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4337         fi
4339         if test x$arm_v6 = xyes; then
4340                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4341                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4342         fi
4344         if test x$arm_v7 = xyes; then
4345                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4346                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4347         fi
4350 if test ${TARGET} = unknown; then
4351         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4352         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4355 if test "x$platform_android" = "xyes"; then
4356         case "x${TARGET}" in
4357         xARM)
4358                 case "x$arm_ver" in
4359                 xARMv5)
4360                         BTLS_SUPPORTED=yes
4361                         BTLS_PLATFORM=android-armv5
4362                         ;;
4363                 xARMv6)
4364                         BTLS_SUPPORTED=yes
4365                         BTLS_PLATFORM=android-armv6
4366                         ;;
4367                 xARMv7)
4368                         BTLS_SUPPORTED=yes
4369                         BTLS_PLATFORM=android-armv7
4370                         ;;
4371                 *)
4372                         BTLS_SUPPORTED=no
4373                         ;;
4374                 esac
4375                 ;;
4376         xARM64)
4377                 BTLS_SUPPORTED=yes
4378                 BTLS_PLATFORM=android-v8a
4379                 ;;
4380         xX86)
4381                 BTLS_SUPPORTED=yes
4382                 BTLS_PLATFORM=android-x86
4383                 ;;
4384         xAMD64)
4385                 BTLS_SUPPORTED=yes
4386                 BTLS_PLATFORM=android-x64
4387                 ;;
4388         *)
4389                 BTLS_SUPPORTED=no
4390                 ;;
4391         esac
4394 if test ${ACCESS_UNALIGNED} = no; then
4395         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4398 if test x$host_darwin = xyes; then
4399         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4400         AS_IF(
4401                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4402                 [AC_MSG_RESULT([no])],
4403                 [
4404                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4405                         AR_FLAGS="Scru"
4406                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4407                         AC_MSG_RESULT([yes])
4408                 ]
4409         )
4412 case "x$libgc" in
4413         xincluded)
4414                 # Pass CPPFLAGS to libgc configure
4415                 # We should use a separate variable for this to avoid passing useless and
4416                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4417                 # This should be executed late so we pick up the final version of CPPFLAGS
4418                 # The problem with this approach, is that during a reconfigure, the main
4419                 # configure scripts gets invoked with these arguments, so we use separate
4420                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4421                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4422                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4423                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4424                 fi
4425                 # Don't pass -finstrument-for-thread-suspension in, 
4426                 # if these are instrumented it will be very bad news 
4427                 # (infinite recursion, undefined parking behavior, etc)
4428                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4429                 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\""
4430                 if test "x$support_boehm" = "xyes"; then
4431                         AC_CONFIG_SUBDIRS(libgc)
4432                 fi
4433                 ;;
4434 esac
4436 MALLOC_MEMPOOLS=no
4437 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4438         if test x$with_malloc_mempools = xyes; then
4439                 MALLOC_MEMPOOLS=yes
4440                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4441         fi
4445 DISABLE_MCS_DOCS=default
4446 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4447         if test x$with_mcs_docs != xyes; then
4448                 DISABLE_MCS_DOCS=yes
4449         fi
4451 if test -n "$INSTALL_4_x_TRUE"; then :
4452         DISABLE_MCS_DOCS=yes
4454 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4455    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4458 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)],[
4459         if test x$with_lazy_gc_thread_creation != xno ; then
4460                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4461         fi
4462 ], [with_lazy_gc_thread_creation=no])
4464 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])
4466 if test x$with_cooperative_gc = xdefault; then
4467         with_cooperative_gc=$with_cooperative_gc_default
4470 if test x$with_cooperative_gc != xno; then
4471         AC_DEFINE(USE_COOP_GC,1,[Enable cooperative stop-the-world garbage collection.])
4474 AM_CONDITIONAL([ENABLE_COOP], [test x$with_cooperative_gc != xno])
4476 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],[
4478         if test x$enable_checked_build != x ; then
4479                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
4480         fi
4481         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
4482                 eval "mono_checked_build_test_enable_$feature='yes'"
4483         done
4485         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
4486                 eval "mono_checked_build_test_enable_gc='yes'"
4487                 eval "mono_checked_build_test_enable_metadata='yes'"
4488                 eval "mono_checked_build_test_enable_thread='yes'"
4489                 eval "mono_checked_build_test_enable_private_types='yes'"
4490         fi
4492         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
4493                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
4494         fi
4496         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
4497                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
4498         fi
4500         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
4501                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
4502         fi
4504         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
4505                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
4506         fi
4507 ], [])
4509 AC_CHECK_HEADER([malloc.h], 
4510                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
4511                         [Define to 1 if you have /usr/include/malloc.h.])],,)
4513 if test x"$GCC" = xyes; then
4514         # Implicit function declarations are not 64 bit safe
4515         # Do this late, since this causes lots of configure tests to fail
4516         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
4517         # jay has a lot of implicit declarations
4518         JAY_CFLAGS="-Wno-implicit-function-declaration"
4521 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
4522 # instead of libmono-static.a
4523 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
4524    LIBMONO_LA=libmini-static.la
4525 else
4526    if test x$buildsgen = xyes; then
4527       LIBMONO_LA=libmonosgen-$API_VER.la
4528    else
4529       LIBMONO_LA=libmonoboehm-$API_VER.la
4530    fi
4532 AC_SUBST(LIBMONO_LA)
4534 dnl **************
4535 dnl ***  Btls  ***
4536 dnl **************
4538 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
4539 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
4541 AM_CONDITIONAL(BTLS, test x$enable_btls = xyes)
4543 btls_android=no
4544 if test "x$enable_btls" = "xyes"; then
4545         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
4546         if test "x$CMAKE" = "xno"; then
4547                 AC_MSG_ERROR("cmake not found")
4548         fi
4550         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
4551         AC_SUBST(BTLS_ROOT)
4553         btls_arch=
4554         btls_cflags=
4555         BTLS_CMAKE_ARGS=
4557         case "$BTLS_PLATFORM" in
4558         i386)
4559                 btls_arch=i386
4560                 btls_cflags="-m32"
4561                 case $host_os in
4562                         darwin*)
4563                                 btls_cflags="$btls_cflags -arch i386"
4564                 esac
4565                 ;;
4566         x86_64)
4567                 btls_arch=x86_64
4568                 ;;
4569         arm)
4570                 btls_arch=arm
4571                 ;;
4572         armsoft)
4573                 btls_arch=arm
4574                 btls_cflags="-DOPENSSL_NO_ASM=1"
4575                 ;;
4576         aarch64)
4577                 btls_arch=aarch64
4578                 ;;
4579         powerpc)
4580                 btls_arch=powerpc
4581                 case $host_os in
4582                         aix*|os400*)
4583                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
4584                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
4585                 esac
4586                 ;;
4587         android-armv5)
4588                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4589                 ;;
4590         android-armv6)
4591                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4592                 ;;
4593         android-armv7)
4594                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
4595                 ;;
4596         android-v8a)
4597                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
4598                 ;;
4599         android-x86)
4600                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
4601                 ;;
4602         android-x64)
4603                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
4604                 ;;
4605         *)
4606                 AC_MSG_ERROR(Invalid BTLS platform)
4607         esac
4609         if test "x$platform_android" = "xyes"; then
4610                 btls_android=yes
4611                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
4612                 if test "x$with_btls_android_ndk" != "x"; then
4613                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
4614                 else
4615                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
4616                 fi
4617         fi
4619         if test "x$btls_arch" != "x"; then
4620                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
4621         fi
4623         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
4624         AC_SUBST(BTLS_ARCH)
4625         AC_SUBST(BTLS_CFLAGS)
4626         AC_SUBST(BTLS_PLATFORM)
4627         AC_SUBST(BTLS_CMAKE_ARGS)
4629         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
4630 else
4631         enable_btls=no
4634 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
4636 if test x$DISABLE_MCS_DOCS = xyes; then
4637    docs_dir=""
4638 else
4639    docs_dir=docs
4641 AC_SUBST(docs_dir)
4643 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
4644 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
4645 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
4647 libmono_ldflags="$libmono_ldflags $LIBS"
4649 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
4650 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
4651 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
4652 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
4653 AM_CONDITIONAL(X86, test x$TARGET = xX86)
4654 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
4655 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
4656 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
4657 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
4658 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
4659 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
4660 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
4661 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
4662 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
4663 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
4664 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
4665 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
4666 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
4668 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
4670 AC_SUBST(LIBC)
4671 AC_SUBST(INTL)
4672 AC_SUBST(SQLITE)
4673 AC_SUBST(SQLITE3)
4674 AC_SUBST(X11)
4675 AC_SUBST(GDKX11)
4676 AC_SUBST(GTKX11)
4677 AC_SUBST(XINERAMA)
4678 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
4679 AC_SUBST(arch_target)
4680 AC_SUBST(CFLAGS)
4681 AC_SUBST(CPPFLAGS)
4682 AC_SUBST(LDFLAGS)
4684 #This must always be defined when building the runtime
4685 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
4687 mono_build_root=`pwd`
4688 AC_SUBST(mono_build_root)
4690 mono_runtime=mono/mini/mono
4691 AC_SUBST(mono_runtime)
4693 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.6.0/tools/csc.exe
4695 if test $csc_compiler = mcs; then
4696   CSC=$mcs_topdir/class/lib/build/mcs.exe
4697 else
4698   CSC=$CSC_LOCATION
4701 mono_cfg_root=$mono_build_root/runtime
4702 if test x$host_win32 = xyes; then
4703   if test "x$cross_compiling" = "xno"; then
4704     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
4705     CSC=`cygpath -m -a $CSC`
4706     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
4707   else
4708     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
4709   fi
4710 else
4711   mono_cfg_dir=$mono_cfg_root/etc
4713 AC_SUBST(mono_cfg_dir)
4715 AC_SUBST(CSC)
4717 AC_CONFIG_FILES([po/mcs/Makefile.in])
4719 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
4720 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
4722 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
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/1.0
4730     cd runtime/etc/mono/1.0
4731     rm -f machine.config
4732     $LN_S $reldir/data/net_1_1/machine.config machine.config
4733     cd $depth
4734 ],[LN_S='$LN_S'])
4736 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
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
4744     cd runtime/etc/mono/2.0
4745     rm -f machine.config
4746     $LN_S $reldir/data/net_2_0/machine.config machine.config
4747     cd $depth
4748 ],[LN_S='$LN_S'])
4750 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
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/2.0
4758     cd runtime/etc/mono/2.0
4759     rm -f web.config
4760     $LN_S $reldir/data/net_2_0/web.config web.config
4761     cd $depth
4762 ],[LN_S='$LN_S'])
4764 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
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/
4772     cd runtime/etc/mono/
4773     rm -f browscap.ini
4774     $LN_S $reldir/data/browscap.ini browscap.ini
4775     cd $depth
4776 ],[LN_S='$LN_S'])
4778 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
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/2.0/Browsers/
4786     cd runtime/etc/mono/2.0/Browsers
4787     rm -f Compat.browser
4788     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4789     cd $depth
4790 ],[LN_S='$LN_S'])
4792 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
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/Browsers/
4800     cd runtime/etc/mono/4.0/Browsers
4801     rm -f Compat.browser
4802     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4803     cd $depth
4804 ],[LN_S='$LN_S'])
4806 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
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/Browsers/
4814     cd runtime/etc/mono/4.5/Browsers
4815     rm -f Compat.browser
4816     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4817     cd $depth
4818 ],[LN_S='$LN_S'])
4820 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.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.0
4828     cd runtime/etc/mono/4.0
4829     rm -f machine.config
4830     $LN_S $reldir/data/net_4_0/machine.config machine.config
4831     cd $depth
4832 ],[LN_S='$LN_S'])
4834 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
4835 [   depth=../../../..
4836     case $srcdir in
4837     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4838     .) reldir=$depth ;;
4839     *) reldir=$depth/$srcdir ;;
4840     esac
4841     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4842     cd runtime/etc/mono/4.0
4843     rm -f web.config
4844     $LN_S $reldir/data/net_4_0/web.config web.config
4845     cd $depth
4846 ],[LN_S='$LN_S'])
4848 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
4849 [   depth=../../../..
4850     case $srcdir in
4851     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4852     .) reldir=$depth ;;
4853     *) reldir=$depth/$srcdir ;;
4854     esac
4855     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4856     cd runtime/etc/mono/4.5
4857     rm -f machine.config
4858     $LN_S $reldir/data/net_4_5/machine.config machine.config
4859     cd $depth
4860 ],[LN_S='$LN_S'])
4862 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
4863 [   depth=../../../..
4864     case $srcdir in
4865     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4866     .) reldir=$depth ;;
4867     *) reldir=$depth/$srcdir ;;
4868     esac
4869     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4870     cd runtime/etc/mono/4.5
4871     rm -f web.config
4872     $LN_S $reldir/data/net_4_5/web.config web.config
4873     cd $depth
4874 ],[LN_S='$LN_S'])
4876 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])
4877 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])
4879 AC_OUTPUT([
4880 Makefile
4881 mono-uninstalled.pc
4882 acceptance-tests/Makefile
4883 llvm/Makefile
4884 scripts/mono-find-provides
4885 scripts/mono-find-requires
4886 mono/Makefile
4887 mono/btls/Makefile
4888 mono/utils/Makefile
4889 mono/utils/jemalloc/Makefile
4890 mono/metadata/Makefile
4891 mono/dis/Makefile
4892 mono/cil/Makefile
4893 mono/arch/Makefile
4894 mono/arch/x86/Makefile
4895 mono/arch/amd64/Makefile
4896 mono/arch/ppc/Makefile
4897 mono/arch/sparc/Makefile
4898 mono/arch/s390x/Makefile
4899 mono/arch/arm/Makefile
4900 mono/arch/arm64/Makefile
4901 mono/arch/mips/Makefile
4902 mono/sgen/Makefile
4903 mono/tests/Makefile
4904 mono/tests/tests-config
4905 mono/tests/gc-descriptors/Makefile
4906 mono/tests/testing_gac/Makefile
4907 mono/unit-tests/Makefile
4908 mono/benchmark/Makefile
4909 mono/mini/Makefile
4910 mono/profiler/Makefile
4911 mono/eglib/Makefile
4912 mono/eglib/eglib-config.h
4913 m4/Makefile
4914 ikvm-native/Makefile
4915 scripts/Makefile
4916 man/Makefile
4917 docs/Makefile
4918 data/Makefile
4919 data/net_2_0/Makefile
4920 data/net_4_0/Makefile
4921 data/net_4_5/Makefile
4922 data/net_2_0/Browsers/Makefile
4923 data/net_4_0/Browsers/Makefile
4924 data/net_4_5/Browsers/Makefile
4925 data/mint.pc
4926 data/mono-2.pc
4927 data/monosgen-2.pc
4928 data/mono.pc
4929 data/mono-cairo.pc
4930 data/mono-nunit.pc
4931 data/mono-options.pc
4932 data/mono-lineeditor.pc
4933 data/monodoc.pc
4934 data/dotnet.pc
4935 data/dotnet35.pc
4936 data/wcf.pc
4937 data/cecil.pc
4938 data/system.web.extensions_1.0.pc
4939 data/system.web.extensions.design_1.0.pc
4940 data/system.web.mvc.pc
4941 data/system.web.mvc2.pc
4942 data/system.web.mvc3.pc
4943 data/aspnetwebstack.pc
4944 data/reactive.pc
4945 samples/Makefile
4946 support/Makefile
4947 data/config
4948 tools/Makefile
4949 tools/locale-builder/Makefile
4950 tools/sgen/Makefile
4951 tools/monograph/Makefile
4952 tools/pedump/Makefile
4953 runtime/Makefile
4954 msvc/Makefile
4955 po/Makefile
4958 # Update all submodules recursively to ensure everything is checked out
4959 $srcdir/scripts/update_submodules.sh
4961 if test x$host_win32 = xyes; then
4962    # Get rid of 'cyg' prefixes in library names
4963    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
4964    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
4965    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
4966    # executable doesn't work...
4967    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
4970 if test x$host_darwin = xyes; then
4971    # This doesn't seem to be required and it slows down parallel builds
4972    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
4976   case $prefix in
4977   NONE) prefix=$ac_default_prefix ;;
4978   esac
4979   case $exec_prefix in
4980   NONE) exec_prefix='${prefix}' ;;
4981   esac
4983   #
4984   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
4985   # any existing config.make.  This allows people to share the same source tree
4986   # with different build directories, one native and one cross
4987   #
4988   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
4990     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
4992     echo "prefix=$prefix" > $mcs_topdir/build/config.make
4993     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
4994     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
4995     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
4996     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
4997     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
4998     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
4999     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5000     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5002     case $INSTALL in
5003     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5004     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5005     esac
5007     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5009     export VERSION
5010     [myver=$($AWK 'BEGIN {
5011       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5012       if(length(vsplit [1]) > 4) {
5013         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5014       }
5015       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5016     }')]
5018     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5019     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5021     if test x$host_darwin = xyes; then
5022       echo "BUILD_PLATFORM = darwin" >> $mcs_topdir/build/config.make
5023     elif test x$host_win32 = xyes; then
5024       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5025     else
5026       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5027     fi
5029     if test x$host_darwin = xyes; then
5030       echo "HOST_PLATFORM ?= darwin" >> $mcs_topdir/build/config.make
5031     elif test x$host_win32 = xyes; then
5032       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5033     else
5034       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5035     fi
5037     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5038       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5039     fi
5041         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5042            enable_system_aot=yes
5043         fi
5045     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5046       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5047     fi
5049     if test x$DISABLE_MCS_DOCS = xyes; then
5050       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5051     fi
5053     if test x$has_extension_module != xno; then
5054         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5055     fi
5056     
5057     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5058     
5059     if test "x$test_bcl_opt" = "xyes"; then    
5060       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5061     fi
5063     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5065     if test $csc_compiler = mcs; then
5066       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5067     fi
5069     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5070       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5071       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5072       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5073     fi
5075     if test "x$AOT_MODE" != "x" ; then
5076       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5077     fi
5079     if test "x$enable_btls" = "xyes"; then
5080       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5081     fi
5083   fi
5087 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5089 btls_platform_string=
5090 if test x$enable_btls = xyes; then
5091         if test x$btls_android = xyes; then
5092                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5093         else
5094                 btls_platform_string=" ($BTLS_PLATFORM)"
5095         fi
5098 echo "
5099         mcs source:    $mcsdir
5100         C# Compiler:   $csc_compiler
5102    Engine:
5103         Host:          $host
5104         Target:        $target
5105         GC:            $gc_msg 
5106         TLS:           $with_tls
5107         SIGALTSTACK:   $with_sigaltstack
5108         Engine:        $jit_status
5109         BigArrays:     $enable_big_arrays
5110         DTrace:        $enable_dtrace
5111         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm)
5112         Spectre:       $spectre_mitigation_status
5114    Libraries:
5115         .NET 4.x:        $with_profile4_x
5116         Xamarin.Android: $with_monodroid
5117         Xamarin.iOS:     $with_monotouch
5118         Xamarin.WatchOS: $with_monotouch_watch
5119         Xamarin.TVOS:    $with_monotouch_tv
5120         Xamarin.Mac:     $with_xammac
5121         Windows AOT:     $with_winaot
5122         Orbis:           $with_orbis
5123         Unreal:          $with_unreal
5124         WebAssembly:     $with_wasm
5125         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5126         JNI support:     $jdk_headers_found
5127         libgdiplus:      $libgdiplus_msg
5128         zlib:            $zlib_msg
5129         BTLS:            $enable_btls$btls_platform_string
5130         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5131         $disabled
5133 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5134    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)