[runtime] Extract the debugger code into a separate library. (#7673)
[mono-project.git] / configure.ac
blob739a14fb4325a9349ca995a68eaa5887d1995767
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,hybridaot,fullaot,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 elif test x$with_runtime_preset = xfullaot; then
1090    DISABLE_MCS_DOCS_default=yes
1091    with_testing_aot_full_default=yes
1092    TEST_PROFILE=testing_aot_full
1094    mono_feature_disable_com='yes'
1095    mono_feature_disable_remoting='yes'
1096    mono_feature_disable_reflection_emit_save='yes'
1097    mono_feature_disable_reflection_emit='yes'
1098    mono_feature_disable_appdomains='yes'
1100    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1101    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1102    AOT_MODE="full"
1103 elif test x$with_runtime_preset = xbitcode; then
1104    DISABLE_MCS_DOCS_default=yes
1105    with_testing_aot_full_default=yes
1106    with_bitcode_default=yes
1107    with_cooperative_gc_default=yes
1108    TEST_PROFILE=testing_aot_full
1109    enable_llvm_default=yes
1111    mono_feature_disable_com='yes'
1112    mono_feature_disable_remoting='yes'
1113    mono_feature_disable_reflection_emit_save='yes'
1114    mono_feature_disable_reflection_emit='yes'
1115    mono_feature_disable_appdomains='yes'
1117    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1118    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1119    AOT_MODE="llvmonly"
1120 elif test x$with_runtime_preset = xhybridaot; then
1121    DISABLE_MCS_DOCS_default=yes
1122    with_testing_aot_hybrid_default=yes
1123    TEST_PROFILE=testing_aot_hybrid 
1125    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1126    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1127 elif test x$with_runtime_preset = xaot; then
1128    with_profile4_x_default=yes
1130    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1131    AOT_RUN_FLAGS=""
1133    DISABLE_MCS_DOCS_default=yes
1134 elif test x$with_runtime_preset = xwinaot; then
1135    DISABLE_MCS_DOCS_default=yes
1136    with_winaot_default=yes
1137    TEST_PROFILE=winaot
1139    mono_feature_disable_com='yes'
1140    mono_feature_disable_remoting='yes'
1141    mono_feature_disable_reflection_emit_save='yes'
1142    mono_feature_disable_reflection_emit='yes'
1143    mono_feature_disable_appdomains='yes'
1145    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1146    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1147    AOT_MODE="llvmonly"
1148 elif test x$with_runtime_preset = xorbis; then
1149    DISABLE_MCS_DOCS_default=yes
1150    with_orbis_default=yes
1151    TEST_PROFILE=orbis
1153    mono_feature_disable_com='yes'
1154    mono_feature_disable_remoting='yes'
1155    mono_feature_disable_reflection_emit_save='yes'
1156    mono_feature_disable_reflection_emit='yes'
1157    mono_feature_disable_appdomains='yes'
1159    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1160    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1161    AOT_MODE="full"
1162 elif test x$with_runtime_preset = xunreal; then
1163    DISABLE_MCS_DOCS_default=yes
1164    with_unreal_default=yes
1165    TEST_PROFILE=unreal
1167    mono_feature_disable_com='yes'
1168    mono_feature_disable_remoting='yes'
1169    mono_feature_disable_appdomains='no'
1171    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1172    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1173 elif test x$with_runtime_preset = xwasm; then
1174    DISABLE_MCS_DOCS_default=yes
1175    with_wasm_default=yes
1176    TEST_PROFILE=wasm
1178    mono_feature_disable_com='yes'
1179    mono_feature_disable_remoting='yes'
1180    mono_feature_disable_reflection_emit_save='yes'
1181    mono_feature_disable_reflection_emit='yes'
1182    mono_feature_disable_appdomains='yes'
1184    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1185    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1186 else
1187    with_profile4_x_default=yes
1190 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1191    AC_SUBST(AOT_BUILD_FLAGS)
1192    AC_SUBST(AOT_RUN_FLAGS)
1193    # For llvmonlycheck + fullaotcheck
1194    AC_SUBST(INVARIANT_AOT_OPTIONS)
1197 AC_SUBST(TEST_PROFILE)
1199 if test "x$with_profile4_x" = "xdefault"; then
1200    with_profile4_x=$with_profile4_x_default
1202 if test "x$with_monodroid" = "xdefault"; then
1203    with_monodroid=$with_monodroid_default
1205 if test "x$with_monotouch" = "xdefault"; then
1206    with_monotouch=$with_monotouch_default
1208 if test "x$with_monotouch_watch" = "xdefault"; then
1209    with_monotouch_watch=$with_monotouch_watch_default
1211 if test "x$with_monotouch_tv" = "xdefault"; then
1212    with_monotouch_tv=$with_monotouch_tv_default
1214 if test "x$with_bitcode" = "xdefault"; then
1215    with_bitcode=$with_bitcode_default
1217 if test "x$with_xammac" = "xdefault"; then
1218    with_xammac=$with_xammac_default
1220 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1221    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1223 if test "x$with_testing_aot_full" = "xdefault"; then
1224    with_testing_aot_full=$with_testing_aot_full_default
1226 if test "x$with_winaot" = "xdefault"; then
1227    with_winaot=$with_winaot_default
1229 if test "x$with_orbis" = "xdefault"; then
1230    with_orbis=$with_orbis_default
1232 if test "x$with_unreal" = "xdefault"; then
1233    with_unreal=$with_unreal_default
1235 if test "x$with_wasm" = "xdefault"; then
1236    with_wasm=$with_wasm_default
1240 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1241 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1242 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1243 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1244 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1245 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1246 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1247 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1248 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1249 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1250 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1251 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1252 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1253 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"])
1254 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1256 default_profile=net_4_x
1257 if test -z "$INSTALL_MONODROID_TRUE"; then :
1258    default_profile=monodroid
1260 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1261    default_profile=monotouch
1263 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1264    default_profile=xammac
1266 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1267    default_profile=testing_aot_hybrid
1269 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1270    default_profile=testing_aot_full
1272 if test -z "$INSTALL_WINAOT_TRUE"; then :
1273    default_profile=winaot
1275 if test -z "$INSTALL_ORBIS_TRUE"; then :
1276    default_profile=orbis
1278 if test -z "$INSTALL_UNREAL_TRUE"; then :
1279    default_profile=unreal
1281 if test -z "$INSTALL_WASM_TRUE"; then :
1282    default_profile=wasm
1284 if test -z "$INSTALL_4_x_TRUE"; then :
1285    default_profile=net_4_x
1287 DEFAULT_PROFILE=$default_profile
1288 AC_SUBST(DEFAULT_PROFILE)
1291 # End build profile configuration
1294 if test x$USE_NLS = xprofile_default; then
1296         AC_MSG_CHECKING([NLS used])
1298         # We make the default value for USE_NLS
1299         # "no" on OSX because it isn't available on most
1300         # default OSX installs. The most common configurations will
1301         # all disable it, so this saves us typing.
1302         if test x$host_darwin = xyes; then
1303                 USE_NLS=no;
1304         else
1305                 USE_NLS=yes;
1306         fi
1308         AC_SUBST([USE_NLS])
1309         AC_MSG_RESULT([$USE_NLS])
1312 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1313      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1314      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1315          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1317         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1318                 eval "mono_feature_disable_$feature='yes'"
1319         done
1320         DISABLED_FEATURES=$enable_minimal
1321         disabled="Disabled:      $enable_minimal"
1322 ],[])
1324 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1326 if test "x$mono_feature_disable_aot" = "xyes"; then
1327         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1328         enable_system_aot=no
1329         AC_MSG_NOTICE([Disabled AOT compiler])
1332 if test "x$mono_feature_disable_profiler" = "xyes"; then
1333         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1334         AC_MSG_NOTICE([Disabled support for the profiler])
1336 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1338 if test "x$mono_feature_disable_decimal" = "xyes"; then
1339         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1340         AC_MSG_NOTICE([Disabled support for decimal])
1343 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1344         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1345         AC_MSG_NOTICE([Disabled support for P/Invoke])
1348 if test "x$mono_feature_disable_debug" = "xyes"; then
1349         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1350         AC_MSG_NOTICE([Disabled support for runtime debugging])
1353 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1354         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1355         mono_feature_disable_reflection_emit_save=yes
1356         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1359 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1360         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1361         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1364 if test "x$mono_feature_disable_large_code" = "xyes"; then
1365         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1366         AC_MSG_NOTICE([Disabled support for large assemblies])
1369 if test "x$mono_feature_disable_logging" = "xyes"; then
1370         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1371         AC_MSG_NOTICE([Disabled support for logging])
1374 if test "x$mono_feature_disable_com" = "xyes"; then
1375         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1376         AC_MSG_NOTICE([Disabled COM support])
1379 if test "x$mono_feature_disable_ssa" = "xyes"; then
1380         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1381         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1384 if test "x$mono_feature_disable_generics" = "xyes"; then
1385         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1386         AC_MSG_NOTICE([Disabled Generics Support])
1389 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1390         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1391         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1394 if test "x$mono_feature_disable_portability" = "xyes"; then
1395         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1396         AC_MSG_NOTICE([Disabled IO Portability layer])
1399 if test "x$mono_feature_disable_attach" = "xyes"; then
1400         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1401         AC_MSG_NOTICE([Disabled agent attach])
1404 if test "x$mono_feature_disable_verifier" = "xyes"; then
1405         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1406         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1409 if test "x$mono_feature_disable_jit" = "xyes"; then
1410         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1411         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1414 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1416 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1417         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1418         AC_MSG_NOTICE([Disabled the interpreter])
1421 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1423 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1424         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1427 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1429 if test "x$mono_feature_disable_simd" = "xyes"; then
1430         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1431         AC_MSG_NOTICE([Disabled SIMD support])
1434 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1435         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1436         AC_MSG_NOTICE([Disabled Soft Debugger.])
1439 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1441 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1442         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1443         AC_MSG_NOTICE([Disabled Performance Counters.])
1445 if test "x$mono_feature_disable_normalization" = "xyes"; then
1446         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1447         AC_MSG_NOTICE([Disabled String normalization support.])
1450 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1451 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1452         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1453         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1456 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1457         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1458         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1461 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1462         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1463         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1466 if test "x$mono_feature_disable_remoting" = "xyes"; then
1467         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1468         AC_MSG_NOTICE([Disabled remoting])
1471 if test "x$mono_feature_disable_security" = "xyes"; then
1472         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1473         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1476 if test "x$mono_feature_disable_lldb" = "xyes"; then
1477         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1478         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1481 if test "x$mono_feature_disable_mdb" = "xyes"; then
1482         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1483         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1486 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1487         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1488         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1492 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1493         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1494         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1497 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1498         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1499         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1502 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1503         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1504         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1507 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1508 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1510 has_extension_module=no
1511 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1513         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1514                 if test x$extension = xdefault ; then
1515                         has_extension_module=yes;
1516                 fi
1517         done
1518         if test x$enable_extension_module = xyes; then
1519                 has_extension_module=yes;
1520         fi
1521 ], [])
1523 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1525 if test x$has_extension_module != xno ; then
1526         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1527         AC_MSG_NOTICE([Enabling mono extension module.])
1530 # Deprecated
1531 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1533 AC_MSG_CHECKING(for visibility __attribute__)
1534 AC_COMPILE_IFELSE([
1535         AC_LANG_SOURCE([[
1536                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1537                 int main () { doit (); return 0; }
1538         ]])
1539 ], [
1540    have_visibility_hidden=yes
1541    AC_MSG_RESULT(yes)
1542 ], [
1543    have_visibility_hidden=no
1544    AC_MSG_RESULT(no)
1548 dnl Boehm GC configuration
1551 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1553 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1554 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1556 if test "x$support_boehm" = "xyes"; then
1558         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1559         if test x$enable_parallel_mark = xyes; then
1560                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1561         fi
1563         gc_msg=""
1564         LIBGC_CPPFLAGS=
1565         LIBGC_LIBS=
1566         LIBGC_STATIC_LIBS=
1567         libgc_dir=
1568         case "x$libgc" in
1569                 xincluded)
1570                         if test "x$support_boehm" = "xyes"; then
1571                                 libgc_dir=libgc
1572                         fi
1574                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1575                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1576                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1578                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1580                         if test x$target_win32 = xyes; then
1581                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1582                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1583                         fi
1585                         gc_msg="Included Boehm GC with typed GC"
1586                         if test x$enable_parallel_mark = xyes; then
1587                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1588                                 gc_msg="$gc_msg and parallel mark"
1589                         else
1590                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1591                         fi
1592                         ;;
1594                 xboehm|xbohem|xyes)
1595                         AC_MSG_WARN("External Boehm is no longer supported")
1596                         ;;
1598                 xsgen)
1599                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1600                         ;;
1602                 xnone)
1603                         AC_MSG_WARN("Compiling mono without GC.")
1604                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1605                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1606                         gc_msg="none"
1607                         ;;
1608                 *)
1609                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1610                         ;;
1611         esac
1613         AC_ARG_WITH(large-heap, [  --with-large-heap=yes,no       Enable support for GC heaps larger than 3GB (defaults to no)], [large_heap=$withval], [large_heap=no])
1614         if test "x$large_heap" = "xyes"; then
1615            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1616         fi
1618         AC_SUBST(LIBGC_CPPFLAGS)
1619         AC_SUBST(LIBGC_LIBS)
1620         AC_SUBST(LIBGC_STATIC_LIBS)
1621         AC_SUBST(libgc_dir)
1622         AC_SUBST(BOEHM_DEFINES)
1625 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1628 dnl End of Boehm GC Configuration
1631 dnl *************************************
1632 dnl *** Checks for zero length arrays ***
1633 dnl *************************************
1634 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1635 AC_TRY_COMPILE([
1636         struct s {
1637                 int  length;
1638                 char data [0];
1639         };
1640 ], [], [
1641         AC_MSG_RESULT(yes)
1642         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1643 ], [
1644         AC_MSG_RESULT(no)
1645         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1648 dnl ***********************************
1649 dnl *** Checks for signals
1650 dnl ***********************************
1651 AC_CHECK_HEADERS(signal.h)
1652 AC_CHECK_FUNCS(sigaction)
1653 AC_CHECK_FUNCS(kill)
1654 AC_CHECK_FUNCS(signal)
1656 # signal() is declared inline in Android headers
1657 # so we need to workaround it by overriding the check.
1658 if test x$platform_android = xyes; then
1659         AC_DEFINE(HAVE_SIGNAL,1)
1662 if test x$host_win32 = xno; then
1663         dnl *************************************
1664         dnl *** Checks for time capabilities ***
1665         dnl *************************************
1667         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1668         AC_TRY_COMPILE([#include <time.h>], [
1669                 const int foo = CLOCK_MONOTONIC;
1670         ],[
1671                 AC_MSG_RESULT(yes)
1672                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1673         ], [
1674                 AC_MSG_RESULT(no)
1675         ])
1677         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1678         AC_TRY_COMPILE([#include <time.h>], [
1679                 const int foo = CLOCK_MONOTONIC_COARSE;
1680         ],[
1681                 AC_MSG_RESULT(yes)
1682                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1683         ], [
1684                 AC_MSG_RESULT(no)
1685         ])
1687         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1688         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1689         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1691         dnl hires monotonic clock support
1692         AC_SEARCH_LIBS(clock_gettime, rt)
1693         AC_CHECK_FUNCS(clock_nanosleep)
1695         dnl dynamic loader support
1696         AC_CHECK_FUNC(dlopen, DL_LIB="",
1697                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1698         )
1699         if test x$dl_support = xno; then
1700                 AC_MSG_WARN([No dynamic loading support available])
1701         else
1702                 LIBS="$LIBS $DL_LIB"
1703                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1704                 dnl from glib's configure.ac
1705                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1706                         mono_cv_uscore,[
1707                         AC_TRY_RUN([#include <dlfcn.h>
1708                         int mono_underscore_test (void) { return 42; }
1709                         int main() {
1710                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1711                           handle = dlopen ((void*)0, 0);
1712                           if (handle) {
1713                             f1 = dlsym (handle, "mono_underscore_test");
1714                             f2 = dlsym (handle, "_mono_underscore_test");
1715                           } return (!f2 || f1);
1716                         }],
1717                                 [mono_cv_uscore=yes],
1718                                 [mono_cv_uscore=no],
1719                         [])
1720                 ])
1721                 if test "x$mono_cv_uscore" = "xyes"; then
1722                         MONO_DL_NEED_USCORE=1
1723                 else
1724                         MONO_DL_NEED_USCORE=0
1725                 fi
1726                 AC_SUBST(MONO_DL_NEED_USCORE)
1727                 AC_CHECK_FUNC(dlerror)
1728         fi
1730         dnl ******************************************************************
1731         dnl *** Checks for the IKVM JNI interface library                  ***
1732         dnl ******************************************************************
1733         AC_ARG_WITH(ikvm-native, [  --with-ikvm-native=yes,no      build the IKVM JNI interface library (defaults to yes)],[with_ikvm_native=$withval],[with_ikvm_native=$ikvm_native])
1735         ikvm_native_dir=
1736         if test x$with_ikvm_native = xyes; then
1737                 ikvm_native_dir=ikvm-native
1738                 jdk_headers_found="IKVM Native"
1739         fi
1741         AC_SUBST(ikvm_native_dir)
1743         AC_CHECK_HEADERS(execinfo.h)
1745         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1747         AC_CHECK_FUNCS(getgrgid_r)
1748         AC_CHECK_FUNCS(getgrnam_r)
1749         AC_CHECK_FUNCS(getresuid)
1750         AC_CHECK_FUNCS(setresuid)
1751         AC_CHECK_FUNCS(kqueue)
1752         AC_CHECK_FUNCS(backtrace_symbols)
1753         AC_CHECK_FUNCS(mkstemp)
1754         AC_CHECK_FUNCS(mmap)
1755         AC_CHECK_FUNCS(madvise)
1756         AC_CHECK_FUNCS(getrusage)
1757         AC_CHECK_FUNCS(getpriority)
1758         AC_CHECK_FUNCS(setpriority)
1759         AC_CHECK_FUNCS(dl_iterate_phdr)
1760         AC_CHECK_FUNCS(dladdr)
1761         AC_CHECK_FUNCS(sysconf)
1762         AC_CHECK_FUNCS(getrlimit)
1763         AC_CHECK_FUNCS(prctl)
1765         AC_CHECK_FUNCS(sched_getaffinity)
1766         AC_CHECK_FUNCS(sched_setaffinity)
1767         AC_CHECK_FUNCS(sched_getcpu)
1769         if test x$platform_android != xyes; then
1770                 AC_CHECK_FUNCS(getpwnam_r)
1771                 AC_CHECK_FUNCS(getpwuid_r)
1772         fi
1774         AC_FUNC_STRERROR_R()
1776         dnl ****************************************************************
1777         dnl *** Check for sched_setaffinity from glibc versions before   ***
1778         dnl *** 2.3.4. The older versions of the function only take 2    ***
1779         dnl *** parameters, not 3.                                       ***
1780         dnl ***                                                          ***
1781         dnl *** Because the interface change was not made in a minor     ***
1782         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1783         dnl *** won't always indicate the interface sched_affinity has.  ***
1784         dnl ****************************************************************
1785         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1786         AC_TRY_COMPILE([#include <sched.h>], [
1787             int mask = 1; 
1788             sched_setaffinity(0, &mask);
1789         ], [
1790                 # Yes, we have it...
1791                 AC_MSG_RESULT(yes)
1792                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1793         ], [
1794                 # We have the new, three-parameter version
1795                 AC_MSG_RESULT(no)
1796         ])
1797         AC_TRY_COMPILE([#include <sched.h>], [
1798              CPU_COUNT((void *) 0);
1799         ], [
1800                 AC_MSG_RESULT(yes)
1801                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1802         ], [
1803                 # We have the new, three-parameter version
1804                 AC_MSG_RESULT(no)
1805         ])
1807         dnl ******************************************************************
1808         dnl *** Check for large file support                               ***
1809         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1810         dnl ******************************************************************
1811         
1812         # Check that off_t can represent 2**63 - 1 correctly, working around
1813         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1814         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1815         large_offt=no
1816         AC_DEFUN([LARGE_FILES], [
1817                 large_CPPFLAGS=$CPPFLAGS
1818                 CPPFLAGS="$CPPFLAGS $1"
1819                 AC_TRY_COMPILE([
1820                         #include <sys/types.h>
1821                         #include <limits.h>
1822                 ], [
1823                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1824                         #define COMPILE_TIME_ASSERT(pred) \
1825                                 switch(0){case 0:case pred:;}
1826                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1827                 ], [
1828                         AC_MSG_RESULT(ok)
1829                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1830                         large_CPPFLAGS="$large_CPPFLAGS $1"
1831                         large_offt=yes
1832                 ], [
1833                         AC_MSG_RESULT(no)
1834                 ])
1835                 CPPFLAGS=$large_CPPFLAGS
1836         ])
1838         AC_MSG_CHECKING(if off_t is 64 bits wide)
1839         LARGE_FILES("")
1840         if test $large_offt = no; then
1841                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1842                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1843         fi
1844         if test $large_offt = no; then
1845                 AC_MSG_WARN([No 64 bit file size support available])
1846         fi
1847         
1848         dnl *****************************
1849         dnl *** Checks for libsocket  ***
1850         dnl *****************************
1851         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1853         case "$host" in
1854                 *-*-*freebsd*)
1855                         dnl *****************************
1856                         dnl *** Checks for libinotify ***
1857                         dnl *****************************
1858                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1859         esac
1861         dnl *******************************
1862         dnl *** Checks for MSG_NOSIGNAL ***
1863         dnl *******************************
1864         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1865         AC_TRY_COMPILE([#include <sys/socket.h>], [
1866                 int f = MSG_NOSIGNAL;
1867         ], [
1868                 # Yes, we have it...
1869                 AC_MSG_RESULT(yes)
1870                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
1871         ], [
1872                 # We'll have to use signals
1873                 AC_MSG_RESULT(no)
1874         ])
1876         dnl *****************************
1877         dnl *** Checks for IPPROTO_IP ***
1878         dnl *****************************
1879         AC_MSG_CHECKING(for IPPROTO_IP)
1880         AC_TRY_COMPILE([#include <netinet/in.h>], [
1881                 int level = IPPROTO_IP;
1882         ], [
1883                 # Yes, we have it...
1884                 AC_MSG_RESULT(yes)
1885                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
1886         ], [
1887                 # We'll have to use getprotobyname
1888                 AC_MSG_RESULT(no)
1889         ])
1891         dnl *******************************
1892         dnl *** Checks for IPPROTO_IPV6 ***
1893         dnl *******************************
1894         AC_MSG_CHECKING(for IPPROTO_IPV6)
1895         AC_TRY_COMPILE([#include <netinet/in.h>], [
1896                 int level = IPPROTO_IPV6;
1897         ], [
1898                 # Yes, we have it...
1899                 AC_MSG_RESULT(yes)
1900                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
1901         ], [
1902                 # We'll have to use getprotobyname
1903                 AC_MSG_RESULT(no)
1904         ])
1906         dnl ******************************
1907         dnl *** Checks for IPPROTO_TCP ***
1908         dnl ******************************
1909         AC_MSG_CHECKING(for IPPROTO_TCP)
1910         AC_TRY_COMPILE([#include <netinet/in.h>], [
1911                 int level = IPPROTO_TCP;
1912         ], [
1913                 # Yes, we have it...
1914                 AC_MSG_RESULT(yes)
1915                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
1916         ], [
1917                 # We'll have to use getprotobyname
1918                 AC_MSG_RESULT(no)
1919         ])
1921         dnl *****************************
1922         dnl *** Checks for SOL_IP     ***
1923         dnl *****************************
1924         AC_MSG_CHECKING(for SOL_IP)
1925         AC_TRY_COMPILE([#include <netdb.h>], [
1926                 int level = SOL_IP;
1927         ], [
1928                 # Yes, we have it...
1929                 AC_MSG_RESULT(yes)
1930                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
1931         ], [
1932                 # We'll have to use getprotobyname
1933                 AC_MSG_RESULT(no)
1934         ])
1936         dnl *****************************
1937         dnl *** Checks for SOL_IPV6     ***
1938         dnl *****************************
1939         AC_MSG_CHECKING(for SOL_IPV6)
1940         AC_TRY_COMPILE([#include <netdb.h>], [
1941                 int level = SOL_IPV6;
1942         ], [
1943                 # Yes, we have it...
1944                 AC_MSG_RESULT(yes)
1945                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
1946         ], [
1947                 # We'll have to use getprotobyname
1948                 AC_MSG_RESULT(no)
1949         ])
1951         dnl *****************************
1952         dnl *** Checks for SOL_TCP    ***
1953         dnl *****************************
1954         AC_MSG_CHECKING(for SOL_TCP)
1955         AC_TRY_COMPILE([#include <netdb.h>], [
1956                 int level = SOL_TCP;
1957         ], [
1958                 # Yes, we have it...
1959                 AC_MSG_RESULT(yes)
1960                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
1961         ], [
1962                 # We'll have to use getprotobyname
1963                 AC_MSG_RESULT(no)
1964         ])
1966         dnl *****************************
1967         dnl *** Checks for IP_PKTINFO ***
1968         dnl *****************************
1969         AC_MSG_CHECKING(for IP_PKTINFO)
1970         AC_TRY_COMPILE([#include <linux/in.h>], [
1971                 int level = IP_PKTINFO;
1972         ], [
1973                 # Yes, we have it...
1974                 AC_MSG_RESULT(yes)
1975                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1976         ], [
1977                 AC_MSG_RESULT(no)
1978         ])
1980         dnl *****************************
1981         dnl *** Checks for IPV6_PKTINFO ***
1982         dnl *****************************
1983         AC_MSG_CHECKING(for IPV6_PKTINFO)
1984         AC_TRY_COMPILE([#include <netdb.h>], [
1985                 int level = IPV6_PKTINFO;
1986         ], [
1987                 # Yes, we have it...
1988                 AC_MSG_RESULT(yes)
1989                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
1990         ], [
1991                 AC_MSG_RESULT(no)
1992         ])
1994         dnl **********************************
1995         dnl *** Checks for IP_DONTFRAG     ***
1996         dnl **********************************
1997         AC_MSG_CHECKING(for IP_DONTFRAG)
1998         AC_TRY_COMPILE([#include <netinet/in.h>], [
1999                 int level = IP_DONTFRAG;
2000         ], [
2001                 # Yes, we have it...
2002                 AC_MSG_RESULT(yes)
2003                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2004         ], [
2005                 AC_MSG_RESULT(no)
2006         ])
2008         dnl **********************************
2009         dnl *** Checks for IP_DONTFRAGMENT ***
2010         dnl **********************************
2011         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2012         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2013                 int level = IP_DONTFRAGMENT;
2014         ], [
2015                 # Yes, we have it...
2016                 AC_MSG_RESULT(yes)
2017                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2018         ], [
2019                 AC_MSG_RESULT(no)
2020         ])
2022         dnl **********************************
2023         dnl *** Checks for IP_MTU_DISCOVER ***
2024         dnl **********************************
2025         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2026         AC_TRY_COMPILE([#include <linux/in.h>], [
2027                 int level = IP_MTU_DISCOVER;
2028         ], [
2029                 # Yes, we have it...
2030                 AC_MSG_RESULT(yes)
2031                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2032         ], [
2033                 AC_MSG_RESULT(no)
2034         ])
2036         dnl **********************************
2037         dnl *** Checks for  IP_PMTUDISC_DO ***
2038         dnl **********************************
2039         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2040         AC_TRY_COMPILE([#include <linux/in.h>], [
2041                 int level = IP_PMTUDISC_DO;
2042         ], [
2043                 # Yes, we have it...
2044                 AC_MSG_RESULT(yes)
2045                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2046         ], [
2047                 AC_MSG_RESULT(no)
2048         ])
2050         dnl *********************************
2051         dnl *** Check for struct ip_mreqn ***
2052         dnl *********************************
2053         AC_MSG_CHECKING(for struct ip_mreqn)
2054         AC_TRY_COMPILE([#include <netinet/in.h>], [
2055                 struct ip_mreqn mreq;
2056                 mreq.imr_address.s_addr = 0;
2057         ], [
2058                 # Yes, we have it...
2059                 AC_MSG_RESULT(yes)
2060                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2061         ], [
2062                 # We'll just have to try and use struct ip_mreq
2063                 AC_MSG_RESULT(no)
2064                 AC_MSG_CHECKING(for struct ip_mreq)
2065                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2066                         struct ip_mreq mreq;
2067                         mreq.imr_interface.s_addr = 0;
2068                 ], [
2069                         # Yes, we have it...
2070                         AC_MSG_RESULT(yes)
2071                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2072                 ], [
2073                         # No multicast support
2074                         AC_MSG_RESULT(no)
2075                 ])
2076         ])
2077         
2078         dnl **********************************
2079         dnl *** Check for getaddrinfo ***
2080         dnl **********************************
2081         AC_MSG_CHECKING(for getaddrinfo)
2082                 AC_TRY_LINK([
2083                 #include <stdio.h>
2084                 #include <netdb.h>
2085         ], [
2086                 getaddrinfo(NULL,NULL,NULL,NULL);
2087         ], [
2088                 # Yes, we have it...
2089                 AC_MSG_RESULT(yes)
2090                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2091         ], [
2092                 AC_MSG_RESULT(no)
2093         ])
2095         dnl **********************************
2096         dnl *** Check for gethostbyname2_r ***
2097         dnl **********************************
2098         AC_MSG_CHECKING(for gethostbyname2_r)
2099                 AC_TRY_LINK([
2100                 #include <stdio.h>
2101                 #include <netdb.h>
2102         ], [
2104                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2105         ], [
2106                 # Yes, we have it...
2107                 AC_MSG_RESULT(yes)
2108                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2109         ], [
2110                 AC_MSG_RESULT(no)
2111         ])
2113         dnl **********************************
2114         dnl *** Check for gethostbyname2 ***
2115         dnl **********************************
2116         AC_MSG_CHECKING(for gethostbyname2)
2117                 AC_TRY_LINK([
2118                 #include <stdio.h>
2119                 #include <netdb.h>
2120         ], [
2121                 gethostbyname2(NULL,0);
2122         ], [
2123                 # Yes, we have it...
2124                 AC_MSG_RESULT(yes)
2125                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2126         ], [
2127                 AC_MSG_RESULT(no)
2128         ])
2130         dnl **********************************
2131         dnl *** Check for gethostbyname ***
2132         dnl **********************************
2133         AC_MSG_CHECKING(for gethostbyname)
2134                 AC_TRY_LINK([
2135                 #include <stdio.h>
2136                 #include <netdb.h>
2137         ], [
2138                 gethostbyname(NULL);
2139         ], [
2140                 # Yes, we have it...
2141                 AC_MSG_RESULT(yes)
2142                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2143         ], [
2144                 AC_MSG_RESULT(no)
2145         ])
2147         dnl **********************************
2148         dnl *** Check for getprotobyname ***
2149         dnl **********************************
2150         AC_MSG_CHECKING(for getprotobyname)
2151                 AC_TRY_LINK([
2152                 #include <stdio.h>
2153                 #include <netdb.h>
2154         ], [
2155                 getprotobyname(NULL);
2156         ], [
2157                 # Yes, we have it...
2158                 AC_MSG_RESULT(yes)
2159                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2160         ], [
2161                 AC_MSG_RESULT(no)
2162         ])
2164         dnl **********************************
2165         dnl *** Check for getnameinfo ***
2166         dnl **********************************
2167         AC_MSG_CHECKING(for getnameinfo)
2168                 AC_TRY_LINK([
2169                 #include <stdio.h>
2170                 #include <netdb.h>
2171         ], [
2172                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2173         ], [
2174                 # Yes, we have it...
2175                 AC_MSG_RESULT(yes)
2176                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2177         ], [
2178                 AC_MSG_RESULT(no)
2179         ])
2182         dnl **********************************
2183         dnl *** Check for inet_ntop ***
2184         dnl **********************************
2185         AC_MSG_CHECKING(for inet_ntop)
2186                 AC_TRY_LINK([
2187                 #include <stdio.h>
2188                 #include <arpa/inet.h>
2189         ], [
2190                 inet_ntop (0, NULL, NULL, 0);
2191         ], [
2192                 # Yes, we have it...
2193                 AC_MSG_RESULT(yes)
2194                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2195         ], [
2196                 AC_MSG_RESULT(no)
2197         ])
2199         dnl *****************************
2200         dnl *** Checks for libnsl     ***
2201         dnl *****************************
2202         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2204         AC_CHECK_FUNCS(inet_pton inet_aton)
2206         dnl *****************************
2207         dnl *** Checks for libxnet    ***
2208         dnl *****************************
2209         case "${host}" in
2210                 *solaris* )
2211                         AC_MSG_CHECKING(for Solaris XPG4 support)
2212                         if test -f /usr/lib/libxnet.so; then
2213                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2214                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2215                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2216                                 LIBS="$LIBS -lxnet"
2217                                 AC_MSG_RESULT(yes)
2218                         else
2219                                 AC_MSG_RESULT(no)
2220                         fi
2222                         if test "$GCC" = "yes"; then
2223                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2224                         fi
2225                 ;;
2226         esac
2228         dnl *****************************
2229         dnl *** Checks for libpthread ***
2230         dnl *****************************
2231 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2232 # and libpthread does not exist
2234         case "${host}" in
2235                 *-*-*haiku*)
2236                         dnl Haiku has pthread in libroot (libc equiv)
2237                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2238                 ;;
2239                 *-*-*freebsd*)
2240                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2241                 ;;
2242                 *-*-*openbsd*)
2243                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2244                 ;;
2245                 *)
2246                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2247                 ;;
2248         esac
2249         AC_CHECK_HEADERS(pthread.h)
2250         AC_CHECK_HEADERS(pthread_np.h)
2251         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2252         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2253         AC_CHECK_FUNCS(pthread_kill)
2254         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2255         AC_TRY_COMPILE([ #include <pthread.h>], [
2256                 pthread_mutexattr_t attr;
2257                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2258         ], [
2259                 AC_MSG_RESULT(ok)
2260         ], [
2261                 AC_MSG_RESULT(no)
2262                 AC_ERROR(Posix system lacks support for recursive mutexes)
2263         ])
2264         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2265         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2266         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2268         dnl **********************************
2269         dnl *** Check for mincore ***
2270         dnl **********************************
2271         AC_MSG_CHECKING(for mincore)
2272                 AC_TRY_LINK([
2273                 #include <stdio.h>
2274                 #include <sys/types.h>
2275                 #include <sys/mman.h>
2276         ], [
2277                 mincore(NULL, 0, NULL);
2278         ], [
2279                 # Yes, we have it...
2280                 AC_MSG_RESULT(yes)
2281                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
2282         ], [
2283                 AC_MSG_RESULT(no)
2284         ])
2286         dnl ***********************************
2287         dnl *** Checks for working __thread ***
2288         dnl ***********************************
2289         AC_MSG_CHECKING(for working __thread)
2290         if test "x$with_tls" != "x__thread"; then
2291                 AC_MSG_RESULT(disabled)
2292         elif test "x$cross_compiling" = "xyes"; then
2293                 AC_MSG_RESULT(cross compiling, assuming yes)
2294         else
2295                 AC_TRY_RUN([
2296                         #if defined(__APPLE__) && defined(__clang__)
2297                         #error "__thread does not currently work with clang on Mac OS X"
2298                         #endif
2299                         
2300                         #include <pthread.h>
2301                         __thread int i;
2302                         static int res1, res2;
2304                         void thread_main (void *arg)
2305                         {
2306                                 i = arg;
2307                                 sleep (1);
2308                                 if (arg == 1)
2309                                         res1 = (i == arg);
2310                                 else
2311                                         res2 = (i == arg);
2312                         }
2314                         int main () {
2315                                 pthread_t t1, t2;
2317                                 i = 5;
2319                                 pthread_create (&t1, NULL, thread_main, 1);
2320                                 pthread_create (&t2, NULL, thread_main, 2);
2322                                 pthread_join (t1, NULL);
2323                                 pthread_join (t2, NULL);
2325                                 return !(res1 + res2 == 2);
2326                         }
2327                 ], [
2328                                 AC_MSG_RESULT(yes)
2329                 ], [
2330                                 AC_MSG_RESULT(no)
2331                                 with_tls=pthread
2332                 ])
2333         fi
2335         dnl **************************************
2336         dnl *** Checks for working sigaltstack ***
2337         dnl **************************************
2338         AC_MSG_CHECKING(for working sigaltstack)
2339         if test "x$with_sigaltstack" != "xyes"; then
2340                 AC_MSG_RESULT(disabled)
2341         elif test "x$cross_compiling" = "xyes"; then
2342                 AC_MSG_RESULT(cross compiling, assuming yes)
2343         else
2344                 AC_TRY_RUN([
2345                         #include <stdio.h>
2346                         #include <stdlib.h>
2347                         #include <unistd.h>
2348                         #include <signal.h>
2349                         #include <pthread.h>
2350                         #include <sys/wait.h>
2351                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2352                         #define SA_STACK SA_ONSTACK
2353                         #endif
2354                         static void
2355                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2356                         {
2357                                 exit (0);
2358                         }
2360                         volatile char*__ptr = NULL;
2361                         static void *
2362                         loop (void *ignored)
2363                         {
2364                                 *__ptr = 0;
2365                                 return NULL;
2366                         }
2368                         static void
2369                         child ()
2370                         {
2371                                 struct sigaction sa;
2372                                 stack_t sas;
2373                                 pthread_t id;
2374                                 pthread_attr_t attr;
2376                                 sa.sa_sigaction = sigsegv_signal_handler;
2377                                 sigemptyset (&sa.sa_mask);
2378                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2379                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2380                                         perror ("sigaction");
2381                                         return;
2382                                 }
2384                                 /* x86 darwin deliver segfaults using SIGBUS */
2385                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2386                                         perror ("sigaction");
2387                                         return;
2388                                 }
2389                                 sas.ss_sp = malloc (SIGSTKSZ);
2390                                 sas.ss_size = SIGSTKSZ;
2391                                 sas.ss_flags = 0;
2392                                 if (sigaltstack (&sas, NULL) == -1) {
2393                                         perror ("sigaltstack");
2394                                         return;
2395                                 }
2397                                 pthread_attr_init (&attr);
2398                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2399                                         printf ("pthread_create\n");
2400                                         return;
2401                                 }
2403                                 sleep (100);
2404                         }
2406                         int
2407                         main ()
2408                         {
2409                                 pid_t son;
2410                                 int status;
2411                                 int i;
2413                                 son = fork ();
2414                                 if (son == -1) {
2415                                         return 1;
2416                                 }
2418                                 if (son == 0) {
2419                                         child ();
2420                                         return 0;
2421                                 }
2423                                 for (i = 0; i < 300; ++i) {
2424                                         waitpid (son, &status, WNOHANG);
2425                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2426                                                 return 0;
2427                                         usleep (10000);
2428                                 }
2430                                 kill (son, SIGKILL);
2431                                 return 1;
2432                         }
2434                 ], [
2435                                 AC_MSG_RESULT(yes)
2436                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2437                 ], [
2438                                 with_sigaltstack=no
2439                                 AC_MSG_RESULT(no)
2440                 ])
2441         fi
2443         dnl ********************************
2444         dnl *** Checks for semaphore lib ***
2445         dnl ********************************
2446         # 'Real Time' functions on Solaris
2447         # posix4 on Solaris 2.6
2448         # pthread (first!) on Linux
2449         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2451         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2452         AC_CHECK_FUNCS(shm_open)
2454         dnl ********************************
2455         dnl *** Checks for timezone stuff **
2456         dnl ********************************
2457         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2458                 AC_TRY_COMPILE([
2459                         #include <time.h>
2460                         ], [
2461                         struct tm tm;
2462                         tm.tm_gmtoff = 1;
2463                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2464         if test $ac_cv_struct_tm_gmtoff = yes; then
2465                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2466         else
2467                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2468                         AC_TRY_COMPILE([
2469                                 #include <time.h>
2470                         ], [
2471                                 timezone = 1;
2472                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2473                 if test $ac_cv_var_timezone = yes; then
2474                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2475                 else
2476                         AC_ERROR(unable to find a way to determine timezone)
2477                 fi
2478         fi
2480         dnl *********************************
2481         dnl *** Checks for math functions ***
2482         dnl *********************************
2483         AC_SEARCH_LIBS(sqrtf, m)
2484         if test "x$has_broken_apple_cpp" != "xyes"; then
2485                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
2486                         AC_TRY_LINK([#include <math.h>], 
2487                         [ finite(0.0); ], 
2488                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
2489                         AC_MSG_RESULT(no)))
2490         fi
2491         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
2492                 AC_TRY_LINK([#include <math.h>], 
2493                 [ isfinite(0.0); ], 
2494                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
2495                 AC_MSG_RESULT(no)))
2497         dnl ****************************************************************
2498         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2499         dnl *** have it in the library (duh))                            ***
2500         dnl ****************************************************************
2501         AC_CHECK_FUNCS(poll)
2503         dnl *************************
2504         dnl *** Check for signbit ***
2505         dnl *************************
2506         AC_MSG_CHECKING(for signbit)
2507         AC_TRY_LINK([#include <math.h>], [
2508                 int s = signbit(1.0);
2509         ], [
2510                 AC_MSG_RESULT(yes)
2511                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
2512         ], [
2513                 AC_MSG_RESULT(no)
2514         ]) 
2516         dnl **********************************
2517         dnl *** epoll                      ***
2518         dnl **********************************
2519         AC_CHECK_HEADERS(sys/epoll.h)
2520         haveepoll=no
2521         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2522         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2523                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2524         fi
2526         havekqueue=no
2528         AC_CHECK_HEADERS(sys/event.h)
2529         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2531         dnl **************************************
2532         dnl * Darwin has a race that prevents us from using reliably:
2533         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2534         dnl * Since kqueue is mostly used for scaling large web servers, 
2535         dnl * and very few folks run Mono on large web servers on OSX, falling
2536         dnl * back 
2537         dnl **************************************
2538         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2539                 if test "x$host_darwin" = "xno"; then
2540                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2541                 fi
2542         fi
2544         dnl ******************************
2545         dnl *** Checks for SIOCGIFCONF ***
2546         dnl ******************************
2547         AC_CHECK_HEADERS(sys/ioctl.h)
2548         AC_CHECK_HEADERS(net/if.h, [], [],
2549            [
2550            #ifdef HAVE_SYS_TYPES_H
2551            # include <sys/types.h>
2552            #endif
2553            #ifdef HAVE_SYS_SOCKET_H
2554            # include <sys/socket.h>
2555            #endif
2556            ])
2557         AC_MSG_CHECKING(for ifreq)
2558         AC_TRY_COMPILE([
2559                 #include <stdio.h>
2560                 #include <sys/ioctl.h>
2561                 #include <net/if.h>
2562                 ], [
2563                 struct ifconf ifc;
2564                 struct ifreq *ifr;
2565                 void *x;
2566                 ifc.ifc_len = 0;
2567                 ifc.ifc_buf = NULL;
2568                 x = (void *) &ifr->ifr_addr;
2569                 ],[
2570                         AC_MSG_RESULT(yes)
2571                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2572                 ], [
2573                         AC_MSG_RESULT(no)
2574                 ])
2575         dnl **********************************
2576         dnl ***     Checks for sin_len     ***
2577         dnl **********************************
2578         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2579         AC_TRY_COMPILE([
2580                 #include <netinet/in.h>
2581                 ], [
2582                 struct sockaddr_in saddr;
2583                 saddr.sin_len = sizeof (saddr);
2584                 ],[
2585                         AC_MSG_RESULT(yes)
2586                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2587                 ], [
2588                         AC_MSG_RESULT(no)
2589                 ])      
2590         dnl **********************************
2591         dnl ***    Checks for sin6_len     ***
2592         dnl **********************************
2593         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2594         AC_TRY_COMPILE([
2595                 #include <netinet/in.h>
2596                 ], [
2597                 struct sockaddr_in6 saddr6;
2598                 saddr6.sin6_len = sizeof (saddr6);
2599                 ],[
2600                         AC_MSG_RESULT(yes)
2601                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2602                 ], [
2603                         AC_MSG_RESULT(no)
2604                 ])
2605         dnl **********************************
2606         dnl *** Check for getifaddrs       ***
2607         dnl **********************************
2608         AC_MSG_CHECKING(for getifaddrs)
2609                 AC_TRY_LINK([
2610                 #include <stdio.h>
2611                 #include <sys/types.h>
2612                 #include <sys/socket.h>
2613                 #include <ifaddrs.h>
2614         ], [
2615                 getifaddrs(NULL);
2616         ], [
2617                 # Yes, we have it...
2618                 AC_MSG_RESULT(yes)
2619                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2620         ], [
2621                 AC_MSG_RESULT(no)
2622         ])
2623         dnl **********************************
2624         dnl *** Check for if_nametoindex   ***
2625         dnl **********************************
2626         AC_MSG_CHECKING(for if_nametoindex)
2627                 AC_TRY_LINK([
2628                 #include <stdio.h>
2629                 #include <sys/types.h>
2630                 #include <sys/socket.h>
2631                 #include <net/if.h>
2632         ], [
2633                 if_nametoindex(NULL);
2634         ], [
2635                 # Yes, we have it...
2636                 AC_MSG_RESULT(yes)
2637                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2638         ], [
2639                 AC_MSG_RESULT(no)
2640         ])
2641         dnl **********************************
2642         dnl *** Check for access ***
2643         dnl **********************************
2644         AC_MSG_CHECKING(for access)
2645                 AC_TRY_LINK([
2646                 #include <unistd.h>
2647         ], [
2648                 access(NULL,0);
2649         ], [
2650                 # Yes, we have it...
2651                 AC_MSG_RESULT(yes)
2652                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2653         ], [
2654                 AC_MSG_RESULT(no)
2655         ])
2656                         
2657         dnl **********************************
2658         dnl *** Checks for proclib         ***
2659         dnl **********************************
2660         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.)])
2661         dnl **********************************
2662         dnl *** Checks for MonoPosixHelper ***
2663         dnl **********************************
2664         AC_CHECK_HEADERS(checklist.h)
2665         AC_CHECK_HEADERS(pathconf.h)
2666         AC_CHECK_HEADERS(fstab.h)
2667         AC_CHECK_HEADERS(attr/xattr.h)
2668         AC_CHECK_HEADERS(sys/extattr.h)
2669         AC_CHECK_HEADERS(sys/sendfile.h)
2670         AC_CHECK_HEADERS(sys/statvfs.h)
2671         AC_CHECK_HEADERS(sys/statfs.h)
2672         AC_CHECK_HEADERS(sys/vfstab.h)
2673         AC_CHECK_HEADERS(sys/xattr.h)
2674         AC_CHECK_HEADERS(sys/mman.h)
2675         AC_CHECK_HEADERS(sys/param.h)
2676         AC_CHECK_HEADERS(sys/mount.h, [], [],
2677                 [
2678                 #ifdef HAVE_SYS_PARAM_H
2679                 # include <sys/param.h>
2680                 #endif
2681                 ])
2682         AC_CHECK_HEADERS(sys/mount.h)
2683         AC_CHECK_FUNCS(confstr)
2684         AC_CHECK_FUNCS(seekdir telldir)
2685         AC_CHECK_FUNCS(getdomainname)
2686         AC_CHECK_FUNCS(setdomainname)
2687         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2688         AC_CHECK_FUNCS(setgroups)
2689         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2690         AC_CHECK_FUNCS(getfsstat)
2691         AC_CHECK_FUNCS(lutimes futimes)
2692         AC_CHECK_FUNCS(mremap)
2693         AC_CHECK_FUNCS(remap_file_pages)
2694         AC_CHECK_FUNCS(posix_fadvise)
2695         AC_CHECK_FUNCS(posix_fallocate)
2696         AC_CHECK_FUNCS(posix_madvise)
2697         AC_CHECK_FUNCS(vsnprintf)
2698         AC_CHECK_FUNCS(sendfile)
2699         AC_CHECK_FUNCS(gethostid sethostid)
2700         AC_CHECK_FUNCS(sethostname)
2701         AC_CHECK_FUNCS(statfs)
2702         AC_CHECK_FUNCS(fstatfs)
2703         AC_CHECK_FUNCS(statvfs)
2704         AC_CHECK_FUNCS(fstatvfs)
2705         AC_CHECK_FUNCS(stime)
2706         AC_CHECK_FUNCS(strerror_r)
2707         AC_CHECK_FUNCS(ttyname_r)
2708         AC_CHECK_FUNCS(psignal)
2709         AC_CHECK_FUNCS(getlogin_r)
2710         AC_CHECK_FUNCS(lockf)
2711         AC_CHECK_FUNCS(swab)
2712         AC_CHECK_FUNCS(setusershell endusershell)
2713         AC_CHECK_FUNCS(futimens utimensat)
2714         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2715         AC_CHECK_FUNCS(readv writev preadv pwritev)
2716         AC_CHECK_FUNCS(setpgid)
2717         AC_CHECK_FUNCS(system)
2718         AC_CHECK_FUNCS(fork execv execve)
2719         AC_CHECK_FUNCS(accept4)
2720         AC_CHECK_FUNCS(localtime_r)
2721         AC_CHECK_FUNCS(mkdtemp)
2722         AC_CHECK_SIZEOF(size_t)
2723         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2724                 [#include <sys/types.h>
2725                  #include <sys/stat.h>
2726                  #include <unistd.h>])
2727         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2728                 [#include <sys/types.h>
2729                  #include <sys/stat.h>
2730                  #include <unistd.h>])
2731         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2732                 [#include <sys/time.h>])
2733         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2734                 [#include <sys/socket.h>])
2735         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2736                 [#include <unistd.h>
2737                  #include <fcntl.h>])
2738         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2739                 [#include <sys/uio.h>])
2740         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2741                 [#include <sys/socket.h>])
2742         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2743                 [#include <sys/poll.h>])
2744         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2745                 [#include <sys/socket.h>])
2746         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2747                 [#include <sys/socket.h>])
2748         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2749                 [#include <netinet/in.h>])
2750         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2751                 [#include <netinet/in.h>])
2752         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2753                 [#include <sys/un.h>])
2754         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2755                 [#include <sys/types.h>
2756                  #include <sys/stat.h>
2757                  #include <unistd.h>])
2758         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2759                 [#include <time.h>])
2760         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2761                 [#include <sys/time.h>
2762                  #include <sys/types.h>
2763                  #include <utime.h>])
2764         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2765                 [#include <sys/time.h>])
2766         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2767                 [#include <sys/types.h>
2768                  #include <utime.h>])
2769         AC_CHECK_MEMBERS(
2770                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2771                 [#include <sys/types.h>
2772                  #include <dirent.h>])
2773         AC_CHECK_MEMBERS(
2774                 [struct passwd.pw_gecos],,, 
2775                 [#include <sys/types.h>
2776                  #include <pwd.h>])
2777         AC_CHECK_MEMBERS(
2778                 [struct statfs.f_flags],,, 
2779                 [#include <sys/types.h>
2780                  #include <sys/vfs.h>])
2781         AC_CHECK_MEMBERS(
2782                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2783                 [#include <sys/types.h>
2784                  #include <sys/stat.h>
2785                  #include <unistd.h>])
2787         dnl Favour xattr through glibc, but use libattr if we have to
2788         AC_CHECK_FUNC(lsetxattr, ,
2789                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2790         )
2791         AC_SUBST(XATTR_LIB)
2793         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2794         AC_CHECK_MEMBERS(
2795                 [struct kinfo_proc.kp_proc],,, 
2796                 [#include <sys/types.h>
2797                  #include <sys/param.h>
2798                  #include <sys/sysctl.h>
2799                  #include <sys/proc.h>
2800                  ])
2802         dnl *********************************
2803         dnl *** Checks for Windows compilation ***
2804         dnl *********************************
2805         AC_CHECK_HEADERS(sys/time.h)
2806         AC_CHECK_HEADERS(sys/param.h)
2807         AC_CHECK_HEADERS(dirent.h)
2809         dnl ******************************************
2810         dnl *** Checks for OSX and iOS compilation ***
2811         dnl ******************************************
2812         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2814         dnl *********************************
2815         dnl *** Check for Console 2.0 I/O ***
2816         dnl *********************************
2817         AC_CHECK_HEADERS([curses.h])
2818         AC_CHECK_HEADERS([term.h], [], [],
2819         [#if HAVE_CURSES_H
2820          #include <curses.h>
2821          #endif
2822         ])
2823         AC_CHECK_HEADERS([termios.h])
2825         dnl *********************************
2826         dnl *** Checks for random         ***
2827         dnl *********************************
2828         if test x$host_darwin = xno; then
2829                 AC_CHECK_HEADERS(sys/random.h)
2830                 AC_CHECK_FUNCS(getrandom getentropy)
2831         fi
2832 else
2833         dnl *********************************
2834         dnl *** Checks for Windows compilation ***
2835         dnl *********************************
2836         AC_CHECK_HEADERS(winternl.h)
2838         jdk_headers_found=no
2839         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
2840         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
2841         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
2842         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
2843         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
2844         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
2845         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
2847         dnl *********************************
2848         dnl *** Check for struct ip_mreqn ***
2849         dnl *********************************
2850         AC_MSG_CHECKING(for struct ip_mreqn)
2851         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2852                 struct ip_mreqn mreq;
2853                 mreq.imr_address.s_addr = 0;
2854         ], [
2855                 # Yes, we have it...
2856                 AC_MSG_RESULT(yes)
2857                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
2858         ], [
2859                 # We'll just have to try and use struct ip_mreq
2860                 AC_MSG_RESULT(no)
2861                 AC_MSG_CHECKING(for struct ip_mreq)
2862                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2863                         struct ip_mreq mreq;
2864                         mreq.imr_interface.s_addr = 0;
2865                 ], [
2866                         # Yes, we have it...
2867                         AC_MSG_RESULT(yes)
2868                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
2869                 ], [
2870                         # No multicast support
2871                         AC_MSG_RESULT(no)
2872                 ])
2873         ])
2875         dnl **********************************
2876         dnl *** Check for getaddrinfo ***
2877         dnl **********************************
2878         AC_MSG_CHECKING(for getaddrinfo)
2879                 AC_TRY_LINK([
2880                 #include <stdio.h>
2881                 #include <winsock2.h>
2882                 #include <ws2tcpip.h>
2883         ], [
2884                 getaddrinfo(NULL,NULL,NULL,NULL);
2885         ], [
2886                 # Yes, we have it...
2887                 AC_MSG_RESULT(yes)
2888                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2889         ], [
2890                 AC_MSG_RESULT(no)
2891         ])
2893         dnl **********************************
2894         dnl *** Check for gethostbyname ***
2895         dnl **********************************
2896         AC_MSG_CHECKING(for gethostbyname)
2897                 AC_TRY_LINK([
2898                 #include <stdio.h>
2899                 #include <winsock2.h>
2900                 #include <ws2tcpip.h>
2901         ], [
2902                 gethostbyname(NULL);
2903         ], [
2904                 # Yes, we have it...
2905                 AC_MSG_RESULT(yes)
2906                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2907         ], [
2908                 AC_MSG_RESULT(no)
2909         ])
2911         dnl **********************************
2912         dnl *** Check for getprotobyname ***
2913         dnl **********************************
2914         AC_MSG_CHECKING(for getprotobyname)
2915                 AC_TRY_LINK([
2916                 #include <stdio.h>
2917                 #include <winsock2.h>
2918                 #include <ws2tcpip.h>
2919         ], [
2920                 getprotobyname(NULL);
2921         ], [
2922                 # Yes, we have it...
2923                 AC_MSG_RESULT(yes)
2924                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2925         ], [
2926                 AC_MSG_RESULT(no)
2927         ])
2929         dnl **********************************
2930         dnl *** Check for getnameinfo ***
2931         dnl **********************************
2932         AC_MSG_CHECKING(for getnameinfo)
2933                 AC_TRY_LINK([
2934                 #include <stdio.h>
2935                 #include <winsock2.h>
2936                 #include <ws2tcpip.h>
2937         ], [
2938                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2939         ], [
2940                 # Yes, we have it...
2941                 AC_MSG_RESULT(yes)
2942                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2943         ], [
2944                 AC_MSG_RESULT(no)
2945         ])
2947         dnl **********************************
2948         dnl *** Check for inet_ntop ***
2949         dnl **********************************
2950         AC_MSG_CHECKING(for inet_ntop)
2951                 AC_TRY_LINK([
2952                 #include <stdio.h>
2953                 #include <winsock2.h>
2954                 #include <ws2tcpip.h>
2955         ], [
2956                 inet_ntop (0, NULL, NULL, 0);
2957         ], [
2958                 # Yes, we have it...
2959                 AC_MSG_RESULT(yes)
2960                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2961         ], [
2962                 AC_MSG_RESULT(no)
2963         ])
2965         dnl **********************************
2966         dnl *** Check for inet_pton ***
2967         dnl **********************************
2968         AC_MSG_CHECKING(for inet_pton)
2969                 AC_TRY_LINK([
2970                 #include <stdio.h>
2971                 #include <winsock2.h>
2972                 #include <ws2tcpip.h>
2973         ], [
2974                 #ifndef inet_pton
2975                 (void) inet_pton;
2976                 #endif
2977                 inet_pton (0, NULL, NULL);
2978         ], [
2979                 # Yes, we have it...
2980                 AC_MSG_RESULT(yes)
2981                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
2982         ], [
2983                 AC_MSG_RESULT(no)
2984         ])
2986         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
2987         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
2988         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
2989         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
2990         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
2991         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
2992         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
2995 dnl socklen_t check
2996 AC_MSG_CHECKING(for socklen_t)
2997 AC_TRY_COMPILE([
2998 #include <sys/types.h>
2999 #include <sys/socket.h>
3001   socklen_t foo;
3003 ac_cv_c_socklen_t=yes
3004         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3005         AC_MSG_RESULT(yes)
3007         AC_MSG_RESULT(no)
3010 AC_MSG_CHECKING(for array element initializer support)
3011 AC_TRY_COMPILE([#include <sys/socket.h>], [
3012         const int array[] = {[1] = 2,};
3013 ], [
3014         # Yes, we have it...
3015         AC_MSG_RESULT(yes)
3016         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
3017 ], [
3018         # We'll have to use signals
3019         AC_MSG_RESULT(no)
3022 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
3023         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
3024         AC_TRY_LINK([#include <math.h>], 
3025         [ static void *p = &trunc; ],
3026         [
3027                 AC_DEFINE(HAVE_TRUNC) 
3028                 AC_MSG_RESULT(yes)
3029                 ac_cv_trunc=yes
3030         ],
3031         AC_MSG_RESULT(no)))
3033 if test "x$ac_cv_truncl" != "xyes"; then
3034    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
3037 AC_CHECK_FUNCS(execvp)
3039 dnl ****************************
3040 dnl *** Look for /dev/random ***
3041 dnl ****************************
3043 AC_MSG_CHECKING([if usage of random device is requested])
3044 AC_ARG_ENABLE(dev-random,
3045 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3046 try_dev_random=$enableval, try_dev_random=yes)
3048 AC_MSG_RESULT($try_dev_random)
3050 case "{$build}" in
3052 dnl IBM i does not have /dev/random, use unblocking only
3054     *-*-os400*)
3055     NAME_DEV_RANDOM="/dev/urandom"
3056     ;;
3058 dnl Win32 does not have /dev/random, they have their own method...
3060     *-mingw*|*-*-cygwin*)
3061     ac_cv_have_dev_random=no
3062     ;;
3064 dnl Everywhere else, it's /dev/random
3066     *)
3067     NAME_DEV_RANDOM="/dev/random"
3068     ;;
3069 esac
3071 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3073 dnl Now check if the device actually exists
3075 if test "x$try_dev_random" = "xyes"; then
3076     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3077     [if test -r "$NAME_DEV_RANDOM" ; then
3078         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3079     if test "x$ac_cv_have_dev_random" = "xyes"; then
3080         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3081     fi
3082 else
3083     AC_MSG_CHECKING(for random device)
3084     ac_cv_have_dev_random=no
3085     AC_MSG_RESULT(has been disabled)
3088 if test "x$host_win32" = "xyes"; then
3089     AC_DEFINE(HAVE_CRYPT_RNG)
3092 if test "x$ac_cv_have_dev_random" = "xno" \
3093     && test "x$host_win32" = "xno"; then
3094     AC_MSG_WARN([[
3096 *** A system-provided entropy source was not found on this system.
3097 *** Because of this, the System.Security.Cryptography random number generator
3098 *** will throw a NotImplemented exception.
3100 *** If you are seeing this message, and you know your system DOES have an
3101 *** entropy collection in place, please report an issue on GitHub and
3102 *** provide information about the system and how to access the random device.
3104 *** Otherwise you can install either egd or prngd and set the environment
3105 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3106 ***]])
3109 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)
3111 AC_MSG_CHECKING([if big-arrays are to be enabled])
3112 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)
3113 if test "x$enable_big_arrays" = "xyes" ; then
3114     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3115         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3116     else
3117         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3118     fi
3120 AC_MSG_RESULT($enable_big_arrays)
3122 dnl **************
3123 dnl *** DTRACE ***
3124 dnl **************
3126 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3128 if test "x$enable_dtrace" = "xyes"; then
3129    if test "x$has_dtrace" = "xno"; then
3130           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3131    fi
3132    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3133    if test "x$DTRACE" = "xno"; then
3134           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3135           enable_dtrace=no
3136    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3137           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3138           enable_dtrace=no
3139    fi
3142 dtrace_g=no
3143 if test "x$enable_dtrace" = "xyes"; then
3144         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3145         DTRACEFLAGS=
3146         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3147                 case "$host" in
3148                         powerpc-*-darwin*)
3149                         DTRACEFLAGS="-arch ppc64"
3150                         ;;
3151                         i*86-*-darwin*)
3152                         DTRACEFLAGS="-arch x86_64"
3153                         ;;
3154                         *)
3155                         DTRACEFLAGS=-64
3156                         ;;
3157                 esac
3158         else
3159                 case "$host" in
3160                         powerpc-*-darwin*)
3161                         DTRACEFLAGS="-arch ppc"
3162                         ;;
3163                         i*86-*-darwin*)
3164                         DTRACEFLAGS="-arch i386"
3165                         ;;
3166                         *)
3167                         DTRACEFLAGS=-32
3168                         ;;
3169                 esac
3170         fi
3171         AC_SUBST(DTRACEFLAGS)
3172         case "$host" in
3173                 *-*-solaris*)
3174                 dtrace_g=yes
3175                 ;;
3176         esac
3177         AC_CHECK_HEADERS([sys/sdt.h])
3179 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3180 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3182 dnl **************************
3183 dnl *** AOT cross offsets  ***
3184 dnl **************************
3186 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3187     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3189 dnl **************
3190 dnl ***  LLVM  ***
3191 dnl **************
3193 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3194 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3195 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)
3196 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3198 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3200 if test "x$enable_llvm" = "xdefault"; then
3201    enable_llvm=$enable_llvm_default
3204 if test "x$enable_llvm" = "xyes"; then
3205    if test "x$with_llvm" != "x"; then
3206           LLVM_CONFIG=$with_llvm/bin/llvm-config
3207           if test x$host_win32 = xyes; then
3208                 LLVM_CONFIG=$LLVM_CONFIG.exe
3209           fi
3210           if test ! -x $LLVM_CONFIG; then
3211                  AC_MSG_ERROR([LLVM executable $LLVM_CONFIG not found.])
3212       fi
3213    else
3214       AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
3215       if test "x$LLVM_CONFIG" = "xno"; then
3216              AC_MSG_ERROR([llvm-config not found.])
3217       fi
3218    fi
3220    llvm_codegen="x86codegen"
3221    case "$target" in
3222    arm*)
3223                 llvm_codegen="armcodegen"
3224                 ;;
3225    aarch64*)
3226                 llvm_codegen="aarch64codegen"
3227                 ;;
3228    esac
3230    if test "x$host_win32" = "xno"; then
3232    # Should be something like '2.6' or '2.7svn'
3233    llvm_version=`$LLVM_CONFIG --version`
3234    llvm_api_version=`$LLVM_CONFIG --mono-api-version 2>/dev/null`
3235    AC_MSG_CHECKING(LLVM version)
3236    AC_MSG_RESULT($llvm_version $llvm_api_version)
3237    if echo $llvm_version | grep -q 'mono'; then
3238           if test "x$enable_llvm_version_check" = "xyes"; then
3239                  if test "$llvm_version" != "$expected_llvm_version"; then
3240                         AC_MSG_ERROR([Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version"])
3241                  fi
3242           fi
3243    else
3244           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.])
3245    fi
3247    # The output of --cflags seems to include optimizations flags too
3248    if test $llvm_api_version -gt 100; then
3249           # The --cflags argument includes all kinds of warnings -pendantic etc.
3250           LLVM_CFLAGS="-I$with_llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3251           LLVM_CXXFLAGS="-I$with_llvm/include -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3252    else
3253           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'`
3254       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'`
3255    fi
3256    # LLVM is compiled with -fno-rtti, so we need this too, since our classes inherit
3257    # from LLVM classes.
3258    LLVM_CXXFLAGS="$LLVM_CXXFLAGS -fno-rtti -fexceptions"
3259    LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
3260    # This might include empty lines
3261    LLVM_SYSTEM_LIBS=`$LLVM_CONFIG --system-libs 2>/dev/null | grep -- -`
3262    llvm_jit_supported=yes
3263    llvm_jit_libs="jit mcjit $llvm_codegen"
3264    if test "x$host" != "x$target"; then
3265       # No need for jit libs
3266           llvm_jit_supported=no
3267       llvm_jit_libs=""
3268    elif test $llvm_api_version -gt 100; then
3269       llvm_jit_libs="orcjit $llvm_codegen"
3270    fi
3271    LLVM_LIBS=`$LLVM_CONFIG --libs analysis core bitwriter $llvm_jit_libs`
3272    if test "x$LLVM_LIBS" = "x"; then
3273           echo "$LLVM_CONFIG --libs failed."
3274           exit 1
3275    fi
3276    LLVM_LIBS="$LLVM_LIBS $LLVM_LDFLAGS $LLVM_SYSTEM_LIBS"
3277    # The c++ standard library used by llvm doesn't show up in $LLVM_SYSTEM_LIBS so add it manually
3278    if echo $LLVM_CXXFLAGS | grep -q -- '-stdlib=libc++'; then
3279       LLVM_LIBS="$LLVM_LIBS -lc++"
3280    else
3281       LLVM_LIBS="$LLVM_LIBS -lstdc++"
3282    fi
3284    expected_llvm_version="3.4svn-mono-mono/e656cac"
3286    else
3287        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"
3288        LLVM_CXXFLAGS="$LLVM_CFLAGS -std=gnu++11 -fvisibility-inlines-hidden -fno-rtti -Woverloaded-virtual -Wcast-qual"
3289        LLVM_LDFLAGS="-L$with_llvm/lib"
3290        LLVM_SYSTEM_LIBS="-lshell32 -lpsapi -limagehlp -ldbghelp -lm"
3291        LLVM_LIBS="-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter \
3292          -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo \
3293          -lLLVMARMAsmPrinter -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler \
3294          -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc \
3295          -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMJIT \
3296          -lLLVMAnalysis -lLLVMTarget \
3297          -lLLVMIRReader -lLLVMAsmParser -lLLVMLineEditor -lLLVMMCAnalysis -lLLVMInstrumentation \
3298          -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils \
3299          -lLLVMipa -lLLVMAnalysis -lLLVMProfileData -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld \
3300          -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMExecutionEngine -lLLVMMC -lLLVMCore \
3301          -lLLVMSupport -lstdc++"
3302        LLVM_LIBS="$LLVM_LIBS $LLVM_SYSTEM_LIBS"
3304        llvm_config_path=$with_llvm/include/llvm/Config/llvm-config.h
3305        llvm_api_version=`awk '/MONO_API_VERSION/ { print $3 }' $llvm_config_path`
3306    fi  
3308    if test "x$llvm_api_version" = "x"; then
3309           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=0"
3310           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=0"
3311    else
3312           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3313           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3314    fi   
3316    AC_DEFINE_UNQUOTED(LLVM_VERSION, "$llvm_version", [Full version of LLVM libraries])
3318    AC_SUBST(LLVM_CFLAGS)
3319    AC_SUBST(LLVM_CXXFLAGS)
3320    AC_SUBST(LLVM_LIBS)
3321    AC_SUBST(LLVM_LDFLAGS)
3322    AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3325 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3326 if test "x$enable_loadedllvm" = "xyes"; then
3327    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3329 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3331 if test "x$enable_llvm" = "xyes"; then
3332    enable_llvm_runtime=yes
3334 if test "x$enable_llvm_runtime" = "xyes"; then
3335    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3337 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3339 TARGET="unknown"
3340 ACCESS_UNALIGNED="yes"
3342 LIBC="libc.so.6"
3343 INTL="libc.so.6"
3344 SQLITE="libsqlite.so.0"
3345 SQLITE3="libsqlite3.so.0"
3346 X11="libX11.so"
3347 GDKX11="libgdk-x11-2.0.so.0"
3348 GTKX11="libgtk-x11-2.0.so.0"
3349 XINERAMA="libXinerama.so.1"
3351 sizeof_register="SIZEOF_VOID_P"
3353 jit_wanted=true
3354 boehm_supported=true
3355 BTLS_SUPPORTED=no
3356 BTLS_PLATFORM=
3358 if test "x$enable_wasm" = "xyes"; then
3359 TARGET=WASM
3360 HOST=WASM
3361 arch_target=wasm
3362 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
3363 AC_DEFINE(HOST_WASM, 1, [Host wasm])
3364 BTLS_SUPPORTED=no
3365 with_tls=pthread
3366 target_mach=no
3368 else
3370 case "$host" in
3371         mips*)
3372                 TARGET=MIPS;
3373                 arch_target=mips;
3374                 with_tls=pthread;
3375                 ACCESS_UNALIGNED="no"
3377                 AC_MSG_CHECKING(for mips n32)
3378                 AC_TRY_COMPILE([],[
3379                 #if _MIPS_SIM != _ABIN32
3380                 #error Not mips n32
3381                 #endif
3382                 ],[
3383                 AC_MSG_RESULT(yes)
3384                 sizeof_register=8
3385                 ],[
3386                 AC_MSG_RESULT(no)
3387                 ])
3388                 ;;
3389         i*86-*-*)
3390                 TARGET=X86;
3391                 arch_target=x86;
3392                 case $host_os in
3393                   solaris*)
3394                         LIBC="libc.so"
3395                         INTL="libintl.so"
3396                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3397                                 TARGET=AMD64
3398                                 arch_target=amd64
3399                         fi
3401                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3402                         # int astruct __attribute__ ((visibility ("hidden")));
3403                         # void foo ()
3404                         # {
3405                         #       void *p = &astruct;
3406                         # }
3407                         # gcc -fPIC --shared -o libfoo.so foo.c
3408                         # yields:
3409                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3410                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3411                         have_visibility_hidden=no
3412                         ;;
3413                   mingw*|cygwin*)
3414                         have_visibility_hidden=no                 
3415                         ;;
3416                   haiku*)
3417                         LIBC=libroot.so
3418                         ;;
3419                   linux*)
3420                         AOT_SUPPORTED="yes"
3421                         BTLS_SUPPORTED=yes
3422                         BTLS_PLATFORM=i386
3423                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3424                         ;;
3425                   darwin*)
3426                         AOT_SUPPORTED="yes"
3427                         BTLS_SUPPORTED=yes
3428                         BTLS_PLATFORM=i386
3429                         ;;
3430                   openbsd*|freebsd*|kfreebsd-gnu*)
3431                         AOT_SUPPORTED="yes"
3432                         BTLS_SUPPORTED=yes
3433                         BTLS_PLATFORM=i386
3434                         ;;
3435                 esac
3436                 ;;
3437         x86_64-*-* | amd64-*-*)
3438                 TARGET=AMD64;
3439                 arch_target=amd64;
3440                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3441                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3442                         sizeof_register=8
3443                 fi
3444                 case $host_os in
3445                   linux*)
3446                         AOT_SUPPORTED="yes"
3447                         BTLS_SUPPORTED=yes
3448                         BTLS_PLATFORM=x86_64
3449                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3450                         ;;
3451                   darwin*)
3452                         AOT_SUPPORTED="yes"
3453                         BTLS_SUPPORTED=yes
3454                         BTLS_PLATFORM=x86_64
3455                         boehm_supported=false
3456                         ;;
3457                   openbsd*|freebsd*|kfreebsd-gnu*)
3458                         AOT_SUPPORTED="yes"
3459                         BTLS_SUPPORTED=yes
3460                         BTLS_PLATFORM=x86_64
3461                         ;;
3462                   mingw*)
3463                         ;;
3464                 esac
3465                 ;;
3466         sparc*-*-*)
3467                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3468                    TARGET=SPARC64
3469                 else
3470                         TARGET=SPARC
3471                 fi
3472                 arch_target=sparc;
3473                 ACCESS_UNALIGNED="no"
3474                 case $host_os in
3475                   linux*) ;;
3476                   *)
3477                         LIBC="libc.so"
3478                         INTL="libintl.so"
3479                 esac
3480                 if test x"$GCC" = xyes; then
3481                         # We don't support v8 cpus
3482                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3483                 fi
3484                 if test x"$AR" = xfalse; then
3485                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3486                 fi
3487                 ;;
3488         *-mingw*|*-*-cygwin*)
3489                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3490                 have_visibility_hidden=no
3491                 INTL="intl"
3492                 ;;
3493         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3494         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3495         powerpc-*-freebsd* | powerpc-*-aix* | powerpc-*-os400* )
3496                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3497                         TARGET=POWERPC64;
3498                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3499                         CFLAGS="$CFLAGS -mminimal-toc"
3500                 else
3501                         TARGET=POWERPC;
3502                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3503                 fi
3504                 arch_target=ppc;
3505                 case $host_os in
3506                   aix*|os400*)
3507                         BTLS_SUPPORTED=yes
3508                         BTLS_PLATFORM=powerpc
3509                         dnl on AIX/PASE, shared libraries can be inside archives
3510                         dnl if they are, we specify them by lib.a(lib.so)
3511                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
3512                         LIBC="libc.a(shr_64.o)"
3513                         INTL="libintl.a(libintl.so.8)"
3514                         ;;
3515                   linux*)
3516                         BTLS_SUPPORTED=yes
3517                         BTLS_PLATFORM=powerpc
3518                         ;;
3519                 esac
3520                 ;;
3521         armv7k-*-darwin*)
3522                 TARGET=ARM;
3523                 TARGET_SYS=WATCHOS
3524                 arch_target=arm;
3525                 arm_fpu=VFP_HARD
3526                 ACCESS_UNALIGNED="no"
3527                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3528                 ;;
3530         arm*-darwin*)
3531                 TARGET=ARM;
3532                 arch_target=arm;
3533                 ACCESS_UNALIGNED="no"
3534                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3535                 ;;
3536         arm*-linux*)
3537                 TARGET=ARM;
3538                 arch_target=arm;
3539                 ACCESS_UNALIGNED="no"
3540                 AOT_SUPPORTED="yes"
3541                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3542                 BTLS_SUPPORTED=yes
3543                 BTLS_PLATFORM=arm
3544                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3545                 case "$target" in
3546                 arm*-linux*-gnueabi)
3547                         BTLS_PLATFORM=armsoft
3548                         ;;
3549                 esac
3550                 ;;
3551         arm*-netbsd*-eabi*)
3552                 TARGET=ARM;
3553                 arch_target=arm;
3554                 ACCESS_UNALIGNED="no"
3555                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3556                 ;;
3557         aarch64-*)
3558                 # https://lkml.org/lkml/2012/7/15/133
3559                 TARGET=ARM64
3560                 arch_target=arm64
3561                 boehm_supported=false
3562                 AOT_SUPPORTED="yes"
3563                 BTLS_SUPPORTED=yes
3564                 BTLS_PLATFORM=aarch64
3565                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3566                 ;;
3567         s390x-*-linux*)
3568                 TARGET=S390X;
3569                 arch_target=s390x;
3570                 ACCESS_UNALIGNED="yes"
3571                 BTLS_SUPPORTED=yes
3572                 BTLS_PLATFORM=s390x
3573                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
3574                 ;;
3575 esac
3577 HOST=$TARGET
3579 if test "x$host" != "x$target"; then
3580    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
3581    enable_mcs_build=no
3582    enable_support_build=no
3583    BTLS_SUPPORTED=no
3584    case "$target" in
3585    arm*-darwin*)
3586                 TARGET=ARM;
3587                 arch_target=arm;
3588                 ACCESS_UNALIGNED="no"
3589                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3590                 # Can't use tls, since it depends on the runtime detection of tls offsets
3591                 # in mono-compiler.h
3592                 with_tls=pthread
3593                 case "$target" in
3594                 armv7k-*)
3595                         arm_fpu=VFP_HARD
3596                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
3597                         ;;
3598                 esac            
3599                 ;;
3600    powerpc64-ps3-linux-gnu)
3601                 TARGET=POWERPC64
3602                 arch_target=powerpc64
3603                 AC_DEFINE(TARGET_PS3, 1, [...])
3604                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3605                 # uses this define
3606                 AC_DEFINE(__mono_ppc64__, 1, [...])
3607                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3608                 sizeof_register=8
3609                 target_byte_order=G_BIG_ENDIAN
3610                 ;;
3611    powerpc64-xbox360-linux-gnu)
3612                 TARGET=POWERPC64
3613                 arch_target=powerpc64
3614                 AC_DEFINE(TARGET_XBOX360, 1, [...])
3615                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3616                 # uses this define
3617                 sizeof_register=8
3618                 target_byte_order=G_BIG_ENDIAN
3619                 ;;
3620    arm*-linux-*)
3621                 TARGET=ARM;
3622                 arch_target=arm;
3623                 AC_DEFINE(TARGET_ARM, 1, [...])
3624                 ACCESS_UNALIGNED="no"
3625                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3626                 # Can't use tls, since it depends on the runtime detection of tls offsets
3627                 # in mono-compiler.h
3628                 with_tls=pthread
3629                 target_mach=no
3630                 case "$target" in
3631                 armv7l-unknown-linux-gnueabi*)
3632                         # TEGRA
3633                         CPPFLAGS="$CPPFLAGS"
3634                         ;;
3635                 armv5-*-linux-androideabi*)
3636                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3637                         CPPFLAGS="$CPPFLAGS"
3638                         ;;
3639                 *-linux-androideabi*)
3640                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3641                         CPPFLAGS="$CPPFLAGS"
3642                         ;;
3643                 esac
3644                 ;;
3645    arm*-netbsd*-eabi*)
3646                 TARGET=ARM;
3647                 arch_target=arm;
3648                 AC_DEFINE(TARGET_ARM, 1, [...])
3649                 ACCESS_UNALIGNED="no"
3650                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3651                 # Can't use tls, since it depends on the runtime detection of tls offsets
3652                 # in mono-compiler.h
3653                 with_tls=pthread
3654                 target_mach=no
3655                 ;;
3656    i686*-linux-*)
3657                 TARGET=X86;
3658                 arch_target=x86;
3659                 AC_DEFINE(TARGET_X86, 1, [...])
3660                 CPPFLAGS="$CPPFLAGS"
3661                 # Can't use tls, since it depends on the runtime detection of tls offsets
3662                 # in mono-compiler.h            
3663                 with_tls=pthread
3664                 target_mach=no
3666                 case "$target" in
3667                 *-linux-android*)
3668                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3669                         ;;
3670                 esac
3671                 ;;
3672    x86_64*-linux-*)
3673                 TARGET=AMD64;
3674                 arch_target=amd64;
3675                 AC_DEFINE(TARGET_AMD64, 1, [...])
3676                 CPPFLAGS="$CPPFLAGS"
3677                 # Can't use tls, since it depends on the runtime detection of tls offsets
3678                 # in mono-compiler.h
3679                 with_tls=pthread
3680                 target_mach=no
3682                 case "$target" in
3683                 *-linux-android*)
3684                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3685                         ;;
3686                 esac
3687                 ;;
3688    x86_64-ps4-freebsd)
3689                 TARGET=AMD64;
3690                 arch_target=amd64;
3691                 AC_DEFINE(TARGET_AMD64, 1, [...])
3692                 AC_DEFINE(TARGET_PS4, 1, [...])
3693                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
3694                 CPPFLAGS="$CPPFLAGS"
3695                 # Can't use tls, since it depends on the runtime detection of tls offsets
3696                 # in mono-compiler.h
3697                 with_tls=pthread
3698                 target_mach=no
3699                 target_win32=no
3700                 ;;
3701    aarch64*-linux-*)
3702                 TARGET=ARM64;
3703                 arch_target=arm64;
3704                 AC_DEFINE(TARGET_ARM64, 1, [...])
3705                 CPPFLAGS="$CPPFLAGS"
3706                 # Can't use tls, since it depends on the runtime detection of tls offsets
3707                 # in mono-compiler.h
3708                 with_tls=pthread
3709                 target_mach=no
3710                 case "$target" in
3711                 *-linux-android*)
3712                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3713                         ;;
3714                 esac
3715                 ;;
3716         aarch64-*)
3717                 TARGET=ARM64
3718                 ;;
3719         *)
3720                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
3721         esac
3724 case "$TARGET" in
3725 X86)
3726         AC_DEFINE(TARGET_X86, 1, [...])
3727         ;;
3728 AMD64)
3729         AC_DEFINE(TARGET_AMD64, 1, [...])
3730         ;;
3731 ARM)
3732         AC_DEFINE(TARGET_ARM, 1, [...])
3733         ;;
3734 ARM64)
3735         AC_DEFINE(TARGET_ARM64, 1, [...])
3736         ;;
3737 POWERPC)
3738         AC_DEFINE(TARGET_POWERPC, 1, [...])
3739         ;;
3740 POWERPC64)
3741         AC_DEFINE(TARGET_POWERPC, 1, [...])
3742         AC_DEFINE(TARGET_POWERPC64, 1, [...])
3743         ;;
3744 S390X)
3745         AC_DEFINE(TARGET_S390X, 1, [...])
3746         ;;
3747 MIPS)
3748         AC_DEFINE(TARGET_MIPS, 1, [...])
3749         ;;
3750 SPARC)
3751         AC_DEFINE(TARGET_SPARC, 1, [...])
3752         ;;
3753 SPARC64)
3754         AC_DEFINE(TARGET_SPARC64, 1, [...])
3755         ;;
3756 esac
3758 case "$HOST" in
3759 X86)
3760         AC_DEFINE(HOST_X86, 1, [...])
3761         ;;
3762 AMD64)
3763         AC_DEFINE(HOST_AMD64, 1, [...])
3764         ;;
3765 ARM)
3766         AC_DEFINE(HOST_ARM, 1, [...])
3767         ;;
3768 ARM64)
3769         AC_DEFINE(HOST_ARM64, 1, [...])
3770         ;;
3771 POWERPC)
3772         AC_DEFINE(HOST_POWERPC, 1, [...])
3773         ;;
3774 POWERPC64)
3775         AC_DEFINE(HOST_POWERPC, 1, [...])
3776         AC_DEFINE(HOST_POWERPC64, 1, [...])
3777         ;;
3778 S390X)
3779         AC_DEFINE(HOST_S390X, 1, [...])
3780         ;;
3781 MIPS)
3782         AC_DEFINE(HOST_MIPS, 1, [...])
3783         ;;
3784 SPARC)
3785         AC_DEFINE(HOST_SPARC, 1, [...])
3786         ;;
3787 SPARC64)
3788         AC_DEFINE(HOST_SPARC64, 1, [...])
3789         ;;
3790 esac
3792 #WASM hack
3796 dnl *************
3797 dnl *** VTUNE ***
3798 dnl *************
3800 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
3801 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
3803 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
3805 if test "x$enable_vtune" = "xyes"; then
3806         if test "x$with_vtune" = "x"; then
3807                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
3808         else
3809                 VTUNE_PATH=$with_vtune
3810         fi
3811         VTUNE_INCLUDE=$VTUNE_PATH/include
3812         case "$TARGET" in
3813         X86)
3814                 VTUNE_LIB=$VTUNE_PATH/lib32
3815                 ;;
3816         AMD64)
3817                 VTUNE_LIB=$VTUNE_PATH/lib64
3818                 ;;
3819         *)
3820                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
3821                 ;;
3822         esac
3823         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
3824                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
3825         fi
3826         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
3827                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
3828         fi
3830         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
3831         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
3833         AC_SUBST(VTUNE_LIBS)
3834         AC_SUBST(VTUNE_CFLAGS)
3836 dnl Use GCC atomic ops if they work on the target.
3837 if test x$GCC = "xyes"; then
3838         case $TARGET in
3839         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
3840                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
3841                 ;;
3842         esac
3845 if test "x$target_mach" = "xyes"; then
3847    if test "x$TARGET_SYS" = "xWATCHOS"; then
3848           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
3849           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3850           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3851           BTLS_SUPPORTED=no
3852    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
3853           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3854           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3855           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3856           BTLS_SUPPORTED=no
3857    else
3858        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
3859        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
3860        #error fail this for ios
3861        #endif
3862        ], [
3863                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
3864           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
3865           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
3866           target_osx=yes
3867        ], [
3868           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3869           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3870           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3871           BTLS_SUPPORTED=no
3872                   target_ios=yes
3873        ])
3874         fi
3875    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
3878 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
3880 if test "x$sizeof_register" = "x4"; then
3881    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
3882 elif test "x$sizeof_register" = "x8"; then
3883    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
3884 else
3885    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
3888 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
3890 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
3891    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
3892 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
3893    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
3894 else
3895    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
3898 if test "x$have_visibility_hidden" = "xyes"; then
3899    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
3902 if test "x$have_deprecated" = "xyes"; then
3903    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
3906 dnl 
3907 dnl Simple Generational checks (sgen)
3909 SGEN_DEFINES=
3910 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
3911 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
3912 if test x$buildsgen = xyes; then
3913    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
3914    SGEN_DEFINES="-DHAVE_SGEN_GC"
3916         conc_gc_msg=""
3917    if test x$with_sgen_default_concurrent != xno; then
3918        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
3919            conc_gc_msg=" (concurrent by default)"
3920    fi
3922    if test "x$gc_msg" = "x"; then
3923       gc_msg="sgen$conc_gc_msg"
3924    else
3925       gc_msg="sgen$conc_gc_msg and $gc_msg"
3926    fi
3928 AC_SUBST(SGEN_DEFINES)
3929 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
3931 jit_status="Building and using the JIT"
3933 libsuffix=".so"
3935 case "$host" in
3936      *-*-darwin*)
3937         libsuffix=".dylib"
3938         LIBC="libc.dylib"
3939         INTL="libintl.dylib"
3940         SQLITE="libsqlite.0.dylib"
3941         SQLITE3="libsqlite3.0.dylib"
3942         X11="libX11.dylib"
3943         GDKX11="libgdk-x11-2.0.dylib"
3944         GTKX11="libgtk-x11-2.0.dylib"
3945         ;;
3946      *-*-*netbsd*)
3947         LIBC="libc.so"
3948         INTL="libintl.so"
3949         SQLITE="libsqlite.so"
3950         SQLITE3="libsqlite3.so"
3951         ;;
3952      *-*-kfreebsd*-gnu)
3953         LIBC="libc.so.0.1"
3954         INTL="libc.so.0.1"
3955         X11="libX11.so.6"
3956         ;;
3957     *-*-*freebsd*)
3958         LIBC="libc.so.7"
3959         INTL="libintl.so"
3960         SQLITE="libsqlite.so"
3961         SQLITE3="libsqlite3.so"
3962         ;;
3963     *-*-*openbsd*)
3964         LIBC="libc.so"
3965         INTL="libintl.so"
3966         SQLITE="libsqlite.so"
3967         SQLITE3="libsqlite3.so"
3968         ;;
3969     *-*-*linux*)
3970         AC_PATH_X
3971         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
3972         AC_MSG_CHECKING(for the soname of libX11.so)
3973         for i in $x_libraries $dlsearch_path; do
3974                 for r in 4 5 6; do
3975                         if test -f $i/libX11.so.$r; then
3976                                 X11=libX11.so.$r
3977                                 AC_MSG_RESULT($X11)
3978                         fi
3979                 done
3980         done
3981         
3982         if test "x$X11" = "xlibX11.so"; then
3983                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
3984                 X11=libX11.so.6
3985         fi
3986         ;;
3987 esac
3989 AC_SUBST(libsuffix)
3991 ######################################
3992 # EGLIB CHECKS
3993 ######################################
3995 GNUC_PRETTY=
3996 GNUC_UNUSED=
3997 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
3998 if test x$GCC = xyes; then
3999    GNUC_UNUSED='__attribute__((__unused__))'
4000    GNUC_NORETURN='__attribute__((__noreturn__))'
4001    case $host_cpu in
4002      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4003    esac
4005 AC_SUBST(GNUC_PRETTY)
4006 AC_SUBST(GNUC_UNUSED)
4007 AC_SUBST(GNUC_NORETURN)
4008 AC_SUBST(BREAKPOINT)
4010 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4012 case $host in
4013 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4014     PATHSEP='\\'
4015     SEARCHSEP=';'
4016     OS="WIN32"
4017     PIDTYPE='void *'
4018     ;;
4020     PATHSEP='/'
4021     SEARCHSEP=':'
4022     OS="UNIX"
4023     PIDTYPE='int'
4024     ;;
4025 esac
4027 case $host in
4028         *-*-solaris*)
4029         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4030         ;;
4031 esac
4033 case $target in
4034 arm*-darwin*|aarch64*-*)
4035     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4036     ;;
4037 i*86-*-darwin*)
4038     ORDER=G_LITTLE_ENDIAN
4039     ;;
4040 *-*-haiku*)
4041     LDFLAGS="$LDFLAGS -ltextencoding"
4042     ;;
4043 *-*-openbsd*)
4044     CFLAGS="$CFLAGS -pthread"
4045     LDFLAGS="$LDFLAGS -pthread"
4046     ;;
4047 esac
4049 AC_SUBST(ORDER)
4050 AC_SUBST(CFLAGS)
4051 AC_SUBST(PATHSEP)
4052 AC_SUBST(SEARCHSEP)
4053 AC_SUBST(OS)
4054 AC_SUBST(PIDTYPE)
4056 # Defined for all targets/platforms using classic Windows API support.
4057 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4058 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4060 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf strerror_r)
4061 AC_CHECK_FUNCS(getrlimit)
4062 AC_CHECK_FUNCS(fork execv execve)
4064 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4066 if test x$with_overridable_allocators = xyes; then
4067         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4068   AC_MSG_NOTICE([Overridable allocator support enabled])
4069 else
4070   AC_MSG_NOTICE([Overridable allocator support disabled])
4074 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4075 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4076 # removed once support for 10.6 is dropped.
4078 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4080 if test x$target_osx = xyes; then
4081 AC_CHECK_FUNCS(getpwuid_r)
4082 elif test x$target_ios = xno; then
4083 AC_CHECK_FUNCS(strndup getpwuid_r)
4086 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4088 AC_SEARCH_LIBS(sqrtf, m)
4090 # nanosleep may not be part of libc, also search it in other libraries
4091 AC_SEARCH_LIBS(nanosleep, rt)
4093 AC_SEARCH_LIBS(dlopen, dl)
4094 old_ldflags="${LDFLAGS}"
4095 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4096 if test $lt_cv_prog_gnu_ld = yes; then
4097         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4098 else
4099         case $host in
4100         *-*-aix*|*-*-os400*)
4101                 ;;
4102         *)
4103                 dnl Try to use export-dynamic anyways
4104                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4105                 ;;
4106         esac
4108 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4109 if test $found_export_dynamic = no; then
4110         LDFLAGS="${old_ldflags}"
4113 AC_MSG_CHECKING(for varargs macros)
4114 AC_TRY_COMPILE([],[
4115 int foo (int i, int j);
4116 #define bar(...) foo (1, __VA_ARGS__)
4117 void main () {
4118          bar (2);
4120 ],have_iso_varargs=yes,have_iso_varargs=no)
4121 AC_MSG_RESULT($have_iso_varargs)
4122 G_HAVE_ISO_VARARGS=0
4123 if test "x$have_iso_varargs" = "xyes"; then
4124    G_HAVE_ISO_VARARGS=1
4126 AC_SUBST(G_HAVE_ISO_VARARGS)
4128 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)
4129 AC_CHECK_LIB([iconv], [locale_charset],[],[AC_CHECK_LIB([charset], [locale_charset],[LIBS+=" -liconv -lcharset"])])
4130 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4131 AC_SUBST(HAVE_ALLOCA_H)
4133 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_int; then
4134    GPOINTER_TO_INT="((gint) (ptr))"
4135    GPOINTER_TO_UINT="((guint) (ptr))"
4136    GINT_TO_POINTER="((gpointer) (v))"
4137    GUINT_TO_POINTER="((gpointer) (v))"
4138    GSIZE="int"
4139    GSIZE_FORMAT='"u"'
4140 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long; then
4141    GPOINTER_TO_INT="((gint)(long) (ptr))"
4142    GPOINTER_TO_UINT="((guint)(long) (ptr))"
4143    GINT_TO_POINTER="((gpointer)(glong) (v))"
4144    GUINT_TO_POINTER="((gpointer)(gulong) (v))"
4145    GSIZE="long"
4146    GSIZE_FORMAT='"lu"'
4147 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long_long; then
4148    GPOINTER_TO_INT="((gint)(long long) (ptr))"
4149    GPOINTER_TO_UINT="((guint)(unsigned long long) (ptr))"
4150    GINT_TO_POINTER="((gpointer)(long long) (v))"
4151    GUINT_TO_POINTER="((gpointer)(unsigned long long) (v))"
4152    GSIZE="long long"
4153    GSIZE_FORMAT='"I64u"'
4154 else
4155    AC_MSG_ERROR([unsupported pointer size])
4158 AC_SUBST(GPOINTER_TO_INT)
4159 AC_SUBST(GPOINTER_TO_UINT)
4160 AC_SUBST(GINT_TO_POINTER)
4161 AC_SUBST(GUINT_TO_POINTER)
4162 AC_SUBST(GSIZE)
4163 AC_SUBST(GSIZE_FORMAT)
4164 AC_SUBST(G_GUINT64_FORMAT)
4165 AC_SUBST(G_GINT64_FORMAT)
4166 AC_SUBST(G_GUINT32_FORMAT)
4167 AC_SUBST(G_GINT32_FORMAT)
4170 # END OF EGLIB CHECKS
4173 AC_ARG_WITH([libgdiplus],
4174         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4175         [], [with_libgdiplus=installed])
4177 # default install location
4178 libgdiplus_install_loc=libgdiplus${libsuffix}
4179 case "$host" in
4180     *-*-*linux*)
4181     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4182     ;;
4183 esac
4185 case $with_libgdiplus in
4186     no)
4187     libgdiplus_loc=
4188     ;;
4190     installed)
4191     libgdiplus_loc=
4192     if test x$cross_compiling = xno; then
4193         if test x$host_darwin = xyes; then
4194             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4195             if test -x $a; then
4196               libgdiplus_install_loc=$a
4197               libgdiplus_loc=$a
4198             fi
4199         fi
4200     fi
4201     ;;
4203     yes|sibling)
4204     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4205     ;;
4207     /*) # absolute path, assume it is an install location
4208     libgdiplus_loc=$with_libgdiplus
4209     libgdiplus_install_loc=$with_libgdiplus
4210     ;;
4212     *)
4213     libgdiplus_loc=`pwd`/$with_libgdiplus
4214     ;;
4215 esac
4216 AC_SUBST(libgdiplus_loc)
4217 AC_SUBST(libgdiplus_install_loc)
4219 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)
4220 if test "x$icall_symbol_map" = "xyes"; then
4221    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4224 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4225 if test "x$icall_export" = "xyes"; then
4226    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4229 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4230 if test "x$icall_tables" = "xno"; then
4231    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4234 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4236 if test "x$with_tls" = "x__thread"; then
4237         AC_DEFINE(HAVE_KW_THREAD, 1, [Have __thread keyword])
4238         # Pass the information to libgc
4239         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4240         AC_MSG_CHECKING(if the tls_model attribute is supported)
4241         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4242                 ], [
4243                         AC_MSG_RESULT(yes)
4244                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4245                 ], [
4246                         AC_MSG_RESULT(no)
4247         ])
4250 if test ${TARGET} = ARM; then
4251         dnl ******************************************
4252         dnl *** Check to see what FPU is available ***
4253         dnl ******************************************
4254         AC_MSG_CHECKING(which FPU to use)
4256         #
4257         # This is a bit tricky:
4258         #
4259         # if (__ARM_PCS_VFP) {
4260         #       /* mfloat-abi=hard == VFP with hard ABI */
4261         # } elif (!__SOFTFP__) {
4262         #       /* mfloat-abi=softfp == VFP with soft ABI */
4263         # } else {
4264         #       /* mfloat-abi=soft == no VFP */
4265         # }
4266         #
4267         # The exception is iOS (w/ GCC) where none of the above
4268         # are defined (but iOS always uses the 'softfp' ABI).
4269         #
4270         # No support for FPA.
4271         #
4273         fpu=NONE
4275         # iOS GCC always uses the 'softfp' ABI.
4276         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4277                 fpu=VFP
4278         fi
4280         # Are we using the 'hard' ABI?
4281         if test x$fpu = xNONE; then
4282                 AC_TRY_COMPILE([], [
4283                         #ifndef __ARM_PCS_VFP
4284                         #error "Float ABI is not 'hard'"
4285                         #endif
4286                 ], [
4287                         fpu=VFP_HARD
4288                 ], [
4289                         fpu=NONE
4290                 ])
4291         fi
4293         # No 'hard' ABI. 'soft' or 'softfp'?
4294         if test x$fpu = xNONE; then
4295                 AC_TRY_COMPILE([], [
4296                         #ifdef __SOFTFP__
4297                         #error "Float ABI is not 'softfp'"
4298                         #endif
4299                 ], [
4300                         fpu=VFP
4301                 ], [
4302                         fpu=NONE
4303                 ])
4304         fi
4306         if test x$arm_fpu != x; then
4307            fpu=$arm_fpu
4308         fi
4310         AC_MSG_RESULT($fpu)
4311         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4312         unset fpu
4314         dnl *********************************************
4315         dnl *** Check which ARM version(s) we can use ***
4316         dnl *********************************************
4317         AC_MSG_CHECKING(which ARM version to use)
4319         AC_TRY_COMPILE([], [
4320                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4321                 #error Not on ARM v5.
4322                 #endif
4323         ], [
4324                 arm_v5=yes
4326                 arm_ver=ARMv5
4327         ], [])
4329         AC_TRY_COMPILE([], [
4330                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4331                 #error Not on ARM v6.
4332                 #endif
4333         ], [
4334                 arm_v5=yes
4335                 arm_v6=yes
4337                 arm_ver=ARMv6
4338         ], [])
4340         AC_TRY_COMPILE([], [
4341                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4342                 #error Not on ARM v7.
4343                 #endif
4344         ], [
4345                 arm_v5=yes
4346                 arm_v6=yes
4347                 arm_v7=yes
4349                 arm_ver=ARMv7
4350         ], [])
4352         AC_MSG_RESULT($arm_ver)
4354         if test x$arm_v5 = xyes; then
4355                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4356                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4357         fi
4359         if test x$arm_v6 = xyes; then
4360                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4361                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4362         fi
4364         if test x$arm_v7 = xyes; then
4365                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4366                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4367         fi
4370 if test ${TARGET} = unknown; then
4371         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4372         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4375 if test "x$platform_android" = "xyes"; then
4376         case "x${TARGET}" in
4377         xARM)
4378                 case "x$arm_ver" in
4379                 xARMv5)
4380                         BTLS_SUPPORTED=yes
4381                         BTLS_PLATFORM=android-armv5
4382                         ;;
4383                 xARMv6)
4384                         BTLS_SUPPORTED=yes
4385                         BTLS_PLATFORM=android-armv6
4386                         ;;
4387                 xARMv7)
4388                         BTLS_SUPPORTED=yes
4389                         BTLS_PLATFORM=android-armv7
4390                         ;;
4391                 *)
4392                         BTLS_SUPPORTED=no
4393                         ;;
4394                 esac
4395                 ;;
4396         xARM64)
4397                 BTLS_SUPPORTED=yes
4398                 BTLS_PLATFORM=android-v8a
4399                 ;;
4400         xX86)
4401                 BTLS_SUPPORTED=yes
4402                 BTLS_PLATFORM=android-x86
4403                 ;;
4404         xAMD64)
4405                 BTLS_SUPPORTED=yes
4406                 BTLS_PLATFORM=android-x64
4407                 ;;
4408         *)
4409                 BTLS_SUPPORTED=no
4410                 ;;
4411         esac
4414 if test ${ACCESS_UNALIGNED} = no; then
4415         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4418 if test x$host_darwin = xyes; then
4419         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4420         AS_IF(
4421                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4422                 [AC_MSG_RESULT([no])],
4423                 [
4424                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4425                         AR_FLAGS="Scru"
4426                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4427                         AC_MSG_RESULT([yes])
4428                 ]
4429         )
4432 case "x$libgc" in
4433         xincluded)
4434                 # Pass CPPFLAGS to libgc configure
4435                 # We should use a separate variable for this to avoid passing useless and
4436                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4437                 # This should be executed late so we pick up the final version of CPPFLAGS
4438                 # The problem with this approach, is that during a reconfigure, the main
4439                 # configure scripts gets invoked with these arguments, so we use separate
4440                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4441                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4442                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4443                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4444                 fi
4445                 # Don't pass -finstrument-for-thread-suspension in, 
4446                 # if these are instrumented it will be very bad news 
4447                 # (infinite recursion, undefined parking behavior, etc)
4448                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4449                 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\""
4450                 if test "x$support_boehm" = "xyes"; then
4451                         AC_CONFIG_SUBDIRS(libgc)
4452                 fi
4453                 ;;
4454 esac
4456 MALLOC_MEMPOOLS=no
4457 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4458         if test x$with_malloc_mempools = xyes; then
4459                 MALLOC_MEMPOOLS=yes
4460                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4461         fi
4465 DISABLE_MCS_DOCS=default
4466 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4467         if test x$with_mcs_docs != xyes; then
4468                 DISABLE_MCS_DOCS=yes
4469         fi
4471 if test -n "$INSTALL_4_x_TRUE"; then :
4472         DISABLE_MCS_DOCS=yes
4474 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4475    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4478 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)],[
4479         if test x$with_lazy_gc_thread_creation != xno ; then
4480                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4481         fi
4482 ], [with_lazy_gc_thread_creation=no])
4484 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])
4486 if test x$with_cooperative_gc = xdefault; then
4487         with_cooperative_gc=$with_cooperative_gc_default
4490 if test x$with_cooperative_gc != xno; then
4491         AC_DEFINE(USE_COOP_GC,1,[Enable cooperative stop-the-world garbage collection.])
4494 AM_CONDITIONAL([ENABLE_COOP], [test x$with_cooperative_gc != xno])
4496 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],[
4498         if test x$enable_checked_build != x ; then
4499                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
4500         fi
4501         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
4502                 eval "mono_checked_build_test_enable_$feature='yes'"
4503         done
4505         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
4506                 eval "mono_checked_build_test_enable_gc='yes'"
4507                 eval "mono_checked_build_test_enable_metadata='yes'"
4508                 eval "mono_checked_build_test_enable_thread='yes'"
4509                 eval "mono_checked_build_test_enable_private_types='yes'"
4510         fi
4512         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
4513                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
4514         fi
4516         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
4517                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
4518         fi
4520         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
4521                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
4522         fi
4524         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
4525                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
4526         fi
4527 ], [])
4529 AC_CHECK_HEADER([malloc.h], 
4530                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
4531                         [Define to 1 if you have /usr/include/malloc.h.])],,)
4533 if test x"$GCC" = xyes; then
4534         # Implicit function declarations are not 64 bit safe
4535         # Do this late, since this causes lots of configure tests to fail
4536         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
4537         # jay has a lot of implicit declarations
4538         JAY_CFLAGS="-Wno-implicit-function-declaration"
4541 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
4542 # instead of libmono-static.a
4543 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
4544    LIBMONO_LA=libmini-static.la
4545 else
4546    if test x$buildsgen = xyes; then
4547       LIBMONO_LA=libmonosgen-$API_VER.la
4548    else
4549       LIBMONO_LA=libmonoboehm-$API_VER.la
4550    fi
4552 AC_SUBST(LIBMONO_LA)
4554 dnl **************
4555 dnl ***  Btls  ***
4556 dnl **************
4558 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
4559 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
4560 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
4562 if test "x$enable_btls" = "xno"; then
4563    enable_btls_lib=no
4566 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
4568 btls_android=no
4569 if test "x$enable_btls" = "xyes"; then
4570         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
4571         if test "x$CMAKE" = "xno"; then
4572                 AC_MSG_ERROR("cmake not found")
4573         fi
4575         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
4576         AC_SUBST(BTLS_ROOT)
4578         btls_arch=
4579         btls_cflags=
4580         BTLS_CMAKE_ARGS=
4582         case "$BTLS_PLATFORM" in
4583         i386)
4584                 btls_arch=i386
4585                 btls_cflags="-m32"
4586                 case $host_os in
4587                         darwin*)
4588                                 btls_cflags="$btls_cflags -arch i386"
4589                 esac
4590                 ;;
4591         x86_64)
4592                 btls_arch=x86_64
4593                 ;;
4594         arm)
4595                 btls_arch=arm
4596                 ;;
4597         armsoft)
4598                 btls_arch=arm
4599                 btls_cflags="-DOPENSSL_NO_ASM=1"
4600                 ;;
4601         aarch64)
4602                 btls_arch=aarch64
4603                 ;;
4604         s390x)
4605                 btls_arch=s390x
4606                 ;;
4607         powerpc)
4608                 btls_arch=powerpc
4609                 case $host_os in
4610                         aix*|os400*)
4611                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
4612                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
4613                 esac
4614                 ;;
4615         android-armv5)
4616                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4617                 ;;
4618         android-armv6)
4619                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4620                 ;;
4621         android-armv7)
4622                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
4623                 ;;
4624         android-v8a)
4625                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
4626                 ;;
4627         android-x86)
4628                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
4629                 ;;
4630         android-x64)
4631                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
4632                 ;;
4633         *)
4634                 AC_MSG_ERROR(Invalid BTLS platform)
4635         esac
4637         if test "x$platform_android" = "xyes"; then
4638                 btls_android=yes
4639                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
4640                 if test "x$with_btls_android_ndk" != "x"; then
4641                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
4642                 else
4643                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
4644                 fi
4645         fi
4647         if test "x$btls_arch" != "x"; then
4648                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
4649         fi
4651         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
4652         AC_SUBST(BTLS_ARCH)
4653         AC_SUBST(BTLS_CFLAGS)
4654         AC_SUBST(BTLS_PLATFORM)
4655         AC_SUBST(BTLS_CMAKE_ARGS)
4657         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
4658 else
4659         enable_btls=no
4662 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
4664 if test x$DISABLE_MCS_DOCS = xyes; then
4665    docs_dir=""
4666 else
4667    docs_dir=docs
4669 AC_SUBST(docs_dir)
4671 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
4672 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
4673 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
4675 libmono_ldflags="$libmono_ldflags $LIBS"
4677 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
4678 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
4679 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
4680 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
4681 AM_CONDITIONAL(X86, test x$TARGET = xX86)
4682 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
4683 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
4684 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
4685 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
4686 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
4687 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
4688 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
4689 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
4690 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
4691 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
4692 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
4693 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
4694 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
4696 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
4698 AC_SUBST(LIBC)
4699 AC_SUBST(INTL)
4700 AC_SUBST(SQLITE)
4701 AC_SUBST(SQLITE3)
4702 AC_SUBST(X11)
4703 AC_SUBST(GDKX11)
4704 AC_SUBST(GTKX11)
4705 AC_SUBST(XINERAMA)
4706 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
4707 AC_SUBST(arch_target)
4708 AC_SUBST(CFLAGS)
4709 AC_SUBST(CPPFLAGS)
4710 AC_SUBST(LDFLAGS)
4712 #This must always be defined when building the runtime
4713 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
4715 mono_build_root=`pwd`
4716 AC_SUBST(mono_build_root)
4718 mono_runtime=mono/mini/mono
4719 AC_SUBST(mono_runtime)
4721 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.7.0/tools/csc.exe
4723 if test $csc_compiler = mcs; then
4724   CSC=$mcs_topdir/class/lib/build/mcs.exe
4725 else
4726   CSC=$CSC_LOCATION
4729 mono_cfg_root=$mono_build_root/runtime
4730 if test x$host_win32 = xyes; then
4731   if test "x$cross_compiling" = "xno"; then
4732     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
4733     CSC=`cygpath -m -a $CSC`
4734     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
4735   else
4736     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
4737   fi
4738 else
4739   mono_cfg_dir=$mono_cfg_root/etc
4741 AC_SUBST(mono_cfg_dir)
4743 AC_SUBST(CSC)
4745 AC_CONFIG_FILES([po/mcs/Makefile.in])
4747 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
4748 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
4750 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
4751 [   depth=../../../..
4752     case $srcdir in
4753     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4754     .) reldir=$depth ;;
4755     *) reldir=$depth/$srcdir ;;
4756     esac
4757     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
4758     cd runtime/etc/mono/1.0
4759     rm -f machine.config
4760     $LN_S $reldir/data/net_1_1/machine.config machine.config
4761     cd $depth
4762 ],[LN_S='$LN_S'])
4764 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
4765 [   depth=../../../..
4766     case $srcdir in
4767     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4768     .) reldir=$depth ;;
4769     *) reldir=$depth/$srcdir ;;
4770     esac
4771     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4772     cd runtime/etc/mono/2.0
4773     rm -f machine.config
4774     $LN_S $reldir/data/net_2_0/machine.config machine.config
4775     cd $depth
4776 ],[LN_S='$LN_S'])
4778 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
4779 [   depth=../../../..
4780     case $srcdir in
4781     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4782     .) reldir=$depth ;;
4783     *) reldir=$depth/$srcdir ;;
4784     esac
4785     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4786     cd runtime/etc/mono/2.0
4787     rm -f web.config
4788     $LN_S $reldir/data/net_2_0/web.config web.config
4789     cd $depth
4790 ],[LN_S='$LN_S'])
4792 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
4793 [   depth=../../..
4794     case $srcdir in
4795     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4796     .) reldir=$depth ;;
4797     *) reldir=$depth/$srcdir ;;
4798     esac
4799     $ac_aux_dir/install-sh -d runtime/etc/mono/
4800     cd runtime/etc/mono/
4801     rm -f browscap.ini
4802     $LN_S $reldir/data/browscap.ini browscap.ini
4803     cd $depth
4804 ],[LN_S='$LN_S'])
4806 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
4807 [   depth=../../../../..
4808     case $srcdir in
4809     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4810     .) reldir=$depth ;;
4811     *) reldir=$depth/$srcdir ;;
4812     esac
4813     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
4814     cd runtime/etc/mono/2.0/Browsers
4815     rm -f Compat.browser
4816     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4817     cd $depth
4818 ],[LN_S='$LN_S'])
4820 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
4821 [   depth=../../../../..
4822     case $srcdir in
4823     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4824     .) reldir=$depth ;;
4825     *) reldir=$depth/$srcdir ;;
4826     esac
4827     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
4828     cd runtime/etc/mono/4.0/Browsers
4829     rm -f Compat.browser
4830     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4831     cd $depth
4832 ],[LN_S='$LN_S'])
4834 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
4835 [   depth=../../../../..
4836     case $srcdir in
4837     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4838     .) reldir=$depth ;;
4839     *) reldir=$depth/$srcdir ;;
4840     esac
4841     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
4842     cd runtime/etc/mono/4.5/Browsers
4843     rm -f Compat.browser
4844     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4845     cd $depth
4846 ],[LN_S='$LN_S'])
4848 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
4849 [   depth=../../../..
4850     case $srcdir in
4851     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4852     .) reldir=$depth ;;
4853     *) reldir=$depth/$srcdir ;;
4854     esac
4855     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4856     cd runtime/etc/mono/4.0
4857     rm -f machine.config
4858     $LN_S $reldir/data/net_4_0/machine.config machine.config
4859     cd $depth
4860 ],[LN_S='$LN_S'])
4862 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
4863 [   depth=../../../..
4864     case $srcdir in
4865     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4866     .) reldir=$depth ;;
4867     *) reldir=$depth/$srcdir ;;
4868     esac
4869     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4870     cd runtime/etc/mono/4.0
4871     rm -f web.config
4872     $LN_S $reldir/data/net_4_0/web.config web.config
4873     cd $depth
4874 ],[LN_S='$LN_S'])
4876 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
4877 [   depth=../../../..
4878     case $srcdir in
4879     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4880     .) reldir=$depth ;;
4881     *) reldir=$depth/$srcdir ;;
4882     esac
4883     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4884     cd runtime/etc/mono/4.5
4885     rm -f machine.config
4886     $LN_S $reldir/data/net_4_5/machine.config machine.config
4887     cd $depth
4888 ],[LN_S='$LN_S'])
4890 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
4891 [   depth=../../../..
4892     case $srcdir in
4893     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4894     .) reldir=$depth ;;
4895     *) reldir=$depth/$srcdir ;;
4896     esac
4897     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4898     cd runtime/etc/mono/4.5
4899     rm -f web.config
4900     $LN_S $reldir/data/net_4_5/web.config web.config
4901     cd $depth
4902 ],[LN_S='$LN_S'])
4904 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])
4905 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])
4907 AC_OUTPUT([
4908 Makefile
4909 mono-uninstalled.pc
4910 acceptance-tests/Makefile
4911 llvm/Makefile
4912 scripts/mono-find-provides
4913 scripts/mono-find-requires
4914 mono/Makefile
4915 mono/btls/Makefile
4916 mono/utils/Makefile
4917 mono/utils/jemalloc/Makefile
4918 mono/metadata/Makefile
4919 mono/dis/Makefile
4920 mono/cil/Makefile
4921 mono/arch/Makefile
4922 mono/arch/x86/Makefile
4923 mono/arch/amd64/Makefile
4924 mono/arch/ppc/Makefile
4925 mono/arch/sparc/Makefile
4926 mono/arch/s390x/Makefile
4927 mono/arch/arm/Makefile
4928 mono/arch/arm64/Makefile
4929 mono/arch/mips/Makefile
4930 mono/sgen/Makefile
4931 mono/tests/Makefile
4932 mono/tests/tests-config
4933 mono/tests/gc-descriptors/Makefile
4934 mono/tests/testing_gac/Makefile
4935 mono/unit-tests/Makefile
4936 mono/benchmark/Makefile
4937 mono/mini/Makefile
4938 mono/profiler/Makefile
4939 mono/eglib/Makefile
4940 mono/eglib/eglib-config.h
4941 m4/Makefile
4942 ikvm-native/Makefile
4943 scripts/Makefile
4944 man/Makefile
4945 docs/Makefile
4946 data/Makefile
4947 data/net_2_0/Makefile
4948 data/net_4_0/Makefile
4949 data/net_4_5/Makefile
4950 data/net_2_0/Browsers/Makefile
4951 data/net_4_0/Browsers/Makefile
4952 data/net_4_5/Browsers/Makefile
4953 data/mint.pc
4954 data/mono-2.pc
4955 data/monosgen-2.pc
4956 data/mono.pc
4957 data/mono-cairo.pc
4958 data/mono-nunit.pc
4959 data/mono-options.pc
4960 data/mono-lineeditor.pc
4961 data/monodoc.pc
4962 data/dotnet.pc
4963 data/dotnet35.pc
4964 data/wcf.pc
4965 data/cecil.pc
4966 data/system.web.extensions_1.0.pc
4967 data/system.web.extensions.design_1.0.pc
4968 data/system.web.mvc.pc
4969 data/system.web.mvc2.pc
4970 data/system.web.mvc3.pc
4971 data/aspnetwebstack.pc
4972 data/reactive.pc
4973 samples/Makefile
4974 support/Makefile
4975 data/config
4976 tools/Makefile
4977 tools/locale-builder/Makefile
4978 tools/sgen/Makefile
4979 tools/monograph/Makefile
4980 tools/pedump/Makefile
4981 runtime/Makefile
4982 msvc/Makefile
4983 po/Makefile
4986 # Update all submodules recursively to ensure everything is checked out
4987 $srcdir/scripts/update_submodules.sh
4989 if test x$host_win32 = xyes; then
4990    # Get rid of 'cyg' prefixes in library names
4991    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
4992    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
4993    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
4994    # executable doesn't work...
4995    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
4998 if test x$host_darwin = xyes; then
4999    # This doesn't seem to be required and it slows down parallel builds
5000    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5004   case $prefix in
5005   NONE) prefix=$ac_default_prefix ;;
5006   esac
5007   case $exec_prefix in
5008   NONE) exec_prefix='${prefix}' ;;
5009   esac
5011   #
5012   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5013   # any existing config.make.  This allows people to share the same source tree
5014   # with different build directories, one native and one cross
5015   #
5016   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5018     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5020     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5021     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5022     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5023     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5024     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5025     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5026     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5027     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5028     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5030     case $INSTALL in
5031     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5032     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5033     esac
5035     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5037     export VERSION
5038     [myver=$($AWK 'BEGIN {
5039       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5040       if(length(vsplit [1]) > 4) {
5041         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5042       }
5043       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5044     }')]
5046     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5047     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5049     if test x$host_darwin = xyes; then
5050       echo "BUILD_PLATFORM = darwin" >> $mcs_topdir/build/config.make
5051     elif test x$host_win32 = xyes; then
5052       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5053     else
5054       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5055     fi
5057     if test x$host_darwin = xyes; then
5058       echo "HOST_PLATFORM ?= darwin" >> $mcs_topdir/build/config.make
5059     elif test x$host_win32 = xyes; then
5060       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5061     else
5062       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5063     fi
5065     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5066       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5067     fi
5069         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5070            enable_system_aot=yes
5071         fi
5073     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5074       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5075     fi
5077     if test x$DISABLE_MCS_DOCS = xyes; then
5078       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5079     fi
5081     if test x$has_extension_module != xno; then
5082         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5083     fi
5084     
5085     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5086     
5087     if test "x$test_bcl_opt" = "xyes"; then    
5088       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5089     fi
5091     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5093     if test $csc_compiler = mcs; then
5094       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5095     fi
5097     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5098       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5099       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5100       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5101     fi
5103     if test "x$AOT_MODE" != "x" ; then
5104       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5105     fi
5107     if test "x$enable_btls" = "xyes"; then
5108       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5109     fi
5111   fi
5115 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5117 btls_platform_string=
5118 if test x$enable_btls = xyes; then
5119         if test x$btls_android = xyes; then
5120                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5121         else
5122                 btls_platform_string=" ($BTLS_PLATFORM)"
5123         fi
5126 echo "
5127         mcs source:    $mcsdir
5128         C# Compiler:   $csc_compiler
5130    Engine:
5131         Host:          $host
5132         Target:        $target
5133         GC:            $gc_msg 
5134         TLS:           $with_tls
5135         SIGALTSTACK:   $with_sigaltstack
5136         Engine:        $jit_status
5137         BigArrays:     $enable_big_arrays
5138         DTrace:        $enable_dtrace
5139         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm)
5140         Spectre:       $spectre_mitigation_status
5142    Libraries:
5143         .NET 4.x:        $with_profile4_x
5144         Xamarin.Android: $with_monodroid
5145         Xamarin.iOS:     $with_monotouch
5146         Xamarin.WatchOS: $with_monotouch_watch
5147         Xamarin.TVOS:    $with_monotouch_tv
5148         Xamarin.Mac:     $with_xammac
5149         Windows AOT:     $with_winaot
5150         Orbis:           $with_orbis
5151         Unreal:          $with_unreal
5152         WebAssembly:     $with_wasm
5153         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5154         JNI support:     $jdk_headers_found
5155         libgdiplus:      $libgdiplus_msg
5156         zlib:            $zlib_msg
5157         BTLS:            $enable_btls$btls_platform_string
5158         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5159         $disabled
5161 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5162    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)