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