[runtime] Disable stack guard for main thread on osx (#10899)
[mono-project.git] / configure.ac
blob2534325a4d30b6b6dbb1f5bf9e8c23b41e92db79
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.21.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`
36 # This is the version of the corlib-runtime interface. When
37 # making changes to this interface (by changing the layout
38 # of classes the runtime knows about, changing icall signature or
39 # semantics etc), change this variable.
41 # This must be unique relative to corlib interface/semantics.
43 # Generate it with uuidgen. For example:
44 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
46 # There is no ordering of corlib versions, no old or new,
47 # the runtime expects an exact match.
49 MONO_CORLIB_VERSION=BEAF66F4-BA36-44C5-974E-83C6F627DF8C
52 # Put a quoted #define in config.h.
53 # Substitute @MONO_CORLIB_VERSION@ unquoted.
55 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,"$MONO_CORLIB_VERSION",[Version of the corlib-runtime interface])
56 AC_SUBST(MONO_CORLIB_VERSION)
58 case $host_os in
59 *cygwin* )
60                  echo "Run configure using ./configure --host=i686-pc-mingw32"
61                  exit 1
62 esac
64 # In case of cygwin, override LN_S, irrespective of what it determines.
65 # The build uses cygwin, but the actual runtime doesn't.
66 case $host_os in
67 *cygwin* ) LN_S='cp -p';;
68 esac
71 # libgc defaults
73 libgc_configure_args=
75 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
76 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
77 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
78 CFLAGS_FOR_LIBGC=$CFLAGS
79 CPPFLAGS_FOR_BTLS=$CPPFLAGS
80 CFLAGS_FOR_BTLS=$CFLAGS
82 # libgc uses some deprecated APIs
83 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
86 # These are the flags that need to be stored in the mono.pc file for 
87 # compiling code that will embed Mono
89 libmono_cflags=""
90 libmono_ldflags=""
91 AC_SUBST(libmono_cflags)
92 AC_SUBST(libmono_ldflags)
94 # Variable to have relocatable .pc files (lib, or lib64)
95 # realpath isn't always available, and requires that all but the tip of the provided
96 # path exists. Fall back to the old behaviour, but realpath allows depth >1
97 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
98 # too deep for the old method to work
99 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
100 AC_SUBST(reloc_libdir)
102 # Set to yes if Unix sockets cannot be created in an anonymous namespace
103 need_link_unlink=no
105 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
106 extra_runtime_ldflags=""
108 # Thread configuration inspired by sleepycat's db
109 AC_MSG_CHECKING([host platform characteristics])
111 libgc_threads=no
112 has_dtrace=no
113 parallel_mark=yes
114 ikvm_native=yes
116 host_win32=no
117 target_win32=no
118 platform_android=no
119 platform_tizen=no
120 platform_ios=no
121 host_darwin=no
122 host_linux=no
124 case "$host" in
125         wasm32*)
126                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
127                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
128                 libdl="-ldl"
129                 libgc_threads=pthreads
130                 platform_wasm=yes
131                 ;;
132         *-mingw*|*-*-cygwin*)
133                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
134                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
135                 host_win32=yes
136                 mono_cv_clang=no
137                 if test "x$cross_compiling" = "xno"; then
138                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
139                                 target_win32=yes
140                         fi
141                 else
142                         if test "x$host" = "x$target"; then
143                                 target_win32=yes
144                         fi
145                 fi
146                 HOST_CC="gcc"
147                 # Windows 7 or later is required
148                 CPPFLAGS="$CPPFLAGS -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
149                 LDFLAGS="$LDFLAGS -lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
150                 libmono_cflags="-mms-bitfields -mwindows"
151                 libmono_ldflags="-mms-bitfields -mwindows"
152                 libdl=
153                 libgc_threads=win32
154                 with_sigaltstack=no
155                 with_tls=pthread
156                 with_sgen_default_concurrent=yes
157                 LN_S=cp
158                 # This forces libgc to use the DllMain based thread registration code on win32
159                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
160                 ;;
161         *-*-*netbsd*)
162                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
163                 libmono_cflags="-D_REENTRANT"
164                 LDFLAGS="$LDFLAGS -pthread"
165                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
166                 libmono_ldflags="-pthread"
167                 need_link_unlink=yes
168                 libdl="-ldl"
169                 libgc_threads=pthreads
170                 with_sigaltstack=no
171                 use_sigposix=yes
172                 with_sgen_default_concurrent=yes
173                 ;;
174         *-*-kfreebsd*-gnu)
175                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
176                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
177                 libmono_ldflags="-lpthread -pthread"
178                 libdl="-ldl"
179                 libgc_threads=pthreads
180                 need_link_unlink=yes
181                 with_sigaltstack=no
182                 use_sigposix=yes
183                 with_sgen_default_concurrent=yes
184                 ;;
185         *-*-*freebsd*)
186                 if test "x$PTHREAD_CFLAGS" = "x"; then
187                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
188                         libmono_cflags=
189                 else
190                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
191                         libmono_cflags="$PTHREAD_CFLAGS"
192                 fi
193                 if test "x$PTHREAD_LIBS" = "x"; then
194                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
195                         libmono_ldflags="-pthread"
196                 else
197                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
198                         libmono_ldflags="$PTHREAD_LIBS"
199                 fi
200                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
201                 need_link_unlink=yes
202                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
203                 libdl=
204                 libgc_threads=pthreads
205                 use_sigposix=yes
206                 has_dtrace=yes
207                 with_sgen_default_concurrent=yes
208                 ;;
209         *-*-*openbsd*)
210                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
211                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
212                 if test "x$disable_munmap" != "xyes"; then
213                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
214                 fi
215                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
216                 LDFLAGS="$LDFLAGS -pthread"
217                 need_link_unlink=yes
218                 AC_DEFINE(PTHREAD_POINTER_ID)
219                 libdl=
220                 libgc_threads=pthreads
221                 with_tls=pthread
222                 with_sigaltstack=no
223                 use_sigposix=yes
224                 with_sgen_default_concurrent=yes
225                 ;;
226         *-*-linux-android*)
227                 platform_android=yes
228                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
229                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
231                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
232                 if test "x$disable_munmap" != "xyes"; then
233                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
234                 fi
235                 libmono_cflags="-D_REENTRANT"
236                 libdl="-ldl"
237                 libgc_threads=pthreads
238                 use_sigposix=yes
240                 with_tls=pthread
241                 with_sigaltstack=no
242                 with_static_mono=no
244                 # Android doesn't support boehm, as it's missing <link.h>
245                 support_boehm=no
246                 with_gc=sgen
248                 # isinf(3) requires -lm
249                 LDFLAGS="$LDFLAGS -lm"
251                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
252                 # PAGE_SIZE; breaks mono/io-layer/collection.c
253                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
254                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
255                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
257                 # to bypass the underscore linker check, can't work when cross-compiling
258                 mono_cv_uscore=yes
259                 mono_cv_clang=no
260                 ;;
261         *-*-linux*)
262                 host_linux=yes
263                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
264                 if test "x$disable_munmap" != "xyes"; then
265                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
266                 fi
267                 libmono_cflags="-D_REENTRANT"
268                 libdl="-ldl"
269                 libgc_threads=pthreads
270                 use_sigposix=yes
271                 if test "x$cross_compiling" != "xno"; then
272                         # to bypass the underscore linker check, not
273                         # available during cross-compilation
274                         mono_cv_uscore=no
275                 fi
276                 case "$host" in
277                 *-tizen-linux-*)
278                         platform_tizen=yes
279                         ;;
280                 esac
281                 case "$host" in
282                 aarch64-*)
283                         support_boehm=no
284                         with_gc=sgen
285                         ;;
286                 powerpc*-*-linux*)
287                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
288                         disable_munmap=yes
289                         ;;
290                 esac
291                 with_sgen_default_concurrent=yes
292                 ;;
293         *-*-nacl*)
294                 echo "nacl no longer supported."
295                 exit 1
296                 ;;
297         *-*-hpux*)
298                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
299                 # +ESdbgasm only valid on bundled cc on RISC
300                 # silently ignored for ia64
301                 if test $GCC != "yes"; then
302                         CFLAGS="$CFLAGS +ESdbgasm"
303                         # Arrange for run-time dereferencing of null
304                         # pointers to produce a SIGSEGV signal.
305                         LDFLAGS="$LDFLAGS -z"
306                 fi
307                 CFLAGS="$CFLAGS +ESdbgasm"
308                 LDFLAGS="$LDFLAGS -z"
309                 libmono_cflags="-D_REENTRANT"
310                 libmono_ldflags="-lpthread"
311                 libgc_threads=pthreads
312                 need_link_unlink=yes
313                 use_sigposix=yes
314                 ;;
315         *-*-solaris*)
316                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
317                 need_link_unlink=yes
318                 libmono_cflags="-D_REENTRANT"
319                 libgc_threads=pthreads
320                 has_dtrace=yes
321                 use_sigposix=yes
322                 enable_solaris_tar_check=yes
323                 ;;
324         *-*-darwin*)
325                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
326                 host_darwin=yes
327                 target_mach=yes
328                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
329                 libmono_cflags="-D_THREAD_SAFE"
330                 need_link_unlink=yes
331                 AC_DEFINE(PTHREAD_POINTER_ID)
332                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
333                 libdl=
334                 libgc_threads=pthreads
335                 has_dtrace=yes
336                 if test "x$cross_compiling" = "xyes"; then
337                         has_broken_apple_cpp=yes
338                 fi
339                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
340                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
341                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
342                 case "$host" in
343                         dnl Snow Leopard and newer config.guess reports as this
344                         i*86-*-darwin*)
345                                 BROKEN_DARWIN_FLAGS="-arch i386"
346                                 BROKEN_DARWIN_CPPFLAGS=""
347                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
348                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
349                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
350                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
351                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
352                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
353                                 with_sgen_default_concurrent=yes
354                                 ;;
355                         x*64-*-darwin*)
356                                 with_sgen_default_concurrent=yes
357                                 ;;
358                         arm*-darwin*)
359                                 platform_ios=yes
360                                 has_dtrace=no
361                                 ;;
362                         aarch64*-darwin*)
363                                 platform_ios=yes
364                                 ;;
365                 esac
366                 ;;
367         *-*-haiku*)
368                 dnl BSD_SOURCE is for getifaddrs
369                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
370                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
371                 libdl=
372                 LIBS="$LIBS -lnetwork -ltextencoding"
373                 need_link_unlink=yes
374                 AC_DEFINE(PTHREAD_POINTER_ID)
375                 dnl Haiku does not support static TLS with __thread
376                 with_tls=pthread
377                 libgc_threads=pthreads
378                 use_sigposix=yes
379                 with_sigaltstack=no
380                 ;;
381         *-*-aix*|*-*-os400*)
382                 dnl Set up a 64-bit build
383                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
384                 LDFLAGS="-maix64"
385                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
386                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
387                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
388                 dnl specifiy 64-bit mode for tools.
389                 AR="/usr/bin/ar -X64"
390                 NM="/usr/bin/nm -X64"
391                 dnl SGen is the future (changes to Boehm support code would be
392                 dnl required if you wish to re-enable Boehm)
393                 support_boehm=no
394                 with_gc=sgen
395                 need_link_unlink=yes
396                 use_sigposix=yes
397                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
398                 with_sigaltstack=no
399                 dnl use pthread TLS, __thread has issues with the compiler flags we use
400                 with_tls=pthread
401                 dnl ppc Linux is the same? test further
402                 disable_munmap=yes
403                 ;;
404         *)
405                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
406                 libdl="-ldl"
407                 ;;
408 esac
410 AC_MSG_RESULT(ok)
412 if test x$need_link_unlink = xyes; then
413    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
416 if test x$host_win32 = xyes; then
417    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
420 if test x$target_win32 = xyes; then
421    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
424 if test x$host_darwin = xyes; then
425    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
428 # Defined for all targets/platforms using classic Windows API support.
429 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
430 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
432 AC_SUBST(extra_runtime_ldflags)
433 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
434 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
435 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
436 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
437 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
438 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
439 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
440 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
441 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
443 if test -z "$HOST_DARWIN_TRUE"; then :
444 PLATFORM_AOT_SUFFIX=.dylib
447 if test -z "$HOST_LINUX_TRUE"; then :
448 PLATFORM_AOT_SUFFIX=.so
451 if test -z "$HOST_WIN32_TRUE"; then :
452 PLATFORM_AOT_SUFFIX=.dll
455 AC_SUBST(PLATFORM_AOT_SUFFIX)
457 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
459 AC_CHECK_TOOL(CC, gcc, gcc)
460 AC_PROG_CC
461 AC_CHECK_TOOL(CXX, g++, g++)
462 AC_PROG_CXX
463 AM_PROG_AS
464 AC_PROG_INSTALL
465 AC_PROG_AWK
466 AM_PROG_CC_C_O
467 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
468 : ${CCAS='$(CC)'}
469 # Set ASFLAGS if not already set.
470 : ${CCASFLAGS='$(CFLAGS)'}
471 AC_SUBST(CCAS)
472 AC_SUBST(CCASFLAGS)
474 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
475 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
476 if test "x$CXX" = "xg++"; then
477         if test "x$GXX" != "xyes"; then
478                 # automake/libtool is so broken, it requires g++ even if the c++ sources
479                 # are inside automake conditionals
480                 AC_MSG_ERROR([You need to install g++])
481         fi
484 dnl may require a specific autoconf version
485 dnl AC_PROG_CC_FOR_BUILD
486 dnl CC_FOR_BUILD not automatically detected
487 CC_FOR_BUILD=$CC
488 CFLAGS_FOR_BUILD=$CFLAGS
489 BUILD_EXEEXT=
490 if test "x$cross_compiling" = "xyes"; then
491         CC_FOR_BUILD=cc
492         CFLAGS_FOR_BUILD=
493         BUILD_EXEEXT=""
495 AC_SUBST(CC_FOR_BUILD)
496 AC_SUBST(CFLAGS_FOR_BUILD)
497 AC_SUBST(HOST_CC)
498 AC_SUBST(BUILD_EXEEXT)
500 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
501 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
503 # Set STDC_HEADERS
504 AC_HEADER_STDC
505 AC_LIBTOOL_WIN32_DLL
506 # This causes monodis to not link correctly
507 #AC_DISABLE_FAST_INSTALL
509 #lookup makedev() header
510 AC_HEADER_MAJOR
512 AM_PROG_LIBTOOL
513 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
514 DOLT
516 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
517 AC_SUBST(export_ldflags)
519 # Test whenever ld supports -version-script
520 AC_PROG_LD
521 AC_PROG_LD_GNU
523 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 copyfile.h)
524 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)
525 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
526                   [], [], [#include <stddef.h>
527                   #include <sys/socket.h>
528                   #include <linux/socket.h>])
530 AC_CHECK_HEADERS(sys/user.h, [], [],
532 #ifdef HAVE_SYS_PARAM_H
533 # include <sys/param.h>
534 #endif
537 AC_CHECK_HEADERS(linux/serial.h)
539 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
540 if test x$have_zlib = xyes; then
541    AC_TRY_COMPILE([#include <zlib.h>], [
542    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
543    #else
544    #error No good zlib found
545    #endif
546    ],[
547         AC_MSG_RESULT(Using system zlib)
548         zlib_msg="system zlib"
549         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
550    ],[
551         AC_MSG_RESULT(Using embedded zlib)
552         have_zlib=no
553         zlib_msg="bundled zlib"
554    ])
557 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
558 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
560 # for mono/metadata/debug-symfile.c
561 AC_CHECK_HEADERS(elf.h)
563 # for support
564 AC_CHECK_HEADERS(poll.h)
565 AC_CHECK_HEADERS(sys/poll.h)
566 AC_CHECK_HEADERS(sys/wait.h)
567 AC_CHECK_HEADERS(grp.h)
568 AC_CHECK_HEADERS(syslog.h)
569 AC_CHECK_FUNCS(vsyslog)
571 # for mono/dis
572 AC_CHECK_HEADERS(wchar.h)
574 # for Linux statfs support
575 AC_CHECK_HEADERS(linux/magic.h)
577 # For Android NDK unified headers
578 if test x$platform_android = xyes; then
579         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
580         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
582         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
583         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
584         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
585         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
586         # doesn't contain the required definitions (NDK 14)
587         if test x$have_android_signal_inlines = xyes; then
588                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
589                 AC_COMPILE_IFELSE([
590                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
591                                 int i;
592                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
593                                 }
594                         ])],[
595                                 AC_MSG_RESULT(yes)
596                                 android_sigrtminmax_work=yes
597                         ],[
598                                 AC_MSG_RESULT(no)
599                                 android_sigrtminmax_work=no
600                         ]
601                 )
603                 if test x$android_sigrtminmax_work = xno; then
604                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
605                 fi
606         fi
608         # Attempt to detect whether we're using Android NDK unified headers
609         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
610         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
612         android_unified_headers=no
613         if test x$have_android_api_level = xyes; then
614                 if test x$have_android_versioning = xyes; then
615                         AC_MSG_CHECKING([whether using Android NDK unified headers])
617                         # Both macros are defined only in the NDK unified headers
618                         AC_COMPILE_IFELSE([
619                                 AC_LANG_PROGRAM([
620                                         #include <android/api-level.h>
621                                         #include <android/versioning.h>
622                                 ],[
623                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
624                                         #else
625                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
626                                         #endif
627                                 ])],[
628                                         AC_MSG_RESULT(yes)
629                                         android_unified_headers=yes
630                                 ],[
631                                         AC_MSG_RESULT(no)
632                                         android_unified_headers=no
633                                 ]
634                         )
635                 fi
636         fi
638         if test x$android_unified_headers = xyes; then
639                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
640         fi
641 fi # Android
643 # not 64 bit clean in cross-compile
644 AC_CHECK_SIZEOF(void *)
645 AC_CHECK_SIZEOF(long)
647 AC_CHECK_SIZEOF(int)
648 AC_CHECK_SIZEOF(long long)
650 AC_CACHE_CHECK([for clang],
651         mono_cv_clang,[
652         AC_TRY_COMPILE([], [
653                 #ifdef __clang__
654                 #else
655                 #error "FAILED"
656                 #endif
657         ],
658         [mono_cv_clang=yes],
659         [mono_cv_clang=no],
660         [])
663 AC_ARG_ENABLE(visibility-hidden,
664 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
665    disable_visibility_hidden=yes, disable_visibility_hidden=no)
667 WARN=''
668 if test x"$GCC" = xyes; then
669                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
670                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
672                 # We require C99 with some GNU extensions, e.g. `linux` macro
673                 CFLAGS="$CFLAGS -std=gnu99"
675                 # The runtime code does not respect ANSI C strict aliasing rules
676                 CFLAGS="$CFLAGS -fno-strict-aliasing"
678                 # We rely on signed overflow to behave
679                 CFLAGS="$CFLAGS -fwrapv"
681                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
682                 if test x"$disable_visibility_hidden" = xno; then
683                    # Don't export any symbols by default
684                    SHARED_CFLAGS="-fvisibility=hidden"
685                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
686                 fi
688                 ORIG_CFLAGS=$CFLAGS
689                 # Check for the normal version, since gcc ignores unknown -Wno options
690                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
691                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
692                 AC_TRY_COMPILE([],[
693                 ], [
694                    AC_MSG_RESULT(yes)
695                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
696                 ], [
697                    AC_MSG_RESULT(no)
698                    CFLAGS=$ORIG_CFLAGS
699                 ])
701                 if test "x$mono_cv_clang" = "xyes"; then
702                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
703                    WARN="$WARN -Qunused-arguments"
704                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
705                    # We rely on zero length arrays in structs
706                    WARN="$WARN -Wno-zero-length-array"
707                 fi
708 else
709         # The Sun Forte compiler complains about inline functions that access static variables
710         # so disable all inlining.
711         case "$host" in
712         *-*-solaris*)
713                 CFLAGS="$CFLAGS -Dinline="
714                 ;;
715         esac
717 CFLAGS="$WARN $CFLAGS -g"
718 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
719 CPPFLAGS="$WARN $CPPFLAGS -g"
721 # Where's the 'mcs' source tree?
722 if test -d $srcdir/mcs; then
723   mcsdir=mcs
724 else
725   mcsdir=../mcs
728 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
729         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
730                 mcsdir=$with_mcs_path
731         fi
734 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
737 # A sanity check to catch cases where the package was unpacked
738 # with an ancient tar program (Solaris)
740 AC_ARG_ENABLE(solaris-tar-check,
741 [  --disable-solaris-tar-check    disable solaris tar check],
742    do_solaris_tar_check=no, do_solaris_tar_check=yes)
744 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
745         AC_MSG_CHECKING(integrity of package)
746         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
747         then
748                 AC_MSG_RESULT(ok)
749         else
750                 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"
751                 AC_MSG_ERROR([$errorm])
752         fi
755 if test "x$with_mcs_path" != "x"; then
756 mcs_topdir=$(cd "$mcsdir" && pwd)
757 mcs_topdir_from_srcdir=$mcs_topdir
758 else
759 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
760 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
763 # Convert mcs_topdir* paths to Windows syntax.
764 if test x$cross_compiling$host_win32 = xnoyes; then
765   mcs_topdir=$(cygpath -m $mcs_topdir)
766   case $mcs_topdir_from_srcdir in
767     /cygdrive/*)
768         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
769         ;;
770   esac
773 AC_SUBST([mcs_topdir])
774 AC_SUBST([mcs_topdir_from_srcdir])
776 # gettext: prepare the translation directories. 
777 # we do not configure the full gettext, as we consume it dynamically from C#
778 AM_PO_SUBDIRS
780 if test "x$USE_NLS" = "xyes"; then
781    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
783    if test "x$HAVE_MSGFMT" = "xno"; then
784           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
785    fi
788 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
790 pkg_config_path=
791 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
792         if test x$with_crosspkgdir = "x"; then
793                 if test -s $PKG_CONFIG_PATH; then
794                         pkg_config_path=$PKG_CONFIG_PATH
795                 fi
796         else
797                 pkg_config_path=$with_crosspkgdir
798                 PKG_CONFIG_PATH=$pkg_config_path
799                 export PKG_CONFIG_PATH
800         fi
803 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
804 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
805 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
807 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
808 if test x$werror_flag = xyes; then
809         WERROR_CFLAGS="-Werror"
811 AC_SUBST([WERROR_CFLAGS])
812 AC_SUBST([SHARED_CFLAGS])
814 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
815   
816 AC_SUBST(GLIB_CFLAGS)
818 # Enable support for fast thread-local storage
819 # Some systems have broken support, so we allow to disable it.
820 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
822 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
823 # This does not work on some platforms (bug #55253)
824 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
826 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
827 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
828 # Same as --with-shared_mono=no
829 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
831 if test "x$enable_static" = "xno"; then
832    with_static_mono=no
835 if test "x$enable_shared" = "xno"; then
836    with_shared_mono=no
839 if test "x$enable_libraries" = "xno"; then
840    with_shared_mono=no
843 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
845 if test "x$host_win32" = "xyes"; then
846    # Boehm GC requires the runtime to be in its own dll
847    with_static_mono=no
850 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
851 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
852 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
853 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
855 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
856 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
857         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
858         ORIG_CFLAGS=$CFLAGS
859         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
860         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
861         AC_TRY_COMPILE([], [
862         ], [
863            AC_MSG_RESULT(yes)
864            # Pass it to libgc as well
865            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
866         ], [
867            AC_MSG_RESULT(no)
868            CFLAGS=$ORIG_CFLAGS
869         ])
872 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
874 if test x$enable_small_config = xyes; then
875         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
876         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
879 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)
881 DISABLED_FEATURES=none
882 csc_compiler=default
883 endian=unknown
884 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
885 AC_MSG_CHECKING([CSharp compiler to use])
886 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
887    if test x$withval = xmcs; then
888        csc_compiler=mcs
889    elif test x$withval = xroslyn; then
890        csc_compiler=roslyn
891    elif test x$withval = xdefault; then
892        :
893    else
894        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
895    fi
896 ],[csc_compiler=default])
898 if test $csc_compiler = default; then
899    if test $endian = big; then
900       csc_compiler=mcs
901    elif test $endian = little; then
902       case "$host" in
903         powerpc*) csc_compiler=mcs ;;
904         *) csc_compiler=roslyn ;;
905       esac
906    else
907       csc_compiler=mcs
908    fi
910 AC_MSG_RESULT($csc_compiler)
912 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
913 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
914 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])
917 if test x$target_win32 = xyes; then
918 with_jemalloc=no
919 with_jemalloc_assert=no
920 with_jemalloc_always=no
923 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
924 if test "x$with_jemalloc_assert" = "xyes"; then
925 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
926 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
927 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
930 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
931 if test "x$with_jemalloc_always" = "xyes"; then
932 with_jemalloc=yes
933 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
934 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
935 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
938 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
939 if test "x$with_jemalloc" = "xyes"; then
940 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
941 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
942 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
944 if test "x$target_mach" = "xyes"; then
945         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
948 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
949 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
951 AC_SUBST(JEMALLOC_CFLAGS)
952 AC_SUBST(JEMALLOC_CPPFLAGS)
953 AC_SUBST(JEMALLOC_LDFLAGS)
954 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
957 # Terminology:
958 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
959 # MERP - The MS telemetry profile. Not for general use.
960 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
962 # Structured crashes are not merp crashes. Structured crashes are json dumps made by mono during crashes. Merp upload is going to use the dumping code is a very specific way, and is enabled at runtime with an icall.
964 #--with-crash_privacy=yes --with-structured_crashes=no means we don't wanna dump in non-merp-enabled builds, and we want to not send symbol strings. This is going to be the default pair of settings for VS4Mac.
965 #--with-crash_privacy=yes --with-structured_crashes=yes means you want to see crashes on your console, and you want to not see unmanaged symbol names. This is an option for proprietary apps that have manual bugs filed.
966 #--with-crash_privacy=no --with-structured_crashes=no means you want to see no crash dumps on failure and you don't care about privacy. This is how you'd set a "don't want it, don't care" configuration.
967 #--with-crash_privacy=no --with-structured_crashes=yes means you want full crashes and you want to see them in the terminal, not on telemetry. This is going to be how we build for CI.
969 AC_ARG_WITH(crash-privacy,       [  --with-crash_privacy=yes,no         If you want your crashes to not include names of symbols present in the binary. ], [], [with_crash_privacy=yes])
970 AC_ARG_WITH(structured-crashes,  [  --with-structured_crashes=yes,no    If you want your unmanaged crashes to result in a small crash dump file. ],        [], [with_structured_crashes=yes])
971 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
973 if test "x$with_crash_privacy" = "xyes"; then
974 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
977 if test "x$with_structured_crashes" = "xno"; then
978 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
981 case "$host" in
982         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
983                 crash_reporting=no
984                 ;;
985 esac
987 if test "x$crash_reporting" != "xyes"; then
988 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
989 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
992 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
993 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
995 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
996 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
998 if test x$enable_monodroid = xyes; then
999         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1002 if test x$enable_monotouch = xyes; then
1003         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1006 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1008 # mono/corefx/native has a lot of invalid C++98 in its headers
1009 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1010 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1011 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1012 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1014 AC_SUBST(CXXFLAGS_COMMON)
1016 if test "x$enable_cxx" = "xyes"; then
1018         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1020         # -std=gnu99 -xc++ is not allowed and errors.
1021         CXX_REMOVE_CFLAGS=-std=gnu99
1022         # These give warnings and should be removed. They are C-only.
1023         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1024         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1025         # Likewise with CentOS 6 gcc 4.4.
1026         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1028         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1029         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1030         # generates a warning every time we run gcc which is very unsightly.
1031         # The warning is for e.g. sprintf(foo, "") which can just be
1032         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1033         # and completely legal and valid.
1034         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1035         # Alternatively, just run $CXX -xc++ -c /dev/null.
1036         AC_LANG_PUSH(C++)
1037         ORIG_CXXFLAGS=$CXXFLAGS
1038         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1039         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1040         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1041                                  [ AC_MSG_RESULT(no)
1042                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1043         CXXFLAGS=$ORIG_CXXFLAGS
1044         AC_LANG_POP(C++)
1046 AC_SUBST(CXX_ADD_CFLAGS)
1047 AC_SUBST(CXX_REMOVE_CFLAGS)
1050 # Set the build profiles and options before things which use them
1053 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])
1054 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1055 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1056 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])
1057 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])
1058 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1059 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1060 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])
1061 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])
1062 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1063 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1064 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1065 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1068 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal   Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1069 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])
1070 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])
1071 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])
1074 dnl Spectre compiler mitigation flag checks
1076 if test "x$with_spectre_mitigation" = "xyes"; then
1077    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1078    SPECTRE_CFLAGS=
1079    SPECTRE_INDIRECT_BRANCH_KIND=
1080    case "x$with_spectre_indirect_branch_choice" in
1081        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1082        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1083        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1084        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1085        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1086    esac
1088    SPECTRE_FUNCTION_RETURN_KIND=""
1089    case "x$with_spectre_function_return_choice" in
1090        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1091        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1092        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1093        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1094        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1095    esac
1097    AX_CHECK_COMPILE_FLAG(
1098         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1099         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1100    )
1102    AX_CHECK_COMPILE_FLAG(
1103         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1104         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1105    )
1107    if test "x$SPECTRE_CFLAGS" != "x" ; then
1108         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1109         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1110         spectre_mitigation_status="mitigation enabled"
1111    fi
1112 else
1113         spectre_mitigation_status="no mitigation"
1117 dnl Profile defaults
1119 TEST_PROFILE=default
1120 enable_llvm_default=no
1122 with_profile4_x_default=no
1123 with_monodroid_default=no
1124 with_monotouch_default=no
1125 with_monotouch_watch_default=no
1126 with_monotouch_tv_default=no
1127 with_xammac_default=no
1128 with_testing_aot_hybrid_default=no
1129 with_testing_aot_full_default=no
1130 with_winaot_default=no
1131 with_orbis_default=no
1132 with_unreal_default=no
1133 with_wasm_default=no
1135 with_bitcode_default=no
1136 enable_cooperative_suspend_default=no
1137 enable_hybrid_suspend_default=no
1139 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1141 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1143 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1144    DISABLE_MCS_DOCS_default=yes
1145 elif test x$with_runtime_preset = xnet_4_x; then
1146    with_profile4_x_default=yes
1147 elif test x$with_runtime_preset = xall; then
1148    with_profile4_x_default=yes
1149    with_monodroid_default=yes
1150    with_monotouch_default=yes
1151    with_monotouch_watch_default=yes
1152    with_monotouch_tv_default=yes
1153    with_xammac_default=yes
1154    with_winaot_default=yes
1155    with_orbis_default=yes
1156    with_unreal_default=yes
1157    with_wasm_default=yes
1158    with_testing_aot_hybrid_default=yes
1159    with_testing_aot_full_default=yes
1160 elif test x$with_runtime_preset = xbitcode; then
1161    DISABLE_MCS_DOCS_default=yes
1162    with_testing_aot_full_default=yes
1163    with_bitcode_default=yes
1164    enable_cooperative_suspend_default=yes
1165    TEST_PROFILE=testing_aot_full
1166    enable_llvm_default=yes
1168    mono_feature_disable_com='yes'
1169    mono_feature_disable_remoting='yes'
1170    mono_feature_disable_reflection_emit_save='yes'
1171    mono_feature_disable_reflection_emit='yes'
1172    mono_feature_disable_appdomains='yes'
1174    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1175    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1176    AOT_MODE="llvmonly"
1177 elif test x$with_runtime_preset = xfullaot; then
1178    DISABLE_MCS_DOCS_default=yes
1179    with_testing_aot_full_default=yes
1180    TEST_PROFILE=testing_aot_full
1182    mono_feature_disable_com='yes'
1183    mono_feature_disable_remoting='yes'
1184    mono_feature_disable_reflection_emit_save='yes'
1185    mono_feature_disable_reflection_emit='yes'
1186    mono_feature_disable_appdomains='yes'
1188    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1189    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1190    AOT_MODE="full"
1191 elif test x$with_runtime_preset = xfullaot_llvm; then
1192    DISABLE_MCS_DOCS_default=yes
1193    with_testing_aot_full_default=yes
1194    TEST_PROFILE=testing_aot_full
1196    mono_feature_disable_com='yes'
1197    mono_feature_disable_remoting='yes'
1198    mono_feature_disable_reflection_emit_save='yes'
1199    mono_feature_disable_reflection_emit='yes'
1200    mono_feature_disable_appdomains='yes'
1202    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1203    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1204    AOT_MODE="full"
1205 elif test x$with_runtime_preset = xhybridaot; then
1206    DISABLE_MCS_DOCS_default=yes
1207    with_testing_aot_hybrid_default=yes
1208    TEST_PROFILE=testing_aot_hybrid 
1210    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1211    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1212 elif test x$with_runtime_preset = xhybridaot_llvm; then
1213    DISABLE_MCS_DOCS_default=yes
1214    with_testing_aot_hybrid_default=yes
1215    TEST_PROFILE=testing_aot_hybrid
1217    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1218    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1219 elif test x$with_runtime_preset = xaot; then
1220    with_profile4_x_default=yes
1222    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1223    AOT_RUN_FLAGS=""
1225    DISABLE_MCS_DOCS_default=yes
1226 elif test x$with_runtime_preset = xaot_llvm; then
1227    with_profile4_x_default=yes
1229    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1230    AOT_RUN_FLAGS=""
1232    DISABLE_MCS_DOCS_default=yes
1233 elif test x$with_runtime_preset = xwinaot; then
1234    DISABLE_MCS_DOCS_default=yes
1235    with_winaot_default=yes
1236    TEST_PROFILE=winaot
1238    mono_feature_disable_com='yes'
1239    mono_feature_disable_remoting='yes'
1240    mono_feature_disable_reflection_emit_save='yes'
1241    mono_feature_disable_reflection_emit='yes'
1242    mono_feature_disable_appdomains='yes'
1244    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1245    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1246    AOT_MODE="llvmonly"
1247 elif test x$with_runtime_preset = xorbis; then
1248    DISABLE_MCS_DOCS_default=yes
1249    with_orbis_default=yes
1250    TEST_PROFILE=orbis
1252    mono_feature_disable_com='yes'
1253    mono_feature_disable_remoting='yes'
1254    mono_feature_disable_reflection_emit_save='yes'
1255    mono_feature_disable_reflection_emit='yes'
1256    mono_feature_disable_appdomains='yes'
1258    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1259    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1260    AOT_MODE="full"
1261 elif test x$with_runtime_preset = xunreal; then
1262    DISABLE_MCS_DOCS_default=yes
1263    with_unreal_default=yes
1264    TEST_PROFILE=unreal
1266    mono_feature_disable_com='yes'
1267    mono_feature_disable_remoting='yes'
1268    mono_feature_disable_appdomains='no'
1270    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1271    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1272 elif test x$with_runtime_preset = xwasm; then
1273    DISABLE_MCS_DOCS_default=yes
1274    with_wasm_default=yes
1275    TEST_PROFILE=wasm
1277    mono_feature_disable_com='yes'
1278    mono_feature_disable_remoting='yes'
1279    mono_feature_disable_reflection_emit_save='yes'
1280    mono_feature_disable_reflection_emit='yes'
1281    mono_feature_disable_appdomains='yes'
1283    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1284    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1285 else
1286    with_profile4_x_default=yes
1289 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1290    AC_SUBST(AOT_BUILD_FLAGS)
1291    AC_SUBST(AOT_RUN_FLAGS)
1292    # For llvmonlycheck + fullaotcheck
1293    AC_SUBST(INVARIANT_AOT_OPTIONS)
1296 AC_SUBST(TEST_PROFILE)
1298 if test "x$with_profile4_x" = "xdefault"; then
1299    with_profile4_x=$with_profile4_x_default
1301 if test "x$with_monodroid" = "xdefault"; then
1302    with_monodroid=$with_monodroid_default
1304 if test "x$with_monotouch" = "xdefault"; then
1305    with_monotouch=$with_monotouch_default
1307 if test "x$with_monotouch_watch" = "xdefault"; then
1308    with_monotouch_watch=$with_monotouch_watch_default
1310 if test "x$with_monotouch_tv" = "xdefault"; then
1311    with_monotouch_tv=$with_monotouch_tv_default
1313 if test "x$with_bitcode" = "xdefault"; then
1314    with_bitcode=$with_bitcode_default
1316 if test "x$with_xammac" = "xdefault"; then
1317    with_xammac=$with_xammac_default
1319 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1320    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1322 if test "x$with_testing_aot_full" = "xdefault"; then
1323    with_testing_aot_full=$with_testing_aot_full_default
1325 if test "x$with_winaot" = "xdefault"; then
1326    with_winaot=$with_winaot_default
1328 if test "x$with_orbis" = "xdefault"; then
1329    with_orbis=$with_orbis_default
1331 if test "x$with_unreal" = "xdefault"; then
1332    with_unreal=$with_unreal_default
1334 if test "x$with_wasm" = "xdefault"; then
1335    with_wasm=$with_wasm_default
1339 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1340 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1341 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1342 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1343 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1344 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1345 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1346 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1347 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1348 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1349 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1350 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1351 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1352 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"])
1353 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1355 default_profile=net_4_x
1356 if test -z "$INSTALL_MONODROID_TRUE"; then :
1357    default_profile=monodroid
1359 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1360    default_profile=monotouch
1362 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1363    default_profile=xammac
1365 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1366    default_profile=testing_aot_hybrid
1368 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1369    default_profile=testing_aot_full
1371 if test -z "$INSTALL_WINAOT_TRUE"; then :
1372    default_profile=winaot
1374 if test -z "$INSTALL_ORBIS_TRUE"; then :
1375    default_profile=orbis
1377 if test -z "$INSTALL_UNREAL_TRUE"; then :
1378    default_profile=unreal
1380 if test -z "$INSTALL_WASM_TRUE"; then :
1381    default_profile=wasm
1383 if test -z "$INSTALL_4_x_TRUE"; then :
1384    default_profile=net_4_x
1386 DEFAULT_PROFILE=$default_profile
1387 AC_SUBST(DEFAULT_PROFILE)
1390 # End build profile configuration
1393 if test x$USE_NLS = xprofile_default; then
1395         AC_MSG_CHECKING([NLS used])
1397         # We make the default value for USE_NLS
1398         # "no" on OSX because it isn't available on most
1399         # default OSX installs. The most common configurations will
1400         # all disable it, so this saves us typing.
1401         if test x$host_darwin = xyes; then
1402                 USE_NLS=no;
1403         else
1404                 USE_NLS=yes;
1405         fi
1407         AC_SUBST([USE_NLS])
1408         AC_MSG_RESULT([$USE_NLS])
1411 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1412      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1413      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1414          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1416         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1417                 eval "mono_feature_disable_$feature='yes'"
1418         done
1419         DISABLED_FEATURES=$enable_minimal
1420         disabled="Disabled:      $enable_minimal"
1421 ],[])
1423 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1425 if test "x$mono_feature_disable_aot" = "xyes"; then
1426         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1427         enable_system_aot=no
1428         AC_MSG_NOTICE([Disabled AOT compiler])
1431 if test "x$mono_feature_disable_profiler" = "xyes"; then
1432         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1433         AC_MSG_NOTICE([Disabled support for the profiler])
1435 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1437 if test "x$mono_feature_disable_decimal" = "xyes"; then
1438         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1439         AC_MSG_NOTICE([Disabled support for decimal])
1442 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1443         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1444         AC_MSG_NOTICE([Disabled support for P/Invoke])
1447 if test "x$mono_feature_disable_debug" = "xyes"; then
1448         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1449         AC_MSG_NOTICE([Disabled support for runtime debugging])
1452 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1453         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1454         mono_feature_disable_reflection_emit_save=yes
1455         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1458 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1459         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1460         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1463 if test "x$mono_feature_disable_large_code" = "xyes"; then
1464         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1465         AC_MSG_NOTICE([Disabled support for large assemblies])
1468 if test "x$mono_feature_disable_logging" = "xyes"; then
1469         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1470         AC_MSG_NOTICE([Disabled support for logging])
1473 if test "x$mono_feature_disable_com" = "xyes"; then
1474         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1475         AC_MSG_NOTICE([Disabled COM support])
1478 if test "x$mono_feature_disable_ssa" = "xyes"; then
1479         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1480         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1483 if test "x$mono_feature_disable_generics" = "xyes"; then
1484         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1485         AC_MSG_NOTICE([Disabled Generics Support])
1488 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1489         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1490         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1493 if test "x$mono_feature_disable_portability" = "xyes"; then
1494         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1495         AC_MSG_NOTICE([Disabled IO Portability layer])
1498 if test "x$mono_feature_disable_attach" = "xyes"; then
1499         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1500         AC_MSG_NOTICE([Disabled agent attach])
1503 if test "x$mono_feature_disable_verifier" = "xyes"; then
1504         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1505         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1508 if test "x$mono_feature_disable_jit" = "xyes"; then
1509         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1510         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1513 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1515 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1516         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1517         AC_MSG_NOTICE([Disabled the interpreter])
1520 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1522 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1523         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1526 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1528 if test "x$mono_feature_disable_simd" = "xyes"; then
1529         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1530         AC_MSG_NOTICE([Disabled SIMD support])
1533 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1534         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1535         AC_MSG_NOTICE([Disabled Soft Debugger.])
1538 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1540 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1541         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1542         AC_MSG_NOTICE([Disabled Performance Counters.])
1544 if test "x$mono_feature_disable_normalization" = "xyes"; then
1545         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1546         AC_MSG_NOTICE([Disabled String normalization support.])
1549 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1550 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1551         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1552         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1555 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1556         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1557         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1560 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1561         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1562         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1565 if test "x$mono_feature_disable_remoting" = "xyes"; then
1566         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1567         AC_MSG_NOTICE([Disabled remoting])
1570 if test "x$mono_feature_disable_security" = "xyes"; then
1571         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1572         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1575 if test "x$mono_feature_disable_lldb" = "xyes"; then
1576         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1577         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1580 if test "x$mono_feature_disable_mdb" = "xyes"; then
1581         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1582         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1585 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1586         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1587         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1591 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1592         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1593         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1596 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1597         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1598         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1601 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1602         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1603         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1606 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1607 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1609 has_extension_module=no
1610 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1612         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1613                 if test x$extension = xdefault ; then
1614                         has_extension_module=yes;
1615                 fi
1616         done
1617         if test x$enable_extension_module = xyes; then
1618                 has_extension_module=yes;
1619         fi
1620 ], [])
1622 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1624 if test x$has_extension_module != xno ; then
1625         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1626         AC_MSG_NOTICE([Enabling mono extension module.])
1629 # Deprecated
1630 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1632 AC_MSG_CHECKING(for visibility __attribute__)
1633 AC_COMPILE_IFELSE([
1634         AC_LANG_SOURCE([[
1635                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1636                 int main () { doit (); return 0; }
1637         ]])
1638 ], [
1639    have_visibility_hidden=yes
1640    AC_MSG_RESULT(yes)
1641 ], [
1642    have_visibility_hidden=no
1643    AC_MSG_RESULT(no)
1647 dnl Boehm GC configuration
1650 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1652 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1653 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1655 if test "x$support_boehm" = "xyes"; then
1657         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1658         if test x$enable_parallel_mark = xyes; then
1659                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1660         fi
1662         gc_msg=""
1663         LIBGC_CPPFLAGS=
1664         LIBGC_LIBS=
1665         LIBGC_STATIC_LIBS=
1666         libgc_dir=
1667         case "x$libgc" in
1668                 xincluded)
1669                         if test "x$support_boehm" = "xyes"; then
1670                                 libgc_dir=libgc
1671                         fi
1673                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1674                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1675                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1677                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1679                         if test x$target_win32 = xyes; then
1680                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1681                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1682                         fi
1684                         gc_msg="Included Boehm GC with typed GC"
1685                         if test x$enable_parallel_mark = xyes; then
1686                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1687                                 gc_msg="$gc_msg and parallel mark"
1688                         else
1689                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1690                         fi
1691                         ;;
1693                 xboehm|xbohem|xyes)
1694                         AC_MSG_WARN("External Boehm is no longer supported")
1695                         ;;
1697                 xsgen)
1698                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1699                         ;;
1701                 xnone)
1702                         AC_MSG_WARN("Compiling mono without GC.")
1703                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1704                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1705                         gc_msg="none"
1706                         ;;
1707                 *)
1708                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1709                         ;;
1710         esac
1712         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])
1713         if test "x$large_heap" = "xyes"; then
1714            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1715         fi
1717         AC_SUBST(LIBGC_CPPFLAGS)
1718         AC_SUBST(LIBGC_LIBS)
1719         AC_SUBST(LIBGC_STATIC_LIBS)
1720         AC_SUBST(libgc_dir)
1721         AC_SUBST(BOEHM_DEFINES)
1724 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1727 dnl End of Boehm GC Configuration
1730 dnl *************************************
1731 dnl *** Checks for zero length arrays ***
1732 dnl *************************************
1733 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1734 AC_TRY_COMPILE([
1735         struct s {
1736                 int  length;
1737                 char data [0];
1738         };
1739 ], [], [
1740         AC_MSG_RESULT(yes)
1741         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1742 ], [
1743         AC_MSG_RESULT(no)
1744         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1747 dnl ***********************************
1748 dnl *** Checks for signals
1749 dnl ***********************************
1750 AC_CHECK_HEADERS(signal.h)
1751 AC_CHECK_FUNCS(sigaction)
1752 AC_CHECK_FUNCS(kill)
1753 AC_CHECK_FUNCS(signal)
1755 # signal() is declared inline in Android headers
1756 # so we need to workaround it by overriding the check.
1757 if test x$platform_android = xyes; then
1758         AC_DEFINE(HAVE_SIGNAL,1)
1761 dnl ***********************************
1762 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1763 dnl ***********************************
1764 enable_gss=no;
1765 AC_MSG_CHECKING(for GSS/GSS.h)
1766 AC_TRY_COMPILE([
1767     #include <GSS/GSS.h>
1768 ], [
1770     AC_MSG_RESULT(yes)
1771     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1772     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1773     enable_gss=yes
1774 ], [
1775     AC_MSG_RESULT(no)
1778 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1779 AC_TRY_COMPILE([
1780     #include <gssapi/gssapi_ext.h>
1781 ], [
1783     AC_MSG_RESULT(yes)
1784     enable_gss=yes
1785 ], [
1786     AC_MSG_RESULT(no)
1789 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1790 AC_TRY_COMPILE([
1791     #include <gssapi/gssapi_ext.h>
1792     #include <gssapi/gssapi_krb5.h>
1793     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1794 ], [
1796     AC_MSG_RESULT(yes)
1797     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1798 ], [
1799     AC_MSG_RESULT(no)
1802 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1804 if test x$host_win32 = xno; then
1805         dnl *************************************
1806         dnl *** Checks for time capabilities ***
1807         dnl *************************************
1809         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1810         AC_TRY_COMPILE([#include <time.h>], [
1811                 const int foo = CLOCK_MONOTONIC;
1812         ],[
1813                 AC_MSG_RESULT(yes)
1814                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1815         ], [
1816                 AC_MSG_RESULT(no)
1817         ])
1819         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1820         AC_TRY_COMPILE([#include <time.h>], [
1821                 const int foo = CLOCK_MONOTONIC_COARSE;
1822         ],[
1823                 AC_MSG_RESULT(yes)
1824                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1825         ], [
1826                 AC_MSG_RESULT(no)
1827         ])
1829         AC_MSG_CHECKING(for CLOCK_REALTIME)
1830         AC_TRY_COMPILE([#include <time.h>], [
1831                 const int foo = CLOCK_REALTIME;
1832         ],[
1833                 AC_MSG_RESULT(yes)
1834                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1835         ], [
1836                 AC_MSG_RESULT(no)
1837         ])
1839         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1840         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1841         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1842         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1843         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1844         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1846         dnl hires monotonic clock support
1847         AC_SEARCH_LIBS(clock_gettime, rt)
1848         AC_CHECK_FUNCS(clock_nanosleep)
1850         dnl dynamic loader support
1851         AC_CHECK_FUNC(dlopen, DL_LIB="",
1852                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1853         )
1854         if test x$dl_support = xno; then
1855                 AC_MSG_WARN([No dynamic loading support available])
1856         else
1857                 LIBS="$LIBS $DL_LIB"
1858                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1859                 dnl from glib's configure.ac
1860                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1861                         mono_cv_uscore,[
1862                         AC_TRY_RUN([#include <dlfcn.h>
1863                         int mono_underscore_test (void) { return 42; }
1864                         int main() {
1865                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1866                           handle = dlopen ((void*)0, 0);
1867                           if (handle) {
1868                             f1 = dlsym (handle, "mono_underscore_test");
1869                             f2 = dlsym (handle, "_mono_underscore_test");
1870                           } return (!f2 || f1);
1871                         }],
1872                                 [mono_cv_uscore=yes],
1873                                 [mono_cv_uscore=no],
1874                         [])
1875                 ])
1876                 if test "x$mono_cv_uscore" = "xyes"; then
1877                         MONO_DL_NEED_USCORE=1
1878                 else
1879                         MONO_DL_NEED_USCORE=0
1880                 fi
1881                 AC_SUBST(MONO_DL_NEED_USCORE)
1882                 AC_CHECK_FUNC(dlerror)
1883         fi
1885         dnl ******************************************************************
1886         dnl *** Checks for the IKVM JNI interface library                  ***
1887         dnl ******************************************************************
1888         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])
1890         ikvm_native_dir=
1891         if test x$with_ikvm_native = xyes; then
1892                 ikvm_native_dir=ikvm-native
1893                 jdk_headers_found="IKVM Native"
1894         fi
1896         AC_SUBST(ikvm_native_dir)
1898         AC_CHECK_HEADERS(execinfo.h)
1900         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1902         AC_CHECK_FUNCS(getgrgid_r)
1903         AC_CHECK_FUNCS(getgrnam_r)
1904         AC_CHECK_FUNCS(getresuid)
1905         AC_CHECK_FUNCS(setresuid)
1906         AC_CHECK_FUNCS(kqueue)
1907         AC_CHECK_FUNCS(backtrace_symbols)
1908         AC_CHECK_FUNCS(mkstemp)
1909         AC_CHECK_FUNCS(mmap)
1910         AC_CHECK_FUNCS(madvise)
1911         AC_CHECK_FUNCS(getrusage)
1912         AC_CHECK_FUNCS(getpriority)
1913         AC_CHECK_FUNCS(setpriority)
1914         AC_CHECK_FUNCS(dl_iterate_phdr)
1915         AC_CHECK_FUNCS(dladdr)
1916         AC_CHECK_FUNCS(sysconf)
1917         AC_CHECK_FUNCS(getrlimit)
1918         AC_CHECK_FUNCS(prctl)
1919         AC_CHECK_FUNCS(arc4random)
1920         AC_CHECK_FUNCS(nl_langinfo)
1922         AC_CHECK_FUNCS(sched_getaffinity)
1923         AC_CHECK_FUNCS(sched_setaffinity)
1924         AC_CHECK_FUNCS(sched_getcpu)
1926         if test x$platform_android != xyes; then
1927                 AC_CHECK_FUNCS(getpwnam_r)
1928                 AC_CHECK_FUNCS(getpwuid_r)
1929         fi
1931         AC_FUNC_STRERROR_R()
1933         dnl ****************************************************************
1934         dnl *** Check for sched_setaffinity from glibc versions before   ***
1935         dnl *** 2.3.4. The older versions of the function only take 2    ***
1936         dnl *** parameters, not 3.                                       ***
1937         dnl ***                                                          ***
1938         dnl *** Because the interface change was not made in a minor     ***
1939         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1940         dnl *** won't always indicate the interface sched_affinity has.  ***
1941         dnl ****************************************************************
1942         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1943         AC_TRY_COMPILE([#include <sched.h>], [
1944             int mask = 1; 
1945             sched_setaffinity(0, &mask);
1946         ], [
1947                 # Yes, we have it...
1948                 AC_MSG_RESULT(yes)
1949                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1950         ], [
1951                 # We have the new, three-parameter version
1952                 AC_MSG_RESULT(no)
1953         ])
1954         AC_TRY_COMPILE([#include <sched.h>], [
1955              CPU_COUNT((void *) 0);
1956         ], [
1957                 AC_MSG_RESULT(yes)
1958                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1959         ], [
1960                 # We have the new, three-parameter version
1961                 AC_MSG_RESULT(no)
1962         ])
1964         dnl ******************************************************************
1965         dnl *** Check for large file support                               ***
1966         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1967         dnl ******************************************************************
1968         
1969         # Check that off_t can represent 2**63 - 1 correctly, working around
1970         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1971         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1972         large_offt=no
1973         AC_DEFUN([LARGE_FILES], [
1974                 large_CPPFLAGS=$CPPFLAGS
1975                 CPPFLAGS="$CPPFLAGS $1"
1976                 AC_TRY_COMPILE([
1977                         #include <sys/types.h>
1978                         #include <limits.h>
1979                 ], [
1980                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1981                         #define COMPILE_TIME_ASSERT(pred) \
1982                                 switch(0){case 0:case pred:;}
1983                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1984                 ], [
1985                         AC_MSG_RESULT(ok)
1986                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1987                         large_CPPFLAGS="$large_CPPFLAGS $1"
1988                         large_offt=yes
1989                 ], [
1990                         AC_MSG_RESULT(no)
1991                 ])
1992                 CPPFLAGS=$large_CPPFLAGS
1993         ])
1995         AC_MSG_CHECKING(if off_t is 64 bits wide)
1996         LARGE_FILES("")
1997         if test $large_offt = no; then
1998                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1999                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2000         fi
2001         if test $large_offt = no; then
2002                 AC_MSG_WARN([No 64 bit file size support available])
2003         fi
2004         
2005         dnl *****************************
2006         dnl *** Checks for libsocket  ***
2007         dnl *****************************
2008         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2010         case "$host" in
2011                 *-*-*freebsd*)
2012                         dnl *****************************
2013                         dnl *** Checks for libinotify ***
2014                         dnl *****************************
2015                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2016         esac
2018         dnl *******************************
2019         dnl *** Checks for MSG_NOSIGNAL ***
2020         dnl *******************************
2021         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2022         AC_TRY_COMPILE([#include <sys/socket.h>], [
2023                 int f = MSG_NOSIGNAL;
2024         ], [
2025                 # Yes, we have it...
2026                 AC_MSG_RESULT(yes)
2027                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2028         ], [
2029                 # We'll have to use signals
2030                 AC_MSG_RESULT(no)
2031         ])
2033         dnl *****************************
2034         dnl *** Checks for IPPROTO_IP ***
2035         dnl *****************************
2036         AC_MSG_CHECKING(for IPPROTO_IP)
2037         AC_TRY_COMPILE([#include <netinet/in.h>], [
2038                 int level = IPPROTO_IP;
2039         ], [
2040                 # Yes, we have it...
2041                 AC_MSG_RESULT(yes)
2042                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2043         ], [
2044                 # We'll have to use getprotobyname
2045                 AC_MSG_RESULT(no)
2046         ])
2048         dnl *******************************
2049         dnl *** Checks for IPPROTO_IPV6 ***
2050         dnl *******************************
2051         AC_MSG_CHECKING(for IPPROTO_IPV6)
2052         AC_TRY_COMPILE([#include <netinet/in.h>], [
2053                 int level = IPPROTO_IPV6;
2054         ], [
2055                 # Yes, we have it...
2056                 AC_MSG_RESULT(yes)
2057                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2058         ], [
2059                 # We'll have to use getprotobyname
2060                 AC_MSG_RESULT(no)
2061         ])
2063         dnl ******************************
2064         dnl *** Checks for IPPROTO_TCP ***
2065         dnl ******************************
2066         AC_MSG_CHECKING(for IPPROTO_TCP)
2067         AC_TRY_COMPILE([#include <netinet/in.h>], [
2068                 int level = IPPROTO_TCP;
2069         ], [
2070                 # Yes, we have it...
2071                 AC_MSG_RESULT(yes)
2072                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2073         ], [
2074                 # We'll have to use getprotobyname
2075                 AC_MSG_RESULT(no)
2076         ])
2078         dnl *****************************
2079         dnl *** Checks for SOL_IP     ***
2080         dnl *****************************
2081         AC_MSG_CHECKING(for SOL_IP)
2082         AC_TRY_COMPILE([#include <netdb.h>], [
2083                 int level = SOL_IP;
2084         ], [
2085                 # Yes, we have it...
2086                 AC_MSG_RESULT(yes)
2087                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2088         ], [
2089                 # We'll have to use getprotobyname
2090                 AC_MSG_RESULT(no)
2091         ])
2093         dnl *****************************
2094         dnl *** Checks for SOL_IPV6     ***
2095         dnl *****************************
2096         AC_MSG_CHECKING(for SOL_IPV6)
2097         AC_TRY_COMPILE([#include <netdb.h>], [
2098                 int level = SOL_IPV6;
2099         ], [
2100                 # Yes, we have it...
2101                 AC_MSG_RESULT(yes)
2102                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2103         ], [
2104                 # We'll have to use getprotobyname
2105                 AC_MSG_RESULT(no)
2106         ])
2108         dnl *****************************
2109         dnl *** Checks for SOL_TCP    ***
2110         dnl *****************************
2111         AC_MSG_CHECKING(for SOL_TCP)
2112         AC_TRY_COMPILE([#include <netdb.h>], [
2113                 int level = SOL_TCP;
2114         ], [
2115                 # Yes, we have it...
2116                 AC_MSG_RESULT(yes)
2117                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2118         ], [
2119                 # We'll have to use getprotobyname
2120                 AC_MSG_RESULT(no)
2121         ])
2123         dnl *****************************
2124         dnl *** Checks for IP_PKTINFO ***
2125         dnl *****************************
2126         AC_MSG_CHECKING(for IP_PKTINFO)
2127         AC_TRY_COMPILE([#include <linux/in.h>], [
2128                 int level = IP_PKTINFO;
2129         ], [
2130                 # Yes, we have it...
2131                 AC_MSG_RESULT(yes)
2132                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2133         ], [
2134                 AC_MSG_RESULT(no)
2135         ])
2137         dnl *****************************
2138         dnl *** Checks for IPV6_PKTINFO ***
2139         dnl *****************************
2140         AC_MSG_CHECKING(for IPV6_PKTINFO)
2141         AC_TRY_COMPILE([#include <netdb.h>], [
2142                 int level = IPV6_PKTINFO;
2143         ], [
2144                 # Yes, we have it...
2145                 AC_MSG_RESULT(yes)
2146                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2147         ], [
2148                 AC_MSG_RESULT(no)
2149         ])
2151         dnl **********************************
2152         dnl *** Checks for IP_DONTFRAG     ***
2153         dnl **********************************
2154         AC_MSG_CHECKING(for IP_DONTFRAG)
2155         AC_TRY_COMPILE([#include <netinet/in.h>], [
2156                 int level = IP_DONTFRAG;
2157         ], [
2158                 # Yes, we have it...
2159                 AC_MSG_RESULT(yes)
2160                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2161         ], [
2162                 AC_MSG_RESULT(no)
2163         ])
2165         dnl **********************************
2166         dnl *** Checks for IP_DONTFRAGMENT ***
2167         dnl **********************************
2168         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2169         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2170                 int level = IP_DONTFRAGMENT;
2171         ], [
2172                 # Yes, we have it...
2173                 AC_MSG_RESULT(yes)
2174                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2175         ], [
2176                 AC_MSG_RESULT(no)
2177         ])
2179         dnl **********************************
2180         dnl *** Checks for IP_MTU_DISCOVER ***
2181         dnl **********************************
2182         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2183         AC_TRY_COMPILE([#include <linux/in.h>], [
2184                 int level = IP_MTU_DISCOVER;
2185         ], [
2186                 # Yes, we have it...
2187                 AC_MSG_RESULT(yes)
2188                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2189         ], [
2190                 AC_MSG_RESULT(no)
2191         ])
2193         dnl **********************************
2194         dnl *** Checks for  IP_PMTUDISC_DO ***
2195         dnl **********************************
2196         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2197         AC_TRY_COMPILE([#include <linux/in.h>], [
2198                 int level = IP_PMTUDISC_DO;
2199         ], [
2200                 # Yes, we have it...
2201                 AC_MSG_RESULT(yes)
2202                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2203         ], [
2204                 AC_MSG_RESULT(no)
2205         ])
2207         dnl *********************************
2208         dnl *** Check for struct ip_mreqn ***
2209         dnl *********************************
2210         AC_MSG_CHECKING(for struct ip_mreqn)
2211         AC_TRY_COMPILE([#include <netinet/in.h>], [
2212                 struct ip_mreqn mreq;
2213                 mreq.imr_address.s_addr = 0;
2214         ], [
2215                 # Yes, we have it...
2216                 AC_MSG_RESULT(yes)
2217                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2218         ], [
2219                 # We'll just have to try and use struct ip_mreq
2220                 AC_MSG_RESULT(no)
2221                 AC_MSG_CHECKING(for struct ip_mreq)
2222                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2223                         struct ip_mreq mreq;
2224                         mreq.imr_interface.s_addr = 0;
2225                 ], [
2226                         # Yes, we have it...
2227                         AC_MSG_RESULT(yes)
2228                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2229                 ], [
2230                         # No multicast support
2231                         AC_MSG_RESULT(no)
2232                 ])
2233         ])
2234         
2235         dnl **********************************
2236         dnl *** Check for getaddrinfo ***
2237         dnl **********************************
2238         AC_MSG_CHECKING(for getaddrinfo)
2239                 AC_TRY_LINK([
2240                 #include <stdio.h>
2241                 #include <netdb.h>
2242         ], [
2243                 getaddrinfo(NULL,NULL,NULL,NULL);
2244         ], [
2245                 # Yes, we have it...
2246                 AC_MSG_RESULT(yes)
2247                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2248         ], [
2249                 AC_MSG_RESULT(no)
2250         ])
2252         dnl **********************************
2253         dnl *** Check for gethostbyname2_r ***
2254         dnl **********************************
2255         AC_MSG_CHECKING(for gethostbyname2_r)
2256                 AC_TRY_LINK([
2257                 #include <stdio.h>
2258                 #include <netdb.h>
2259         ], [
2261                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2262         ], [
2263                 # Yes, we have it...
2264                 AC_MSG_RESULT(yes)
2265                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2266         ], [
2267                 AC_MSG_RESULT(no)
2268         ])
2270         dnl **********************************
2271         dnl *** Check for gethostbyname2 ***
2272         dnl **********************************
2273         AC_MSG_CHECKING(for gethostbyname2)
2274                 AC_TRY_LINK([
2275                 #include <stdio.h>
2276                 #include <netdb.h>
2277         ], [
2278                 gethostbyname2(NULL,0);
2279         ], [
2280                 # Yes, we have it...
2281                 AC_MSG_RESULT(yes)
2282                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2283         ], [
2284                 AC_MSG_RESULT(no)
2285         ])
2287         dnl **********************************
2288         dnl *** Check for gethostbyname ***
2289         dnl **********************************
2290         AC_MSG_CHECKING(for gethostbyname)
2291                 AC_TRY_LINK([
2292                 #include <stdio.h>
2293                 #include <netdb.h>
2294         ], [
2295                 gethostbyname(NULL);
2296         ], [
2297                 # Yes, we have it...
2298                 AC_MSG_RESULT(yes)
2299                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2300         ], [
2301                 AC_MSG_RESULT(no)
2302         ])
2304         dnl **********************************
2305         dnl *** Check for getprotobyname ***
2306         dnl **********************************
2307         AC_MSG_CHECKING(for getprotobyname)
2308                 AC_TRY_LINK([
2309                 #include <stdio.h>
2310                 #include <netdb.h>
2311         ], [
2312                 getprotobyname(NULL);
2313         ], [
2314                 # Yes, we have it...
2315                 AC_MSG_RESULT(yes)
2316                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2317         ], [
2318                 AC_MSG_RESULT(no)
2319         ])
2321         dnl **********************************
2322         dnl *** Check for getprotobyname_r ***
2323         dnl **********************************
2324         AC_MSG_CHECKING(for getprotobyname_r)
2325                 AC_TRY_LINK([
2326                 #include <stdio.h>
2327                 #include <netdb.h>
2328         ], [
2329                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2330         ], [
2331                 # Yes, we have it...
2332                 AC_MSG_RESULT(yes)
2333                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2334         ], [
2335                 AC_MSG_RESULT(no)
2336         ])
2338         dnl **********************************
2339         dnl *** Check for getnameinfo ***
2340         dnl **********************************
2341         AC_MSG_CHECKING(for getnameinfo)
2342                 AC_TRY_LINK([
2343                 #include <stdio.h>
2344                 #include <netdb.h>
2345         ], [
2346                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2347         ], [
2348                 # Yes, we have it...
2349                 AC_MSG_RESULT(yes)
2350                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2351         ], [
2352                 AC_MSG_RESULT(no)
2353         ])
2356         dnl **********************************
2357         dnl *** Check for inet_ntop ***
2358         dnl **********************************
2359         AC_MSG_CHECKING(for inet_ntop)
2360                 AC_TRY_LINK([
2361                 #include <stdio.h>
2362                 #include <arpa/inet.h>
2363         ], [
2364                 inet_ntop (0, NULL, NULL, 0);
2365         ], [
2366                 # Yes, we have it...
2367                 AC_MSG_RESULT(yes)
2368                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2369         ], [
2370                 AC_MSG_RESULT(no)
2371         ])
2373         dnl *****************************
2374         dnl *** Checks for libnsl     ***
2375         dnl *****************************
2376         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2378         AC_CHECK_FUNCS(inet_pton inet_aton)
2380         dnl *****************************
2381         dnl *** Checks for libxnet    ***
2382         dnl *****************************
2383         case "${host}" in
2384                 *solaris* )
2385                         AC_MSG_CHECKING(for Solaris XPG4 support)
2386                         if test -f /usr/lib/libxnet.so; then
2387                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2388                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2389                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2390                                 LIBS="$LIBS -lxnet"
2391                                 AC_MSG_RESULT(yes)
2392                         else
2393                                 AC_MSG_RESULT(no)
2394                         fi
2396                         if test "$GCC" = "yes"; then
2397                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2398                         fi
2399                 ;;
2400         esac
2402         dnl *****************************
2403         dnl *** Checks for libpthread ***
2404         dnl *****************************
2405 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2406 # and libpthread does not exist
2408         case "${host}" in
2409                 *-*-*haiku*)
2410                         dnl Haiku has pthread in libroot (libc equiv)
2411                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2412                 ;;
2413                 *-*-*freebsd*)
2414                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2415                 ;;
2416                 *-*-*openbsd*)
2417                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2418                 ;;
2419                 *)
2420                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2421                 ;;
2422         esac
2423         AC_CHECK_HEADERS(pthread.h)
2424         AC_CHECK_HEADERS(pthread_np.h)
2425         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2426         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2427         AC_CHECK_FUNCS(pthread_kill)
2428         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2429         AC_TRY_COMPILE([ #include <pthread.h>], [
2430                 pthread_mutexattr_t attr;
2431                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2432         ], [
2433                 AC_MSG_RESULT(ok)
2434         ], [
2435                 AC_MSG_RESULT(no)
2436                 AC_ERROR(Posix system lacks support for recursive mutexes)
2437         ])
2438         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2439         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2440         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2441         AC_CHECK_FUNCS(mincore mlock munlock)
2443         dnl ***********************************
2444         dnl *** Checks for working __thread ***
2445         dnl ***********************************
2446         AC_MSG_CHECKING(for working __thread)
2447         if test "x$with_tls" != "x__thread"; then
2448                 AC_MSG_RESULT(disabled)
2449         elif test "x$cross_compiling" = "xyes"; then
2450                 AC_MSG_RESULT(cross compiling, assuming yes)
2451         else
2452                 AC_TRY_RUN([
2453                         #if defined(__APPLE__) && defined(__clang__)
2454                         #error "__thread does not currently work with clang on Mac OS X"
2455                         #endif
2456                         
2457                         #include <pthread.h>
2458                         __thread int i;
2459                         static int res1, res2;
2461                         void thread_main (void *arg)
2462                         {
2463                                 i = arg;
2464                                 sleep (1);
2465                                 if (arg == 1)
2466                                         res1 = (i == arg);
2467                                 else
2468                                         res2 = (i == arg);
2469                         }
2471                         int main () {
2472                                 pthread_t t1, t2;
2474                                 i = 5;
2476                                 pthread_create (&t1, NULL, thread_main, 1);
2477                                 pthread_create (&t2, NULL, thread_main, 2);
2479                                 pthread_join (t1, NULL);
2480                                 pthread_join (t2, NULL);
2482                                 return !(res1 + res2 == 2);
2483                         }
2484                 ], [
2485                                 AC_MSG_RESULT(yes)
2486                 ], [
2487                                 AC_MSG_RESULT(no)
2488                                 with_tls=pthread
2489                 ])
2490         fi
2492         dnl **************************************
2493         dnl *** Checks for working sigaltstack ***
2494         dnl **************************************
2495         AC_MSG_CHECKING(for working sigaltstack)
2496         if test "x$with_sigaltstack" != "xyes"; then
2497                 AC_MSG_RESULT(disabled)
2498         elif test "x$cross_compiling" = "xyes"; then
2499                 AC_MSG_RESULT(cross compiling, assuming yes)
2500         else
2501                 AC_TRY_RUN([
2502                         #include <stdio.h>
2503                         #include <stdlib.h>
2504                         #include <unistd.h>
2505                         #include <signal.h>
2506                         #include <pthread.h>
2507                         #include <sys/wait.h>
2508                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2509                         #define SA_STACK SA_ONSTACK
2510                         #endif
2511                         static void
2512                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2513                         {
2514                                 exit (0);
2515                         }
2517                         volatile char*__ptr = NULL;
2518                         static void *
2519                         loop (void *ignored)
2520                         {
2521                                 *__ptr = 0;
2522                                 return NULL;
2523                         }
2525                         static void
2526                         child ()
2527                         {
2528                                 struct sigaction sa;
2529                                 stack_t sas;
2530                                 pthread_t id;
2531                                 pthread_attr_t attr;
2533                                 sa.sa_sigaction = sigsegv_signal_handler;
2534                                 sigemptyset (&sa.sa_mask);
2535                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2536                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2537                                         perror ("sigaction");
2538                                         return;
2539                                 }
2541                                 /* x86 darwin deliver segfaults using SIGBUS */
2542                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2543                                         perror ("sigaction");
2544                                         return;
2545                                 }
2546                                 sas.ss_sp = malloc (SIGSTKSZ);
2547                                 sas.ss_size = SIGSTKSZ;
2548                                 sas.ss_flags = 0;
2549                                 if (sigaltstack (&sas, NULL) == -1) {
2550                                         perror ("sigaltstack");
2551                                         return;
2552                                 }
2554                                 pthread_attr_init (&attr);
2555                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2556                                         printf ("pthread_create\n");
2557                                         return;
2558                                 }
2560                                 sleep (100);
2561                         }
2563                         int
2564                         main ()
2565                         {
2566                                 pid_t son;
2567                                 int status;
2568                                 int i;
2570                                 son = fork ();
2571                                 if (son == -1) {
2572                                         return 1;
2573                                 }
2575                                 if (son == 0) {
2576                                         child ();
2577                                         return 0;
2578                                 }
2580                                 for (i = 0; i < 300; ++i) {
2581                                         waitpid (son, &status, WNOHANG);
2582                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2583                                                 return 0;
2584                                         usleep (10000);
2585                                 }
2587                                 kill (son, SIGKILL);
2588                                 return 1;
2589                         }
2591                 ], [
2592                                 AC_MSG_RESULT(yes)
2593                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2594                 ], [
2595                                 with_sigaltstack=no
2596                                 AC_MSG_RESULT(no)
2597                 ])
2598         fi
2600         dnl ********************************
2601         dnl *** Checks for semaphore lib ***
2602         dnl ********************************
2603         # 'Real Time' functions on Solaris
2604         # posix4 on Solaris 2.6
2605         # pthread (first!) on Linux
2606         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2608         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2609         AC_CHECK_FUNCS(shm_open)
2611         dnl ********************************
2612         dnl *** Checks for timezone stuff **
2613         dnl ********************************
2614         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2615                 AC_TRY_COMPILE([
2616                         #include <time.h>
2617                         ], [
2618                         struct tm tm;
2619                         tm.tm_gmtoff = 1;
2620                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2621         if test $ac_cv_struct_tm_gmtoff = yes; then
2622                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2623         else
2624                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2625                         AC_TRY_COMPILE([
2626                                 #include <time.h>
2627                         ], [
2628                                 timezone = 1;
2629                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2630                 if test $ac_cv_var_timezone = yes; then
2631                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2632                 else
2633                         AC_ERROR(unable to find a way to determine timezone)
2634                 fi
2635         fi
2637         dnl *********************************
2638         dnl *** Checks for math functions ***
2639         dnl *********************************
2640         AC_SEARCH_LIBS(sqrtf, m)
2642         dnl ****************************************************************
2643         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2644         dnl *** have it in the library (duh))                            ***
2645         dnl ****************************************************************
2646         AC_CHECK_FUNCS(poll)
2648         dnl **********************************
2649         dnl *** epoll                      ***
2650         dnl **********************************
2651         AC_CHECK_HEADERS(sys/epoll.h)
2652         haveepoll=no
2653         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2654         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2655                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2656         fi
2658         havekqueue=no
2660         AC_CHECK_HEADERS(sys/event.h)
2661         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2663         dnl **************************************
2664         dnl * Darwin has a race that prevents us from using reliably:
2665         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2666         dnl * Since kqueue is mostly used for scaling large web servers, 
2667         dnl * and very few folks run Mono on large web servers on OSX, falling
2668         dnl * back 
2669         dnl **************************************
2670         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2671                 if test "x$host_darwin" = "xno"; then
2672                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2673                 fi
2674         fi
2676         dnl ******************************
2677         dnl *** Checks for SIOCGIFCONF ***
2678         dnl ******************************
2679         AC_CHECK_HEADERS(sys/ioctl.h)
2680         AC_CHECK_HEADERS(net/if.h, [], [],
2681            [
2682            #ifdef HAVE_SYS_TYPES_H
2683            # include <sys/types.h>
2684            #endif
2685            #ifdef HAVE_SYS_SOCKET_H
2686            # include <sys/socket.h>
2687            #endif
2688            ])
2689         AC_MSG_CHECKING(for ifreq)
2690         AC_TRY_COMPILE([
2691                 #include <stdio.h>
2692                 #include <sys/ioctl.h>
2693                 #include <net/if.h>
2694                 ], [
2695                 struct ifconf ifc;
2696                 struct ifreq *ifr;
2697                 void *x;
2698                 ifc.ifc_len = 0;
2699                 ifc.ifc_buf = NULL;
2700                 x = (void *) &ifr->ifr_addr;
2701                 ],[
2702                         AC_MSG_RESULT(yes)
2703                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2704                 ], [
2705                         AC_MSG_RESULT(no)
2706                 ])
2707         dnl **********************************
2708         dnl ***     Checks for sin_len     ***
2709         dnl **********************************
2710         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2711         AC_TRY_COMPILE([
2712                 #include <netinet/in.h>
2713                 ], [
2714                 struct sockaddr_in saddr;
2715                 saddr.sin_len = sizeof (saddr);
2716                 ],[
2717                         AC_MSG_RESULT(yes)
2718                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2719                 ], [
2720                         AC_MSG_RESULT(no)
2721                 ])      
2722         dnl **********************************
2723         dnl ***    Checks for sin6_len     ***
2724         dnl **********************************
2725         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2726         AC_TRY_COMPILE([
2727                 #include <netinet/in.h>
2728                 ], [
2729                 struct sockaddr_in6 saddr6;
2730                 saddr6.sin6_len = sizeof (saddr6);
2731                 ],[
2732                         AC_MSG_RESULT(yes)
2733                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2734                 ], [
2735                         AC_MSG_RESULT(no)
2736                 ])
2737         dnl **********************************
2738         dnl *** Check for getifaddrs       ***
2739         dnl **********************************
2740         AC_MSG_CHECKING(for getifaddrs)
2741                 AC_TRY_LINK([
2742                 #include <stdio.h>
2743                 #include <sys/types.h>
2744                 #include <sys/socket.h>
2745                 #include <ifaddrs.h>
2746         ], [
2747                 getifaddrs(NULL);
2748         ], [
2749                 # Yes, we have it...
2750                 AC_MSG_RESULT(yes)
2751                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2752         ], [
2753                 AC_MSG_RESULT(no)
2754         ])
2755         dnl **********************************
2756         dnl *** Check for if_nametoindex   ***
2757         dnl **********************************
2758         AC_MSG_CHECKING(for if_nametoindex)
2759                 AC_TRY_LINK([
2760                 #include <stdio.h>
2761                 #include <sys/types.h>
2762                 #include <sys/socket.h>
2763                 #include <net/if.h>
2764         ], [
2765                 if_nametoindex(NULL);
2766         ], [
2767                 # Yes, we have it...
2768                 AC_MSG_RESULT(yes)
2769                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2770         ], [
2771                 AC_MSG_RESULT(no)
2772         ])
2773         dnl **********************************
2774         dnl *** Check for access ***
2775         dnl **********************************
2776         AC_MSG_CHECKING(for access)
2777                 AC_TRY_LINK([
2778                 #include <unistd.h>
2779         ], [
2780                 access(NULL,0);
2781         ], [
2782                 # Yes, we have it...
2783                 AC_MSG_RESULT(yes)
2784                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2785         ], [
2786                 AC_MSG_RESULT(no)
2787         ])
2788                         
2789         dnl **********************************
2790         dnl *** Checks for proclib         ***
2791         dnl **********************************
2792         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.)])
2793         dnl **********************************
2794         dnl *** Checks for MonoPosixHelper ***
2795         dnl **********************************
2796         AC_CHECK_HEADERS(checklist.h)
2797         AC_CHECK_HEADERS(pathconf.h)
2798         AC_CHECK_HEADERS(fstab.h)
2799         AC_CHECK_HEADERS(attr/xattr.h)
2800         AC_CHECK_HEADERS(sys/extattr.h)
2801         AC_CHECK_HEADERS(sys/sendfile.h)
2802         AC_CHECK_HEADERS(sys/statvfs.h)
2803         AC_CHECK_HEADERS(sys/statfs.h)
2804         AC_CHECK_HEADERS(sys/vfstab.h)
2805         AC_CHECK_HEADERS(sys/xattr.h)
2806         AC_CHECK_HEADERS(sys/mman.h)
2807         AC_CHECK_HEADERS(sys/param.h)
2808         AC_CHECK_HEADERS(sys/mount.h, [], [],
2809                 [
2810                 #ifdef HAVE_SYS_PARAM_H
2811                 # include <sys/param.h>
2812                 #endif
2813                 ])
2814         AC_CHECK_HEADERS(sys/mount.h)
2815         AC_CHECK_FUNCS(confstr)
2816         AC_CHECK_FUNCS(seekdir telldir)
2817         AC_CHECK_FUNCS(getdomainname)
2818         AC_CHECK_FUNCS(setdomainname)
2819         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2820         AC_CHECK_FUNCS(setgroups)
2821         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2822         AC_CHECK_FUNCS(getfsstat)
2823         AC_CHECK_FUNCS(lutimes futimes)
2824         AC_CHECK_FUNCS(mremap)
2825         AC_CHECK_FUNCS(remap_file_pages)
2826         AC_CHECK_FUNCS(posix_fadvise)
2827         AC_CHECK_FUNCS(posix_fallocate)
2828         AC_CHECK_FUNCS(posix_madvise)
2829         AC_CHECK_FUNCS(vsnprintf)
2830         AC_CHECK_FUNCS(sendfile)
2831         AC_CHECK_FUNCS(gethostid sethostid)
2832         AC_CHECK_FUNCS(sethostname)
2833         AC_CHECK_FUNCS(statfs)
2834         AC_CHECK_FUNCS(fstatfs)
2835         AC_CHECK_FUNCS(statvfs)
2836         AC_CHECK_FUNCS(fstatvfs)
2837         AC_CHECK_FUNCS(stime)
2838         AC_CHECK_FUNCS(ttyname_r)
2839         AC_CHECK_FUNCS(psignal)
2840         AC_CHECK_FUNCS(getlogin_r)
2841         AC_CHECK_FUNCS(lockf)
2842         AC_CHECK_FUNCS(swab)
2843         AC_CHECK_FUNCS(setusershell endusershell)
2844         AC_CHECK_FUNCS(futimens utimensat)
2845         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2846         AC_CHECK_FUNCS(readv writev preadv pwritev)
2847         AC_CHECK_FUNCS(setpgid)
2848         AC_CHECK_FUNCS(system)
2849         AC_CHECK_FUNCS(fork execv execve)
2850         AC_CHECK_FUNCS(accept4)
2851         AC_CHECK_FUNCS(localtime_r)
2852         AC_CHECK_FUNCS(mkdtemp)
2853         AC_CHECK_SIZEOF(size_t)
2854         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2855                 [#include <sys/types.h>
2856                  #include <sys/stat.h>
2857                  #include <unistd.h>])
2858         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2859                 [#include <sys/types.h>
2860                  #include <sys/stat.h>
2861                  #include <unistd.h>])
2862         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2863                 [#include <sys/time.h>])
2864         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2865                 [#include <sys/socket.h>])
2866         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2867                 [#include <unistd.h>
2868                  #include <fcntl.h>])
2869         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2870                 [#include <sys/uio.h>])
2871         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2872                 [#include <sys/socket.h>])
2873         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2874                 [#include <sys/poll.h>])
2875         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2876                 [#include <sys/socket.h>])
2877         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2878                 [#include <sys/socket.h>])
2879         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2880                 [#include <netinet/in.h>])
2881         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2882                 [#include <netinet/in.h>])
2883         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2884                 [#include <sys/un.h>])
2885         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2886                 [#include <sys/types.h>
2887                  #include <sys/stat.h>
2888                  #include <unistd.h>])
2889         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2890                 [#include <time.h>])
2891         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2892                 [#include <sys/time.h>
2893                  #include <sys/types.h>
2894                  #include <utime.h>])
2895         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2896                 [#include <sys/time.h>])
2897         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2898                 [#include <sys/types.h>
2899                  #include <utime.h>])
2900         AC_CHECK_MEMBERS(
2901                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2902                 [#include <sys/types.h>
2903                  #include <dirent.h>])
2904         AC_CHECK_MEMBERS(
2905                 [struct passwd.pw_gecos],,, 
2906                 [#include <sys/types.h>
2907                  #include <pwd.h>])
2908         AC_CHECK_MEMBERS(
2909                 [struct statfs.f_flags],,, 
2910                 [#include <sys/types.h>
2911                  #include <sys/vfs.h>])
2912         AC_CHECK_MEMBERS(
2913                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2914                 [#include <sys/types.h>
2915                  #include <sys/stat.h>
2916                  #include <unistd.h>])
2918         dnl Favour xattr through glibc, but use libattr if we have to
2919         AC_CHECK_FUNC(lsetxattr, ,
2920                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2921         )
2922         AC_SUBST(XATTR_LIB)
2924         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2925         AC_CHECK_MEMBERS(
2926                 [struct kinfo_proc.kp_proc],,, 
2927                 [#include <sys/types.h>
2928                  #include <sys/param.h>
2929                  #include <sys/sysctl.h>
2930                  #include <sys/proc.h>
2931                  ])
2933         dnl *********************************
2934         dnl *** Checks for Windows compilation ***
2935         dnl *********************************
2936         AC_CHECK_HEADERS(sys/time.h)
2937         AC_CHECK_HEADERS(sys/param.h)
2938         AC_CHECK_HEADERS(dirent.h)
2940         dnl ******************************************
2941         dnl *** Checks for OSX and iOS compilation ***
2942         dnl ******************************************
2943         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2945         dnl *********************************
2946         dnl *** Check for Console 2.0 I/O ***
2947         dnl *********************************
2948         AC_CHECK_HEADERS([curses.h])
2949         AC_CHECK_HEADERS([term.h], [], [],
2950         [#if HAVE_CURSES_H
2951          #include <curses.h>
2952          #endif
2953         ])
2954         AC_CHECK_HEADERS([termios.h])
2956         dnl *********************************
2957         dnl *** Checks for random         ***
2958         dnl *********************************
2959         if test x$host_darwin = xno; then
2960                 AC_CHECK_HEADERS(sys/random.h)
2961                 AC_CHECK_FUNCS(getrandom getentropy)
2962         fi
2964         dnl *********************************
2965         dnl *** Checks for System.Native  ***
2966         dnl *********************************
2968         AC_MSG_CHECKING(for linux/in.h)
2969         AC_TRY_COMPILE([
2970                 #include <sys/socket.h>
2971                 #include <linux/in.h>
2972         ], [
2973         ],[
2974                 AC_MSG_RESULT(yes)
2975                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
2976         ], [
2977                 AC_MSG_RESULT(no)
2978         ])
2980         AC_MSG_CHECKING(for struct in_pktinfo)
2981         AC_TRY_COMPILE([
2982                 #ifdef HAVE_LINUX_IN_H
2983                 #include <sys/socket.h>
2984                 #include <linux/in.h>
2985                 #else
2986                 #include <netinet/in.h>
2987                 #endif
2988         ], [
2989                 struct in_pktinfo pktinfo;
2990         ],[
2991                 AC_MSG_RESULT(yes)
2992                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
2993         ], [
2994                 AC_MSG_RESULT(no)
2995         ])
2997         AC_MSG_CHECKING(for struct ip_mreqn)
2998         AC_TRY_COMPILE([
2999                 #if HAVE_LINUX_IN_H
3000                 #include <sys/socket.h>
3001                 #include <linux/in.h>
3002                 #else
3003                 #include <netinet/in.h>
3004                 #endif
3005         ], [
3006                 struct ip_mreqn mreqn;
3007         ],[
3008                 AC_MSG_RESULT(yes)
3009                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3010         ], [
3011                 AC_MSG_RESULT(no)
3012         ])
3014         if test x$host_darwin = xno; then
3015                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3016         fi
3018         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3019         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3020         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3021         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3022         AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3023         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3024         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3025         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3026         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3027         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3028         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3029         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3030         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3031         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3032         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3033         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3034         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3035         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3036         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3037         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3039         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3040         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3042         AC_CHECK_MEMBER(struct stat.st_birthtimespec, [AC_DEFINE(HAVE_STAT_BIRTHTIME, 1, [struct stat.st_birthtime])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3043         AC_CHECK_MEMBER(struct stat.st_atimespec,     [AC_DEFINE(HAVE_STAT_TIMESPEC, 1, [struct stat.st_atimespec])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3044         AC_CHECK_MEMBER(struct stat.st_atim,          [AC_DEFINE(HAVE_STAT_TIM, 1, [struct stat.st_atim])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3045         AC_CHECK_MEMBER(struct stat.st_atimensec,     [AC_DEFINE(HAVE_STAT_NSEC, 1, [struct stat.st_atimensec])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3046         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3047         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3048         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3050         AC_MSG_CHECKING(for struct statfs)
3051         AC_TRY_COMPILE([
3052                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3053                 #include <sys/mount.h>
3054                 #else
3055                 #include <sys/statfs.h>
3056                 #endif
3057         ], [
3058                 struct statfs;
3059         ],[
3060                 AC_MSG_RESULT(yes)
3061                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3062         ], [
3063                 AC_MSG_RESULT(no)
3064         ])
3066         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3067                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3068         fi
3070         AC_MSG_CHECKING(for readdir_r)
3071         AC_TRY_COMPILE([
3072                 #include <dirent.h>
3073         ], [
3074                 DIR* dir;
3075                 struct dirent* entry;
3076                 struct dirent* result;
3077                 readdir_r(dir, entry, &result);
3078         ],[
3079                 AC_MSG_RESULT(yes)
3080                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3081         ], [
3082                 AC_MSG_RESULT(no)
3083         ])
3085         AC_MSG_CHECKING(for kevent with void *data)
3086         AC_TRY_COMPILE([
3087                 #include <sys/types.h>
3088                 #include <sys/event.h>
3089         ], [
3090                 struct kevent event;
3091                 void* data;
3092                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3093         ],[
3094                 AC_MSG_RESULT(yes)
3095                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3096         ], [
3097                 AC_MSG_RESULT(no)
3098         ])
3100         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3101         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3103         AC_MSG_CHECKING(for sendfile with 4 arguments)
3104         AC_TRY_COMPILE([
3105                 #include <sys/sendfile.h>
3106         ], [
3107                 int result = sendfile(0, 0, 0, 0);
3108         ],[
3109                 AC_MSG_RESULT(yes)
3110                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3111         ], [
3112                 AC_MSG_RESULT(no)
3113         ])
3115         AC_MSG_CHECKING(for sendfile with 6 arguments)
3116         AC_TRY_LINK([
3117                 #include <stdlib.h>
3118                 #include <sys/types.h>
3119                 #include <sys/socket.h>
3120                 #include <sys/uio.h>
3121         ], [
3122                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3123         ],[
3124                 AC_MSG_RESULT(yes)
3125                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3126         ], [
3127                 AC_MSG_RESULT(no)
3128         ])
3130         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3131         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3132         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3133         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3135         ORIG_CFLAGS="$CFLAGS"
3136         CFLAGS="-Werror -Wsign-conversion"
3138         AC_MSG_CHECKING(for getnameinfo with signed flags)
3139         AC_TRY_COMPILE([
3140                 #include <sys/types.h>
3141                 #include <netdb.h>
3142         ], [
3143                 const struct sockaddr *addr;
3144                 socklen_t addrlen;
3145                 char *host;
3146                 socklen_t hostlen;
3147                 char *serv;
3148                 socklen_t servlen;
3149                 int flags;
3150                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3151         ],[
3152                 AC_MSG_RESULT(yes)
3153                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3154         ], [
3155                 AC_MSG_RESULT(no)
3156         ])
3158         CFLAGS="$ORIG_CFLAGS"
3160         if test "x$host_linux" = "xyes"; then
3161                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3162         else
3163                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3164         fi
3166         ORIG_CFLAGS="$CFLAGS"
3167         CFLAGS="-Werror -Wsign-conversion"
3169         AC_MSG_CHECKING(for bind with unsigned addrlen)
3170         AC_TRY_COMPILE([
3171                 #include <sys/socket.h>
3172         ], [
3173                 int fd;
3174                 struct sockaddr* addr;
3175                 socklen_t addrLen;
3176                 bind(fd, addr, addrLen);
3177         ],[
3178                 AC_MSG_RESULT(yes)
3179                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3180         ], [
3181                 AC_MSG_RESULT(no)
3182         ])
3184         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3185         AC_TRY_COMPILE([
3186                 #include <netinet/in.h>
3187                 #include <netinet/tcp.h>
3188         ], [
3189                 struct ipv6_mreq opt;
3190                 unsigned int index = 0;
3191                 opt.ipv6mr_interface = index;
3192         ],[
3193                 AC_MSG_RESULT(yes)
3194                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3195         ], [
3196                 AC_MSG_RESULT(no)
3197         ])
3199         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3200         AC_TRY_COMPILE([
3201                 #include <sys/inotify.h>
3202         ], [
3203                 intptr_t fd;
3204                 uint32_t wd;
3205                 int result = inotify_rm_watch(fd, wd);
3206         ],[
3207                 AC_MSG_RESULT(yes)
3208                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3209         ], [
3210                 AC_MSG_RESULT(no)
3211         ])
3213         CFLAGS="$ORIG_CFLAGS"
3215         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3216         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3217                 AC_MSG_RESULT(no)
3218         else
3219                 AC_TRY_RUN([
3220                         #include <sys/mman.h>
3221                         #include <fcntl.h>
3222                         #include <unistd.h>
3224                         int main ()
3225                         {
3226                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3227                                 if (fd == -1)
3228                                         return -1;
3230                                 shm_unlink("/mono_configure_shm_open");
3232                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3233                                 //       on at least the current version of Mac OS X
3235                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3236                                         return -1;
3238                                 return 0;
3239                         }
3240                 ],[
3241                         AC_MSG_RESULT(yes)
3242                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3243                 ], [
3244                         AC_MSG_RESULT(no)
3245                 ])
3246         fi
3248         AC_MSG_CHECKING(for getpriority with int who)
3249         AC_TRY_COMPILE([
3250                 #include <sys/resource.h>
3251         ], [
3252                 int which;
3253                 int who;
3254                 int result = getpriority(which, who);
3255         ],[
3256                 AC_MSG_RESULT(yes)
3257                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3258         ], [
3259                 AC_MSG_RESULT(no)
3260         ])
3262         AC_MSG_CHECKING(for kevent with int parameters)
3263         AC_TRY_COMPILE([
3264                 #include <sys/types.h>
3265                 #include <sys/event.h>
3266         ], [
3267                 int kg;
3268                 const struct kevent* chagelist;
3269                 int nchanges;
3270                 struct kevent* eventlist;
3271                 int nevents;
3272                 const struct timespec* timeout;
3273                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3274         ],[
3275                 AC_MSG_RESULT(yes)
3276                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3277         ], [
3278                 AC_MSG_RESULT(no)
3279         ])
3281         ORIG_CFLAGS="$CFLAGS"
3282         CFLAGS="-Werror -Wimplicit-function-declaration"
3284         AC_MSG_CHECKING(for mkstemps)
3285         AC_TRY_COMPILE([
3286                 #include <stdlib.h>
3287                 #include <unistd.h>
3288                 #include <string.h>
3289         ], [
3290                 char *template;
3291                 int suffixlen;
3292                 int result = mkstemps(template, suffixlen);
3293         ],[
3294                 AC_MSG_RESULT(yes)
3295                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3296                 have_mkstemps=yes
3297         ], [
3298                 AC_MSG_RESULT(no)
3299         ])
3301         CFLAGS="$ORIG_CFLAGS"
3303         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3304                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3305         fi
3307         AC_MSG_CHECKING(for tcp/var.h)
3308         AC_TRY_COMPILE([
3309                 #include <sys/types.h>
3310                 #include <sys/socketvar.h>
3311                 #include <netinet/ip.h>
3312                 #include <netinet/tcp.h>
3313                 #include <netinet/tcp_var.h>
3314         ], [
3315         ],[
3316                 AC_MSG_RESULT(yes)
3317                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3318         ], [
3319                 AC_MSG_RESULT(no)
3320         ])
3322         AC_CHECK_HEADERS([sys/cdefs.h])
3324         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3325         AC_TRY_COMPILE([
3326                 #ifdef HAVE_SYS_CDEFS_H
3327                 #include <sys/cdefs.h>
3328                 #endif
3329                 #include <netinet/tcp.h>
3330         ], [
3331                 int result = TCP_ESTABLISHED;
3332         ],[
3333                 AC_MSG_RESULT(yes)
3334                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3335         ], [
3336                 AC_MSG_RESULT(no)
3337         ])
3339         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3341         AC_MSG_CHECKING(for struct rt_msghdr)
3342         AC_TRY_COMPILE([
3343                 #include <sys/types.h>
3344                 #include <net/route.h>
3345         ], [
3346                 struct rt_msghdr;
3347         ],[
3348                 AC_MSG_RESULT(yes)
3349                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3350         ], [
3351                 AC_MSG_RESULT(no)
3352         ])
3354         AC_CHECK_HEADERS([sys/sysctl.h])
3355         AC_CHECK_HEADERS([linux/rtnetlink.h])
3357         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3358         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3359         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3361         ORIG_CFLAGS="$CFLAGS"
3362         CFLAGS="-Werror -Weverything"
3364         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3365         AC_TRY_COMPILE([
3366                 #include <unistd.h>
3367         ], [
3368                 size_t namelen = 20;
3369                 char name[20];
3370                 int result = getdomainname(name, namelen);
3371         ],[
3372                 AC_MSG_RESULT(yes)
3373                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3374         ], [
3375                 AC_MSG_RESULT(no)
3376         ])
3378         CFLAGS="$ORIG_CFLAGS"
3380         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3381         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3382         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3384         if test "x$ac_cv_func_inotify_init" = "xyes" -a "x$ac_cv_func_inotify_add_watch" = "xyes" -a "x$ac_cv_func_inotify_rm_watch" = "xyes"; then
3385                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3386         elif test "x$host_linux" = "xyes"; then
3387                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3388         fi
3390         AC_CHECK_HEADERS([crt_externs.h])
3392         AC_MSG_CHECKING(for _NSGetEnviron)
3393         AC_TRY_COMPILE([
3394                 #include <crt_externs.h>
3395         ], [
3396                 char **result = *(_NSGetEnviron());
3397         ],[
3398                 AC_MSG_RESULT(yes)
3399                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3400         ], [
3401                 AC_MSG_RESULT(no)
3402         ])
3404         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3406 else
3407         dnl *********************************
3408         dnl *** Checks for Windows compilation ***
3409         dnl *********************************
3410         AC_CHECK_HEADERS(winternl.h)
3412         jdk_headers_found=no
3413         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3414         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3415         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3416         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3417         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3418         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3419         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3421         dnl *********************************
3422         dnl *** Check for struct ip_mreqn ***
3423         dnl *********************************
3424         AC_MSG_CHECKING(for struct ip_mreqn)
3425         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3426                 struct ip_mreqn mreq;
3427                 mreq.imr_address.s_addr = 0;
3428         ], [
3429                 # Yes, we have it...
3430                 AC_MSG_RESULT(yes)
3431                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3432         ], [
3433                 # We'll just have to try and use struct ip_mreq
3434                 AC_MSG_RESULT(no)
3435                 AC_MSG_CHECKING(for struct ip_mreq)
3436                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3437                         struct ip_mreq mreq;
3438                         mreq.imr_interface.s_addr = 0;
3439                 ], [
3440                         # Yes, we have it...
3441                         AC_MSG_RESULT(yes)
3442                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3443                 ], [
3444                         # No multicast support
3445                         AC_MSG_RESULT(no)
3446                 ])
3447         ])
3449         dnl **********************************
3450         dnl *** Check for getaddrinfo ***
3451         dnl **********************************
3452         AC_MSG_CHECKING(for getaddrinfo)
3453                 AC_TRY_LINK([
3454                 #include <stdio.h>
3455                 #include <winsock2.h>
3456                 #include <ws2tcpip.h>
3457         ], [
3458                 getaddrinfo(NULL,NULL,NULL,NULL);
3459         ], [
3460                 # Yes, we have it...
3461                 AC_MSG_RESULT(yes)
3462                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3463         ], [
3464                 AC_MSG_RESULT(no)
3465         ])
3467         dnl **********************************
3468         dnl *** Check for gethostbyname ***
3469         dnl **********************************
3470         AC_MSG_CHECKING(for gethostbyname)
3471                 AC_TRY_LINK([
3472                 #include <stdio.h>
3473                 #include <winsock2.h>
3474                 #include <ws2tcpip.h>
3475         ], [
3476                 gethostbyname(NULL);
3477         ], [
3478                 # Yes, we have it...
3479                 AC_MSG_RESULT(yes)
3480                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3481         ], [
3482                 AC_MSG_RESULT(no)
3483         ])
3485         dnl **********************************
3486         dnl *** Check for getprotobyname ***
3487         dnl **********************************
3488         AC_MSG_CHECKING(for getprotobyname)
3489                 AC_TRY_LINK([
3490                 #include <stdio.h>
3491                 #include <winsock2.h>
3492                 #include <ws2tcpip.h>
3493         ], [
3494                 getprotobyname(NULL);
3495         ], [
3496                 # Yes, we have it...
3497                 AC_MSG_RESULT(yes)
3498                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3499         ], [
3500                 AC_MSG_RESULT(no)
3501         ])
3503         dnl **********************************
3504         dnl *** Check for getnameinfo ***
3505         dnl **********************************
3506         AC_MSG_CHECKING(for getnameinfo)
3507                 AC_TRY_LINK([
3508                 #include <stdio.h>
3509                 #include <winsock2.h>
3510                 #include <ws2tcpip.h>
3511         ], [
3512                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3513         ], [
3514                 # Yes, we have it...
3515                 AC_MSG_RESULT(yes)
3516                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3517         ], [
3518                 AC_MSG_RESULT(no)
3519         ])
3521         dnl **********************************
3522         dnl *** Check for inet_ntop ***
3523         dnl **********************************
3524         AC_MSG_CHECKING(for inet_ntop)
3525                 AC_TRY_LINK([
3526                 #include <stdio.h>
3527                 #include <winsock2.h>
3528                 #include <ws2tcpip.h>
3529         ], [
3530                 inet_ntop (0, NULL, NULL, 0);
3531         ], [
3532                 # Yes, we have it...
3533                 AC_MSG_RESULT(yes)
3534                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3535         ], [
3536                 AC_MSG_RESULT(no)
3537         ])
3539         dnl **********************************
3540         dnl *** Check for inet_pton ***
3541         dnl **********************************
3542         AC_MSG_CHECKING(for inet_pton)
3543                 AC_TRY_LINK([
3544                 #include <stdio.h>
3545                 #include <winsock2.h>
3546                 #include <ws2tcpip.h>
3547         ], [
3548                 #ifndef inet_pton
3549                 (void) inet_pton;
3550                 #endif
3551                 inet_pton (0, NULL, NULL);
3552         ], [
3553                 # Yes, we have it...
3554                 AC_MSG_RESULT(yes)
3555                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3556         ], [
3557                 AC_MSG_RESULT(no)
3558         ])
3560         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3561         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3562         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3563         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3564         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3565         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3566         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3569 dnl socklen_t check
3570 AC_MSG_CHECKING(for socklen_t)
3571 AC_TRY_COMPILE([
3572 #include <sys/types.h>
3573 #include <sys/socket.h>
3575   socklen_t foo;
3577 ac_cv_c_socklen_t=yes
3578         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3579         AC_MSG_RESULT(yes)
3581         AC_MSG_RESULT(no)
3584 AC_MSG_CHECKING(for array element initializer support)
3585 AC_TRY_COMPILE([#include <sys/socket.h>], [
3586         const int array[] = {[1] = 2,};
3587 ], [
3588         # Yes, we have it...
3589         AC_MSG_RESULT(yes)
3590         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
3591 ], [
3592         # We'll have to use signals
3593         AC_MSG_RESULT(no)
3596 AC_CHECK_FUNCS(execvp)
3598 dnl ****************************
3599 dnl *** Look for /dev/random ***
3600 dnl ****************************
3602 AC_MSG_CHECKING([if usage of random device is requested])
3603 AC_ARG_ENABLE(dev-random,
3604 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3605 try_dev_random=$enableval, try_dev_random=yes)
3607 AC_MSG_RESULT($try_dev_random)
3609 case "{$build}" in
3611 dnl IBM i does not have /dev/random, use unblocking only
3613     *-*-os400*)
3614     NAME_DEV_RANDOM="/dev/urandom"
3615     ;;
3617 dnl Win32 does not have /dev/random, they have their own method...
3619     *-mingw*|*-*-cygwin*)
3620     ac_cv_have_dev_random=no
3621     ;;
3623 dnl Everywhere else, it's /dev/random
3625     *)
3626     NAME_DEV_RANDOM="/dev/random"
3627     ;;
3628 esac
3630 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3632 dnl Now check if the device actually exists
3634 if test "x$try_dev_random" = "xyes"; then
3635     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3636     [if test -r "$NAME_DEV_RANDOM" ; then
3637         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3638     if test "x$ac_cv_have_dev_random" = "xyes"; then
3639         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3640     fi
3641 else
3642     AC_MSG_CHECKING(for random device)
3643     ac_cv_have_dev_random=no
3644     AC_MSG_RESULT(has been disabled)
3647 if test "x$host_win32" = "xyes"; then
3648     AC_DEFINE(HAVE_CRYPT_RNG)
3651 if test "x$ac_cv_have_dev_random" = "xno" \
3652     && test "x$host_win32" = "xno"; then
3653     AC_MSG_WARN([[
3655 *** A system-provided entropy source was not found on this system.
3656 *** Because of this, the System.Security.Cryptography random number generator
3657 *** will throw a NotImplemented exception.
3659 *** If you are seeing this message, and you know your system DOES have an
3660 *** entropy collection in place, please report an issue on GitHub and
3661 *** provide information about the system and how to access the random device.
3663 *** Otherwise you can install either egd or prngd and set the environment
3664 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3665 ***]])
3668 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)
3670 AC_MSG_CHECKING([if big-arrays are to be enabled])
3671 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)
3672 if test "x$enable_big_arrays" = "xyes" ; then
3673     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3674         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3675     else
3676         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3677     fi
3679 AC_MSG_RESULT($enable_big_arrays)
3681 dnl **************
3682 dnl *** DTRACE ***
3683 dnl **************
3685 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3687 if test "x$enable_dtrace" = "xyes"; then
3688    if test "x$has_dtrace" = "xno"; then
3689           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3690    fi
3691    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3692    if test "x$DTRACE" = "xno"; then
3693           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3694           enable_dtrace=no
3695    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3696           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3697           enable_dtrace=no
3698    fi
3701 dtrace_g=no
3702 if test "x$enable_dtrace" = "xyes"; then
3703         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3704         DTRACEFLAGS=
3705         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3706                 case "$host" in
3707                         powerpc-*-darwin*)
3708                         DTRACEFLAGS="-arch ppc64"
3709                         ;;
3710                         i*86-*-darwin*)
3711                         DTRACEFLAGS="-arch x86_64"
3712                         ;;
3713                         *)
3714                         DTRACEFLAGS=-64
3715                         ;;
3716                 esac
3717         else
3718                 case "$host" in
3719                         powerpc-*-darwin*)
3720                         DTRACEFLAGS="-arch ppc"
3721                         ;;
3722                         i*86-*-darwin*)
3723                         DTRACEFLAGS="-arch i386"
3724                         ;;
3725                         *)
3726                         DTRACEFLAGS=-32
3727                         ;;
3728                 esac
3729         fi
3730         AC_SUBST(DTRACEFLAGS)
3731         case "$host" in
3732                 *-*-solaris*)
3733                 dtrace_g=yes
3734                 ;;
3735         esac
3736         AC_CHECK_HEADERS([sys/sdt.h])
3738 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3739 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3741 dnl **************************
3742 dnl *** AOT cross offsets  ***
3743 dnl **************************
3745 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3746     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3748 dnl **************
3749 dnl ***  LLVM  ***
3750 dnl **************
3752 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3753 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3754 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)
3755 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3756 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3758 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3760 if test "x$enable_llvm" = "xdefault"; then
3761    enable_llvm=$enable_llvm_default
3764 internal_llvm="no"
3765 if test "x$enable_llvm" = "xyes"; then
3766         if test "x$with_llvm" != "x"; then
3767                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3768                 if test x$host_win32 = xyes; then
3769                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3770                 fi
3771                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3772                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3773                 fi
3774         else
3775                 if test x$host_win32 = xyes; then
3776                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3777                 else
3778                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3779                 fi
3780                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3781                         internal_llvm=yes
3782                 fi
3783         fi
3785         LLVM_CODEGEN_LIBS="x86codegen"
3786         case "$target" in
3787         arm*)
3788                 LLVM_CODEGEN_LIBS="armcodegen"
3789                 ;;
3790         aarch64*)
3791                 LLVM_CODEGEN_LIBS="aarch64codegen"
3792                 ;;
3793         powerpc*)
3794                 LLVM_CODEGEN_LIBS="powerpccodegen"
3795                 ;;
3796         esac
3797         if test "x$host" != "x$target"; then
3798                 # No need for jit libs
3799                 LLVM_CODEGEN_LIBS=
3800         fi
3802         AC_SUBST(LLVM_CODEGEN_LIBS)
3803         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3804         
3805         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3806 fi # ENABLE_LLVM
3808 # AC_DEFINE necessary for correct restore behavior on Linux
3809 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3810 if test "x$internal_llvm" != "xno"; then
3811    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3814 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3815 if test "x$enable_llvm_asserts" != "xno"; then
3816    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3819 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3821 if test "x$enable_loadedllvm" = "xyes"; then
3822    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3824 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3826 if test "x$enable_llvm" = "xyes"; then
3827    enable_llvm_runtime=yes
3829 if test "x$enable_llvm_runtime" = "xyes"; then
3830    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3832 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3834 TARGET="unknown"
3835 ACCESS_UNALIGNED="yes"
3837 LIBC="libc.so.6"
3838 INTL="libc.so.6"
3839 SQLITE="libsqlite.so.0"
3840 SQLITE3="libsqlite3.so.0"
3841 X11="libX11.so"
3842 GDKX11="libgdk-x11-2.0.so.0"
3843 GTKX11="libgtk-x11-2.0.so.0"
3844 XINERAMA="libXinerama.so.1"
3846 sizeof_register="SIZEOF_VOID_P"
3848 jit_wanted=true
3849 boehm_supported=true
3850 BTLS_SUPPORTED=no
3851 BTLS_PLATFORM=
3853 case "$host" in
3854         wasm32*)
3855                 TARGET=WASM
3856                 arch_target=wasm
3857                 BTLS_SUPPORTED=no
3858                 ACCESS_UNALIGNED="no"
3859                 with_tls=pthread
3860                 ;;
3861         mips*)
3862                 TARGET=MIPS;
3863                 arch_target=mips;
3864                 with_tls=pthread;
3865                 ACCESS_UNALIGNED="no"
3867                 AC_MSG_CHECKING(for mips n32)
3868                 AC_TRY_COMPILE([],[
3869                 #if _MIPS_SIM != _ABIN32
3870                 #error Not mips n32
3871                 #endif
3872                 ],[
3873                 AC_MSG_RESULT(yes)
3874                 sizeof_register=8
3875                 ],[
3876                 AC_MSG_RESULT(no)
3877                 ])
3878                 ;;
3879         i*86-*-*)
3880                 TARGET=X86;
3881                 arch_target=x86;
3882                 case $host_os in
3883                   solaris*)
3884                         LIBC="libc.so"
3885                         INTL="libintl.so"
3886                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3887                                 TARGET=AMD64
3888                                 arch_target=amd64
3889                         fi
3891                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3892                         # int astruct __attribute__ ((visibility ("hidden")));
3893                         # void foo ()
3894                         # {
3895                         #       void *p = &astruct;
3896                         # }
3897                         # gcc -fPIC --shared -o libfoo.so foo.c
3898                         # yields:
3899                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3900                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3901                         have_visibility_hidden=no
3902                         ;;
3903                   mingw*|cygwin*)
3904                         have_visibility_hidden=no                 
3905                         ;;
3906                   haiku*)
3907                         LIBC=libroot.so
3908                         ;;
3909                   linux*)
3910                         AOT_SUPPORTED="yes"
3911                         BTLS_SUPPORTED=yes
3912                         BTLS_PLATFORM=i386
3913                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3914                         ;;
3915                   darwin*)
3916                         AOT_SUPPORTED="yes"
3917                         BTLS_SUPPORTED=yes
3918                         BTLS_PLATFORM=i386
3919                         ;;
3920                   openbsd*|freebsd*|kfreebsd-gnu*)
3921                         AOT_SUPPORTED="yes"
3922                         BTLS_SUPPORTED=yes
3923                         BTLS_PLATFORM=i386
3924                         ;;
3925                 esac
3926                 ;;
3927         x86_64-*-* | amd64-*-*)
3928                 TARGET=AMD64;
3929                 arch_target=amd64;
3930                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3931                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3932                         sizeof_register=8
3933                 fi
3934                 case $host_os in
3935                   linux*)
3936                         AOT_SUPPORTED="yes"
3937                         BTLS_SUPPORTED=yes
3938                         BTLS_PLATFORM=x86_64
3939                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3940                         ;;
3941                   darwin*)
3942                         AOT_SUPPORTED="yes"
3943                         BTLS_SUPPORTED=yes
3944                         BTLS_PLATFORM=x86_64
3945                         boehm_supported=false
3946                         ;;
3947                   openbsd*|freebsd*|kfreebsd-gnu*)
3948                         AOT_SUPPORTED="yes"
3949                         BTLS_SUPPORTED=yes
3950                         BTLS_PLATFORM=x86_64
3951                         ;;
3952                   mingw*)
3953                         ;;
3954                 esac
3955                 ;;
3956         sparc*-*-*)
3957                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3958                    TARGET=SPARC64
3959                 else
3960                         TARGET=SPARC
3961                 fi
3962                 arch_target=sparc;
3963                 ACCESS_UNALIGNED="no"
3964                 case $host_os in
3965                   linux*) ;;
3966                   *)
3967                         LIBC="libc.so"
3968                         INTL="libintl.so"
3969                 esac
3970                 if test x"$GCC" = xyes; then
3971                         # We don't support v8 cpus
3972                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3973                 fi
3974                 if test x"$AR" = xfalse; then
3975                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3976                 fi
3977                 ;;
3978         *-mingw*|*-*-cygwin*)
3979                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3980                 have_visibility_hidden=no
3981                 INTL="intl"
3982                 ;;
3983         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3984         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3985         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
3986                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3987                         TARGET=POWERPC64;
3988                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3989                         if ! (echo $CC | grep -q -- 'clang'); then
3990                                 CFLAGS="$CFLAGS -mminimal-toc"
3991                         fi
3992                 else
3993                         TARGET=POWERPC;
3994                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3995                 fi
3996                 arch_target=ppc;
3997                 case $host_os in
3998                   aix*|os400*)
3999                         BTLS_SUPPORTED=yes
4000                         BTLS_PLATFORM=powerpc
4001                         dnl on AIX/PASE, shared libraries can be inside archives
4002                         dnl if they are, we specify them by lib.a(lib.so)
4003                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4004                         LIBC="libc.a(shr_64.o)"
4005                         INTL="libintl.a(libintl.so.8)"
4006                         ;;
4007                   linux*)
4008                         BTLS_SUPPORTED=yes
4009                         BTLS_PLATFORM=powerpc
4010                         ;;
4011                 esac
4012                 ;;
4013         armv7k-*-darwin*)
4014                 TARGET=ARM;
4015                 TARGET_SYS=WATCHOS
4016                 arch_target=arm;
4017                 arm_fpu=VFP_HARD
4018                 ACCESS_UNALIGNED="no"
4019                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4020                 ;;
4022         arm*-darwin*)
4023                 TARGET=ARM;
4024                 arch_target=arm;
4025                 ACCESS_UNALIGNED="no"
4026                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4027                 ;;
4028         arm*-linux*)
4029                 TARGET=ARM;
4030                 arch_target=arm;
4031                 ACCESS_UNALIGNED="no"
4032                 AOT_SUPPORTED="yes"
4033                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4034                 BTLS_SUPPORTED=yes
4035                 BTLS_PLATFORM=arm
4036                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4037                 case "$target" in
4038                 arm*-linux*-gnueabi)
4039                         BTLS_PLATFORM=armsoft
4040                         ;;
4041                 esac
4042                 ;;
4043         arm*-netbsd*-eabi*)
4044                 TARGET=ARM;
4045                 arch_target=arm;
4046                 ACCESS_UNALIGNED="no"
4047                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4048                 ;;
4049         aarch64-*)
4050                 # https://lkml.org/lkml/2012/7/15/133
4051                 TARGET=ARM64
4052                 arch_target=arm64
4053                 boehm_supported=false
4054                 AOT_SUPPORTED="yes"
4055                 BTLS_SUPPORTED=yes
4056                 BTLS_PLATFORM=aarch64
4057                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4058                 ;;
4059         s390x-*-linux*)
4060                 TARGET=S390X;
4061                 arch_target=s390x;
4062                 ACCESS_UNALIGNED="yes"
4063                 BTLS_SUPPORTED=yes
4064                 BTLS_PLATFORM=s390x
4065                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4066                 ;;
4067 esac
4069 HOST=$TARGET
4071 if test "x$host" != "x$target"; then
4072    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4073    enable_mcs_build=no
4074    enable_support_build=no
4075    BTLS_SUPPORTED=no
4076    # Can't use tls, since it depends on the runtime detection of tls offsets
4077    # in mono-compiler.h
4078    with_tls=pthread
4079    target_mach=no
4080    case "$target" in
4081    wasm32*)
4082                 TARGET=WASM
4083                 arch_target=wasm
4084                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4085                 ;;
4086    arm*-darwin*)
4087                 TARGET=ARM;
4088                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4089                 case "$target" in
4090                 armv7k-*)
4091                         arm_fpu=VFP_HARD
4092                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4093                         ;;
4094                 esac            
4095                 ;;
4096    powerpc64-ps3-linux-gnu)
4097                 TARGET=POWERPC64
4098                 arch_target=powerpc64
4099                 AC_DEFINE(TARGET_PS3, 1, [...])
4100                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4101                 # uses this define
4102                 AC_DEFINE(__mono_ppc64__, 1, [...])
4103                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
4104                 sizeof_register=8
4105                 target_byte_order=G_BIG_ENDIAN
4106                 ;;
4107    powerpc64-xbox360-linux-gnu)
4108                 TARGET=POWERPC64
4109                 arch_target=powerpc64
4110                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4111                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4112                 # uses this define
4113                 sizeof_register=8
4114                 target_byte_order=G_BIG_ENDIAN
4115                 ;;
4116    arm*-linux-*)
4117                 TARGET=ARM;
4118                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4119                 ;;
4120    arm*-netbsd*-eabi*)
4121                 TARGET=ARM;
4122                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4123                 ;;
4124    i686*-linux-*)
4125                 TARGET=X86;
4126                 ;;
4127    i*86-apple-*)
4128                 TARGET=X86;
4129                 ;;
4130    x86_64*-linux-*)
4131                 TARGET=AMD64;
4132                 ;;
4133    x86_64-ps4-freebsd)
4134                 TARGET=AMD64;
4135                 AC_DEFINE(TARGET_PS4, 1, [...])
4136                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4137                 CPPFLAGS="$CPPFLAGS"
4138                 target_win32=no
4139                 ;;
4140    aarch64*-linux-*)
4141                 TARGET=ARM64;
4142                 ;;
4143         aarch64-*)
4144                 TARGET=ARM64
4145                 ;;
4146         *)
4147                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4148         esac
4150         case "$target" in
4151         *-darwin*)
4152                 target_mach=yes
4153                 ;;
4154         *-linux-android*)
4155                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4156                 ;;
4157         esac
4160 case "$TARGET" in
4161 WASM)
4162         AC_DEFINE(TARGET_WASM, 1, [...])
4163         arch_target=wasm
4164         target_sizeof_void_p=4
4165         ;;
4166 X86)
4167         AC_DEFINE(TARGET_X86, 1, [...])
4168         arch_target=x86
4169         target_sizeof_void_p=4
4170         ;;
4171 AMD64)
4172         AC_DEFINE(TARGET_AMD64, 1, [...])
4173         arch_target=amd64
4174         ;;
4175 ARM)
4176         AC_DEFINE(TARGET_ARM, 1, [...])
4177         arch_target=arm
4178         ACCESS_UNALIGNED="no"
4179         target_sizeof_void_p=4
4180         ;;
4181 ARM64)
4182         AC_DEFINE(TARGET_ARM64, 1, [...])
4183         arch_target=arm64
4184         ;;
4185 POWERPC)
4186         AC_DEFINE(TARGET_POWERPC, 1, [...])
4187         ;;
4188 POWERPC64)
4189         AC_DEFINE(TARGET_POWERPC, 1, [...])
4190         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4191         ;;
4192 S390X)
4193         AC_DEFINE(TARGET_S390X, 1, [...])
4194         ;;
4195 MIPS)
4196         AC_DEFINE(TARGET_MIPS, 1, [...])
4197         ;;
4198 SPARC)
4199         AC_DEFINE(TARGET_SPARC, 1, [...])
4200         ;;
4201 SPARC64)
4202         AC_DEFINE(TARGET_SPARC64, 1, [...])
4203         ;;
4204 esac
4206 case "$HOST" in
4207 WASM)
4208         AC_DEFINE(HOST_WASM, 1, [...])
4209         ;;
4210 X86)
4211         AC_DEFINE(HOST_X86, 1, [...])
4212         ;;
4213 AMD64)
4214         AC_DEFINE(HOST_AMD64, 1, [...])
4215         ;;
4216 ARM)
4217         AC_DEFINE(HOST_ARM, 1, [...])
4218         ;;
4219 ARM64)
4220         AC_DEFINE(HOST_ARM64, 1, [...])
4221         ;;
4222 POWERPC)
4223         AC_DEFINE(HOST_POWERPC, 1, [...])
4224         ;;
4225 POWERPC64)
4226         AC_DEFINE(HOST_POWERPC, 1, [...])
4227         AC_DEFINE(HOST_POWERPC64, 1, [...])
4228         ;;
4229 S390X)
4230         AC_DEFINE(HOST_S390X, 1, [...])
4231         ;;
4232 MIPS)
4233         AC_DEFINE(HOST_MIPS, 1, [...])
4234         ;;
4235 SPARC)
4236         AC_DEFINE(HOST_SPARC, 1, [...])
4237         ;;
4238 SPARC64)
4239         AC_DEFINE(HOST_SPARC64, 1, [...])
4240         ;;
4241 esac
4243 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4244 case "$HOST" in
4245 X86 | AMD64 | ARM | ARM64)
4246         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4247         ;;
4248 esac
4250 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4251 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4253 dnl *************
4254 dnl *** VTUNE ***
4255 dnl *************
4257 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4258 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4260 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4262 if test "x$enable_vtune" = "xyes"; then
4263         if test "x$with_vtune" = "x"; then
4264                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4265         else
4266                 VTUNE_PATH=$with_vtune
4267         fi
4268         VTUNE_INCLUDE=$VTUNE_PATH/include
4269         case "$TARGET" in
4270         X86)
4271                 VTUNE_LIB=$VTUNE_PATH/lib32
4272                 ;;
4273         AMD64)
4274                 VTUNE_LIB=$VTUNE_PATH/lib64
4275                 ;;
4276         *)
4277                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4278                 ;;
4279         esac
4280         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4281                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4282         fi
4283         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4284                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4285         fi
4287         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4288         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4290         AC_SUBST(VTUNE_LIBS)
4291         AC_SUBST(VTUNE_CFLAGS)
4293 dnl Use GCC atomic ops if they work on the target.
4294 if test x$GCC = "xyes"; then
4295         case $TARGET in
4296         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
4297                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4298                 ;;
4299         esac
4302 if test "x$target_mach" = "xyes"; then
4304    if test "x$TARGET_SYS" = "xWATCHOS"; then
4305           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4306           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4307           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4308           BTLS_SUPPORTED=no
4309    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4310           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4311           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4312           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4313           BTLS_SUPPORTED=no
4314    else
4315        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4316        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4317        #error fail this for ios
4318        #endif
4319        ], [
4320                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4321           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4322           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4323           target_osx=yes
4324        ], [
4325           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4326           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4327           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4328           BTLS_SUPPORTED=no
4329                   target_ios=yes
4330        ])
4331         fi
4332    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4335 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4337 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4339 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4340    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4341 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4342    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4343 else
4344    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4347 if test "x$target_sizeof_void_p" != "x"; then
4348    AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4349    # This is true for all the current cross-compiling targets
4350    AC_DEFINE(SIZEOF_REGISTER,TARGET_SIZEOF_VOID_P,[size of target machine integer registers])
4351 else
4352    AC_DEFINE(TARGET_SIZEOF_VOID_P,SIZEOF_VOID_P,[wordsize of target])
4353    if test "x$sizeof_register" = "x4"; then
4354       AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4355    elif test "x$sizeof_register" = "x8"; then
4356       AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4357    else
4358       AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of target machine integer registers])
4359    fi
4362 if test "x$have_visibility_hidden" = "xyes"; then
4363    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4366 if test "x$have_deprecated" = "xyes"; then
4367    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4370 dnl 
4371 dnl Simple Generational checks (sgen)
4373 SGEN_DEFINES=
4374 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4375 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4376 if test x$buildsgen = xyes; then
4377    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4378    SGEN_DEFINES="-DHAVE_SGEN_GC"
4380         conc_gc_msg=""
4381    if test x$with_sgen_default_concurrent != xno; then
4382        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4383            conc_gc_msg=" (concurrent by default)"
4384    fi
4386    if test "x$gc_msg" = "x"; then
4387       gc_msg="sgen$conc_gc_msg"
4388    else
4389       gc_msg="sgen$conc_gc_msg and $gc_msg"
4390    fi
4392 AC_SUBST(SGEN_DEFINES)
4393 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4395 jit_status="Building and using the JIT"
4397 libsuffix=".so"
4399 case "$host" in
4400      *-*-darwin*)
4401         libsuffix=".dylib"
4402         LIBC="libc.dylib"
4403         INTL="libintl.dylib"
4404         SQLITE="libsqlite.0.dylib"
4405         SQLITE3="libsqlite3.0.dylib"
4406         X11="libX11.dylib"
4407         GDKX11="libgdk-x11-2.0.dylib"
4408         GTKX11="libgtk-x11-2.0.dylib"
4409         ;;
4410      *-*-*netbsd*)
4411         LIBC="libc.so"
4412         INTL="libintl.so"
4413         SQLITE="libsqlite.so"
4414         SQLITE3="libsqlite3.so"
4415         ;;
4416      *-*-kfreebsd*-gnu)
4417         LIBC="libc.so.0.1"
4418         INTL="libc.so.0.1"
4419         X11="libX11.so.6"
4420         ;;
4421     *-*-*freebsd*)
4422         LIBC="libc.so.7"
4423         INTL="libintl.so"
4424         SQLITE="libsqlite.so"
4425         SQLITE3="libsqlite3.so"
4426         ;;
4427     *-*-*openbsd*)
4428         LIBC="libc.so"
4429         INTL="libintl.so"
4430         SQLITE="libsqlite.so"
4431         SQLITE3="libsqlite3.so"
4432         ;;
4433     *-*-*linux*)
4434         AC_PATH_X
4435         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4436         AC_MSG_CHECKING(for the soname of libX11.so)
4437         for i in $x_libraries $dlsearch_path; do
4438                 for r in 4 5 6; do
4439                         if test -f $i/libX11.so.$r; then
4440                                 X11=libX11.so.$r
4441                                 AC_MSG_RESULT($X11)
4442                         fi
4443                 done
4444         done
4445         
4446         if test "x$X11" = "xlibX11.so"; then
4447                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4448                 X11=libX11.so.6
4449         fi
4450         ;;
4451 esac
4453 AC_SUBST(libsuffix)
4455 ######################################
4456 # EGLIB CHECKS
4457 ######################################
4459 GNUC_PRETTY=
4460 GNUC_UNUSED=
4461 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4462 if test x$GCC = xyes; then
4463    GNUC_UNUSED='__attribute__((__unused__))'
4464    GNUC_NORETURN='__attribute__((__noreturn__))'
4465    case $host_cpu in
4466      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4467    esac
4469 AC_SUBST(GNUC_PRETTY)
4470 AC_SUBST(GNUC_UNUSED)
4471 AC_SUBST(GNUC_NORETURN)
4472 AC_SUBST(BREAKPOINT)
4474 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4476 case $host in
4477 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4478     PATHSEP='\\'
4479     SEARCHSEP=';'
4480     OS="WIN32"
4481     PIDTYPE='void *'
4482     ;;
4484     PATHSEP='/'
4485     SEARCHSEP=':'
4486     OS="UNIX"
4487     PIDTYPE='int'
4488     ;;
4489 esac
4491 case $host in
4492         *-*-solaris*)
4493         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4494         ;;
4495 esac
4497 case $target in
4498 arm*-darwin*|aarch64*-*)
4499     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4500     ;;
4501 i*86-*-darwin*)
4502     ORDER=G_LITTLE_ENDIAN
4503     ;;
4504 *-*-haiku*)
4505     LDFLAGS="$LDFLAGS -ltextencoding"
4506     ;;
4507 *-*-openbsd*)
4508     CFLAGS="$CFLAGS -pthread"
4509     LDFLAGS="$LDFLAGS -pthread"
4510     ;;
4511 esac
4513 AC_SUBST(ORDER)
4514 AC_SUBST(CFLAGS)
4515 AC_SUBST(PATHSEP)
4516 AC_SUBST(SEARCHSEP)
4517 AC_SUBST(OS)
4518 AC_SUBST(PIDTYPE)
4520 # Defined for all targets/platforms using classic Windows API support.
4521 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4522 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4524 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4525 AC_CHECK_FUNCS(getrlimit)
4526 AC_CHECK_FUNCS(fork execv execve)
4528 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4530 if test x$with_overridable_allocators = xyes; then
4531         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4532   AC_MSG_NOTICE([Overridable allocator support enabled])
4533 else
4534   AC_MSG_NOTICE([Overridable allocator support disabled])
4538 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4539 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4540 # removed once support for 10.6 is dropped.
4542 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4544 if test x$target_osx = xyes; then
4545 AC_CHECK_FUNCS(getpwuid_r)
4546 elif test x$target_ios = xno; then
4547 AC_CHECK_FUNCS(strndup getpwuid_r)
4550 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4552 AC_SEARCH_LIBS(sqrtf, m)
4554 # nanosleep may not be part of libc, also search it in other libraries
4555 AC_SEARCH_LIBS(nanosleep, rt)
4557 AC_SEARCH_LIBS(dlopen, dl)
4558 old_ldflags="${LDFLAGS}"
4559 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4560 if test $lt_cv_prog_gnu_ld = yes; then
4561         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4562 else
4563         case $host in
4564         *-*-aix*|*-*-os400*)
4565                 ;;
4566         *)
4567                 dnl Try to use export-dynamic anyways
4568                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4569                 ;;
4570         esac
4572 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4573 if test $found_export_dynamic = no; then
4574         LDFLAGS="${old_ldflags}"
4577 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4578 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4579 AC_CHECK_LIB(iconv, iconv_open)
4580 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4581 AC_SUBST(HAVE_ALLOCA_H)
4583 # Get the exact type of size_t, not just its size.
4584 # This is so we can find an exact printf format among u, lu, llu, I64u.
4585 # To avoid warnings about slight mismatches.
4586 # C99 runtime "zu" dependency is being avoided here.
4588 # We have to compile as C++ because C is too lenient
4589 # and lets the wrong thing compile, with warnings.
4591 # Note: "zu" or ifdef <something> have the advantage
4592 # of producing installable "biarch" headers. i.e. one Mac header
4593 # for Mac/x86 and Mac/amd64.
4595 AC_LANG_PUSH(C++)
4597 # Check long before int because it is the overwhelming Unix answer,
4598 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4600 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4602 AC_MSG_CHECKING(if size_t is unsigned long)
4603 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4604         #include <stddef.h>
4605         unsigned long *a = (size_t*)0;
4606 ])], [
4607         AC_MSG_RESULT(yes)
4608         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4609 ], [
4610         AC_MSG_RESULT(no)
4611         AC_MSG_CHECKING(if size_t is unsigned int)
4612         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4613                 #include <stddef.h>
4614                 unsigned *a = (size_t*)0;
4615         ])], [
4616                 AC_MSG_RESULT(yes)
4617                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4618         ], [
4619 # At this point the majority of systems have their answer,
4620 # and we descend into non-standard or new-standard territory.
4622 # Check __int64 first because I64 on some systems predates ll, enabling
4623 # new compiler/old runtime interop, and the types always have the same size.
4624                 AC_MSG_RESULT(no)
4625                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4626                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4627                         #include <stddef.h>
4628                         unsigned __int64 *a = (size_t*)0;
4629                 ])], [
4630                         AC_MSG_RESULT(yes)
4631                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4632                 ], [
4633                         AC_MSG_RESULT(no)
4634                         AC_MSG_CHECKING(if size_t is unsigned long long)
4635                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4636                                 #include <stddef.h>
4637                                 unsigned long long *a = (size_t*)0;
4638                         ])], [
4639                                 AC_MSG_RESULT(yes)
4640                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4641                         ], [
4642                                 AC_MSG_RESULT(no)
4643                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4644                         ] )
4645                 ] )
4646         ] )
4647 ] )
4649 AC_LANG_POP
4651 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4652 # This provides for an exact match with functions that
4653 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4654 # uintptr_t is not necessarily the same.
4656 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4657 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4659 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4660    GSIZE="size_t"
4661    GSSIZE="ptrdiff_t"
4662 else
4663    GSIZE="uintptr_t"
4664    GSSIZE="intptr_t"
4667 AC_SUBST(GSIZE)
4668 AC_SUBST(GSSIZE)
4669 AC_SUBST(GSIZE_FORMAT)
4672 # END OF EGLIB CHECKS
4675 AC_ARG_WITH([libgdiplus],
4676         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4677         [], [with_libgdiplus=installed])
4679 # default install location
4680 libgdiplus_install_loc=libgdiplus${libsuffix}
4681 case "$host" in
4682     *-*-*linux*)
4683     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4684     ;;
4685 esac
4687 case $with_libgdiplus in
4688     no)
4689     libgdiplus_loc=
4690     ;;
4692     installed)
4693     libgdiplus_loc=
4694     if test x$cross_compiling = xno; then
4695         if test x$host_darwin = xyes; then
4696             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4697             if test -x $a; then
4698               libgdiplus_install_loc=$a
4699               libgdiplus_loc=$a
4700             fi
4701         fi
4702     fi
4703     ;;
4705     yes|sibling)
4706     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4707     ;;
4709     /*) # absolute path, assume it is an install location
4710     libgdiplus_loc=$with_libgdiplus
4711     libgdiplus_install_loc=$with_libgdiplus
4712     ;;
4714     *)
4715     libgdiplus_loc=`pwd`/$with_libgdiplus
4716     ;;
4717 esac
4718 AC_SUBST(libgdiplus_loc)
4719 AC_SUBST(libgdiplus_install_loc)
4721 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)
4722 if test "x$icall_symbol_map" = "xyes"; then
4723    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4726 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4727 if test "x$icall_export" = "xyes"; then
4728    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4731 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4732 if test "x$icall_tables" = "xno"; then
4733    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4736 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4738 if test "x$with_tls" = "x__thread"; then
4739         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4740         # Pass the information to libgc
4741         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4742         AC_MSG_CHECKING(if the tls_model attribute is supported)
4743         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4744                 ], [
4745                         AC_MSG_RESULT(yes)
4746                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4747                 ], [
4748                         AC_MSG_RESULT(no)
4749         ])
4752 if test ${TARGET} = ARM; then
4753         dnl ******************************************
4754         dnl *** Check to see what FPU is available ***
4755         dnl ******************************************
4756         AC_MSG_CHECKING(which FPU to use)
4758         #
4759         # This is a bit tricky:
4760         #
4761         # if (__ARM_PCS_VFP) {
4762         #       /* mfloat-abi=hard == VFP with hard ABI */
4763         # } elif (!__SOFTFP__) {
4764         #       /* mfloat-abi=softfp == VFP with soft ABI */
4765         # } else {
4766         #       /* mfloat-abi=soft == no VFP */
4767         # }
4768         #
4769         # The exception is iOS (w/ GCC) where none of the above
4770         # are defined (but iOS always uses the 'softfp' ABI).
4771         #
4772         # No support for FPA.
4773         #
4775         fpu=NONE
4777         # iOS GCC always uses the 'softfp' ABI.
4778         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4779                 fpu=VFP
4780         fi
4782         # Are we using the 'hard' ABI?
4783         if test x$fpu = xNONE; then
4784                 AC_TRY_COMPILE([], [
4785                         #ifndef __ARM_PCS_VFP
4786                         #error "Float ABI is not 'hard'"
4787                         #endif
4788                 ], [
4789                         fpu=VFP_HARD
4790                 ], [
4791                         fpu=NONE
4792                 ])
4793         fi
4795         # No 'hard' ABI. 'soft' or 'softfp'?
4796         if test x$fpu = xNONE; then
4797                 AC_TRY_COMPILE([], [
4798                         #ifdef __SOFTFP__
4799                         #error "Float ABI is not 'softfp'"
4800                         #endif
4801                 ], [
4802                         fpu=VFP
4803                 ], [
4804                         fpu=NONE
4805                 ])
4806         fi
4808         if test x$arm_fpu != x; then
4809            fpu=$arm_fpu
4810         fi
4812         AC_MSG_RESULT($fpu)
4813         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4814         unset fpu
4816         dnl *********************************************
4817         dnl *** Check which ARM version(s) we can use ***
4818         dnl *********************************************
4819         AC_MSG_CHECKING(which ARM version to use)
4821         AC_TRY_COMPILE([], [
4822                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4823                 #error Not on ARM v5.
4824                 #endif
4825         ], [
4826                 arm_v5=yes
4828                 arm_ver=ARMv5
4829         ], [])
4831         AC_TRY_COMPILE([], [
4832                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4833                 #error Not on ARM v6.
4834                 #endif
4835         ], [
4836                 arm_v5=yes
4837                 arm_v6=yes
4839                 arm_ver=ARMv6
4840         ], [])
4842         AC_TRY_COMPILE([], [
4843                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4844                 #error Not on ARM v7.
4845                 #endif
4846         ], [
4847                 arm_v5=yes
4848                 arm_v6=yes
4849                 arm_v7=yes
4851                 arm_ver=ARMv7
4852         ], [])
4854         AC_MSG_RESULT($arm_ver)
4856         if test x$arm_v5 = xyes; then
4857                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4858                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4859         fi
4861         if test x$arm_v6 = xyes; then
4862                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4863                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4864         fi
4866         if test x$arm_v7 = xyes; then
4867                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4868                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4869         fi
4872 if test ${TARGET} = unknown; then
4873         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4874         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4877 if test "x$platform_android" = "xyes"; then
4878         case "x${TARGET}" in
4879         xARM)
4880                 case "x$arm_ver" in
4881                 xARMv5)
4882                         BTLS_SUPPORTED=yes
4883                         BTLS_PLATFORM=android-armv5
4884                         ;;
4885                 xARMv6)
4886                         BTLS_SUPPORTED=yes
4887                         BTLS_PLATFORM=android-armv6
4888                         ;;
4889                 xARMv7)
4890                         BTLS_SUPPORTED=yes
4891                         BTLS_PLATFORM=android-armv7
4892                         ;;
4893                 *)
4894                         BTLS_SUPPORTED=no
4895                         ;;
4896                 esac
4897                 ;;
4898         xARM64)
4899                 BTLS_SUPPORTED=yes
4900                 BTLS_PLATFORM=android-v8a
4901                 ;;
4902         xX86)
4903                 BTLS_SUPPORTED=yes
4904                 BTLS_PLATFORM=android-x86
4905                 ;;
4906         xAMD64)
4907                 BTLS_SUPPORTED=yes
4908                 BTLS_PLATFORM=android-x64
4909                 ;;
4910         *)
4911                 BTLS_SUPPORTED=no
4912                 ;;
4913         esac
4916 if test ${ACCESS_UNALIGNED} = no; then
4917         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4920 if test x$host_darwin = xyes; then
4921         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4922         AS_IF(
4923                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4924                 [AC_MSG_RESULT([no])],
4925                 [
4926                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4927                         AR_FLAGS="Scru"
4928                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4929                         AC_MSG_RESULT([yes])
4930                 ]
4931         )
4934 case "x$libgc" in
4935         xincluded)
4936                 # Pass CPPFLAGS to libgc configure
4937                 # We should use a separate variable for this to avoid passing useless and
4938                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4939                 # This should be executed late so we pick up the final version of CPPFLAGS
4940                 # The problem with this approach, is that during a reconfigure, the main
4941                 # configure scripts gets invoked with these arguments, so we use separate
4942                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4943                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4944                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4945                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4946                 fi
4947                 # Don't pass -finstrument-for-thread-suspension in, 
4948                 # if these are instrumented it will be very bad news 
4949                 # (infinite recursion, undefined parking behavior, etc)
4950                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4951                 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\""
4952                 if test "x$support_boehm" = "xyes"; then
4953                         AC_CONFIG_SUBDIRS(libgc)
4954                 fi
4955                 ;;
4956 esac
4958 MALLOC_MEMPOOLS=no
4959 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4960         if test x$with_malloc_mempools = xyes; then
4961                 MALLOC_MEMPOOLS=yes
4962                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4963         fi
4967 DISABLE_MCS_DOCS=default
4968 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4969         if test x$with_mcs_docs != xyes; then
4970                 DISABLE_MCS_DOCS=yes
4971         fi
4973 if test -n "$INSTALL_4_x_TRUE"; then :
4974         DISABLE_MCS_DOCS=yes
4976 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4977    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4980 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)],[
4981         if test x$with_lazy_gc_thread_creation != xno ; then
4982                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4983         fi
4984 ], [with_lazy_gc_thread_creation=no])
4986 dnl *****************************
4987 dnl *** Thread suspend policy ***
4988 dnl *****************************
4990 dnl Set a default hybrid or cooperative suspend on some platforms
4992 dnl Coop default is set by the bitcode preset.
4994 dnl If coop isn't on by default, maybe hybrid should be?
4995 if test x$enable_cooperative_suspend_default != xyes; then
4996         case $HOST in
4997         X86 | AMD64)
4998                 dnl Some host/target confusion, there's no host_osx (and
4999                 dnl host_darwin would be true on iOS not just macOS).
5000                 if test x$target_osx = xyes; then
5001                         enable_hybrid_suspend_default=yes
5002                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5003                         enable_hybrid_suspend_default=yes
5004                 fi
5005                 ;;
5006         esac
5009 dnl Now check if there were flags overriding the defaults
5011 AC_ARG_WITH(cooperative_gc,        [  --with-cooperative-gc=yes|no        Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [AC_MSG_WARN([--with-cooperative-gc is deprecated, use --enable-cooperative-suspend instead])], [with_cooperative_gc=default])
5012 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5014 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5015         enable_cooperative_suspend=$with_cooperative_gc
5018 if test x$enable_cooperative_suspend = xdefault; then
5019         enable_cooperative_suspend=$enable_cooperative_suspend_default
5022 if test x$enable_cooperative_suspend != xno; then
5023         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5026 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5028 AC_ARG_ENABLE(hybrid_suspend, [ --enable-hybrid-suspend     Enable hybrid stop-the-world garbage collection (sgen only) - cooperative suspend for threads running managed and runtime code, and preemptive suspend for threads running native and P/Invoke code (defaults to no)], [], [enable_hybrid_suspend=default])
5030 if test x$enable_hybrid_suspend = xdefault; then
5031    enable_hybrid_suspend=$enable_hybrid_suspend_default
5034 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5035         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5038 if test x$enable_hybrid_suspend != xno ; then
5039         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5042 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5044 dnl End of thread suspend policy
5046 dnl **********************
5047 dnl *** checked builds ***
5048 dnl **********************
5050 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],[
5052         if test x$enable_checked_build != x ; then
5053                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5054         fi
5055         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5056                 eval "mono_checked_build_test_enable_$feature='yes'"
5057         done
5059         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5060                 eval "mono_checked_build_test_enable_gc='yes'"
5061                 eval "mono_checked_build_test_enable_metadata='yes'"
5062                 eval "mono_checked_build_test_enable_thread='yes'"
5063                 eval "mono_checked_build_test_enable_private_types='yes'"
5064         fi
5066         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5067                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5068         fi
5070         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5071                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5072         fi
5074         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5075                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5076         fi
5078         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5079                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5080         fi
5081 ], [])
5083 dnl End of checked builds
5085 AC_CHECK_HEADER([malloc.h], 
5086                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5087                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5089 if test x"$GCC" = xyes; then
5090         # Implicit function declarations are not 64 bit safe
5091         # Do this late, since this causes lots of configure tests to fail
5092         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5093         # jay has a lot of implicit declarations
5094         JAY_CFLAGS="-Wno-implicit-function-declaration"
5097 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5098 # instead of libmono-static.a
5099 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5100    LIBMONO_LA=libmini-static.la
5101 else
5102    if test x$buildsgen = xyes; then
5103       LIBMONO_LA=libmonosgen-$API_VER.la
5104    else
5105       LIBMONO_LA=libmonoboehm-$API_VER.la
5106    fi
5108 AC_SUBST(LIBMONO_LA)
5110 dnl **************
5111 dnl ***  Btls  ***
5112 dnl **************
5114 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5115 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5116 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5118 if test "x$enable_btls" = "xno"; then
5119    enable_btls_lib=no
5122 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5124 btls_android=no
5125 if test "x$enable_btls" = "xyes"; then
5126         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5127         if test "x$CMAKE" = "xno"; then
5128                 AC_MSG_ERROR("cmake not found")
5129         fi
5131         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5132         AC_SUBST(BTLS_ROOT)
5134         btls_arch=
5135         btls_cflags=
5136         BTLS_CMAKE_ARGS=
5138         case "$BTLS_PLATFORM" in
5139         i386)
5140                 btls_arch=i386
5141                 btls_cflags="-m32"
5142                 case $host_os in
5143                         darwin*)
5144                                 btls_cflags="$btls_cflags -arch i386"
5145                 esac
5146                 ;;
5147         x86_64)
5148                 btls_arch=x86_64
5149                 ;;
5150         arm)
5151                 btls_arch=arm
5152                 btls_cflags="-DOPENSSL_NO_ASM=1"
5153                 ;;
5154         armsoft)
5155                 btls_arch=arm
5156                 btls_cflags="-DOPENSSL_NO_ASM=1"
5157                 ;;
5158         aarch64)
5159                 btls_arch=aarch64
5160                 btls_cflags="-march=armv8-a+crypto"
5161                 ;;
5162         s390x)
5163                 btls_arch=s390x
5164                 ;;
5165         powerpc)
5166                 btls_arch=powerpc
5167                 case $host_os in
5168                         aix*|os400*)
5169                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5170                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5171                 esac
5172                 ;;
5173         android-armv5)
5174                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5175                 ;;
5176         android-armv6)
5177                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5178                 ;;
5179         android-armv7)
5180                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5181                 ;;
5182         android-v8a)
5183                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5184                 ;;
5185         android-x86)
5186                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5187                 ;;
5188         android-x64)
5189                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5190                 ;;
5191         *)
5192                 AC_MSG_ERROR(Invalid BTLS platform)
5193         esac
5195         if test "x$platform_android" = "xyes"; then
5196                 btls_android=yes
5197                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5198                 if test "x$with_btls_android_ndk" != "x"; then
5199                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5200                 else
5201                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5202                 fi
5203         fi
5205         if test "x$btls_arch" != "x"; then
5206                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5207         fi
5209         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5210         AC_SUBST(BTLS_ARCH)
5211         AC_SUBST(BTLS_CFLAGS)
5212         AC_SUBST(BTLS_PLATFORM)
5213         AC_SUBST(BTLS_CMAKE_ARGS)
5215         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5216 else
5217         enable_btls=no
5220 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5222 if test x$DISABLE_MCS_DOCS = xyes; then
5223    docs_dir=""
5224 else
5225    docs_dir=docs
5227 AC_SUBST(docs_dir)
5229 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5230 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5231 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5233 libmono_ldflags="$libmono_ldflags $LIBS"
5235 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5236 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5237 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5238 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5239 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5240 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5241 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5242 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5243 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5244 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5245 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5246 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5247 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5248 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5249 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5250 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5251 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5252 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5254 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5256 AC_SUBST(LIBC)
5257 AC_SUBST(INTL)
5258 AC_SUBST(SQLITE)
5259 AC_SUBST(SQLITE3)
5260 AC_SUBST(X11)
5261 AC_SUBST(GDKX11)
5262 AC_SUBST(GTKX11)
5263 AC_SUBST(XINERAMA)
5264 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5265 AC_SUBST(arch_target)
5266 AC_SUBST(CFLAGS)
5267 AC_SUBST(CPPFLAGS)
5268 AC_SUBST(LDFLAGS)
5270 #This must always be defined when building the runtime
5271 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5273 mono_build_root=`pwd`
5274 AC_SUBST(mono_build_root)
5276 mono_runtime=mono/mini/mono
5277 AC_SUBST(mono_runtime)
5279 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5281 if test $csc_compiler = mcs; then
5282   CSC=$mcs_topdir/class/lib/build/mcs.exe
5283 else
5284   CSC=$CSC_LOCATION
5287 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5289 mono_cfg_root=$mono_build_root/runtime
5290 if test x$host_win32 = xyes; then
5291   if test "x$cross_compiling" = "xno"; then
5292     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5293     CSC=`cygpath -m -a $CSC`
5294     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5295   else
5296     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5297   fi
5298 else
5299   mono_cfg_dir=$mono_cfg_root/etc
5301 AC_SUBST(mono_cfg_dir)
5303 AC_SUBST(CSC)
5305 AC_CONFIG_FILES([po/mcs/Makefile.in])
5307 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5308 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5310 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5311 [   depth=../../../..
5312     case $srcdir in
5313     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5314     .) reldir=$depth ;;
5315     *) reldir=$depth/$srcdir ;;
5316     esac
5317     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5318     cd runtime/etc/mono/1.0
5319     rm -f machine.config
5320     $LN_S $reldir/data/net_1_1/machine.config machine.config
5321     cd $depth
5322 ],[LN_S='$LN_S'])
5324 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5325 [   depth=../../../..
5326     case $srcdir in
5327     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5328     .) reldir=$depth ;;
5329     *) reldir=$depth/$srcdir ;;
5330     esac
5331     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5332     cd runtime/etc/mono/2.0
5333     rm -f machine.config
5334     $LN_S $reldir/data/net_2_0/machine.config machine.config
5335     cd $depth
5336 ],[LN_S='$LN_S'])
5338 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5339 [   depth=../../../..
5340     case $srcdir in
5341     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5342     .) reldir=$depth ;;
5343     *) reldir=$depth/$srcdir ;;
5344     esac
5345     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5346     cd runtime/etc/mono/2.0
5347     rm -f web.config
5348     $LN_S $reldir/data/net_2_0/web.config web.config
5349     cd $depth
5350 ],[LN_S='$LN_S'])
5352 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5353 [   depth=../../..
5354     case $srcdir in
5355     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5356     .) reldir=$depth ;;
5357     *) reldir=$depth/$srcdir ;;
5358     esac
5359     $ac_aux_dir/install-sh -d runtime/etc/mono/
5360     cd runtime/etc/mono/
5361     rm -f browscap.ini
5362     $LN_S $reldir/data/browscap.ini browscap.ini
5363     cd $depth
5364 ],[LN_S='$LN_S'])
5366 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5367 [   depth=../../../../..
5368     case $srcdir in
5369     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5370     .) reldir=$depth ;;
5371     *) reldir=$depth/$srcdir ;;
5372     esac
5373     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5374     cd runtime/etc/mono/2.0/Browsers
5375     rm -f Compat.browser
5376     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5377     cd $depth
5378 ],[LN_S='$LN_S'])
5380 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5381 [   depth=../../../../..
5382     case $srcdir in
5383     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5384     .) reldir=$depth ;;
5385     *) reldir=$depth/$srcdir ;;
5386     esac
5387     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5388     cd runtime/etc/mono/4.0/Browsers
5389     rm -f Compat.browser
5390     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5391     cd $depth
5392 ],[LN_S='$LN_S'])
5394 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5395 [   depth=../../../../..
5396     case $srcdir in
5397     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5398     .) reldir=$depth ;;
5399     *) reldir=$depth/$srcdir ;;
5400     esac
5401     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5402     cd runtime/etc/mono/4.5/Browsers
5403     rm -f Compat.browser
5404     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5405     cd $depth
5406 ],[LN_S='$LN_S'])
5408 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5409 [   depth=../../../..
5410     case $srcdir in
5411     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5412     .) reldir=$depth ;;
5413     *) reldir=$depth/$srcdir ;;
5414     esac
5415     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5416     cd runtime/etc/mono/4.0
5417     rm -f machine.config
5418     $LN_S $reldir/data/net_4_0/machine.config machine.config
5419     cd $depth
5420 ],[LN_S='$LN_S'])
5422 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5423 [   depth=../../../..
5424     case $srcdir in
5425     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5426     .) reldir=$depth ;;
5427     *) reldir=$depth/$srcdir ;;
5428     esac
5429     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5430     cd runtime/etc/mono/4.0
5431     rm -f web.config
5432     $LN_S $reldir/data/net_4_0/web.config web.config
5433     cd $depth
5434 ],[LN_S='$LN_S'])
5436 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5437 [   depth=../../../..
5438     case $srcdir in
5439     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5440     .) reldir=$depth ;;
5441     *) reldir=$depth/$srcdir ;;
5442     esac
5443     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5444     cd runtime/etc/mono/4.5
5445     rm -f machine.config
5446     $LN_S $reldir/data/net_4_5/machine.config machine.config
5447     cd $depth
5448 ],[LN_S='$LN_S'])
5450 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5451 [   depth=../../../..
5452     case $srcdir in
5453     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5454     .) reldir=$depth ;;
5455     *) reldir=$depth/$srcdir ;;
5456     esac
5457     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5458     cd runtime/etc/mono/4.5
5459     rm -f web.config
5460     $LN_S $reldir/data/net_4_5/web.config web.config
5461     cd $depth
5462 ],[LN_S='$LN_S'])
5464 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])
5465 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])
5466 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5468 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5469 if test x"$GCC" = xyes; then
5471         # incompatible-pointer-types requires gcc circa 5.x
5473         ORIG_CFLAGS=$CFLAGS
5474         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5475         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5476         AC_TRY_COMPILE([],[
5477         ], [
5478                 AC_MSG_RESULT(yes)
5479                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5480         ], [
5481                 AC_MSG_RESULT(no)
5482                 CFLAGS=$ORIG_CFLAGS
5483         ])
5486 # Update all submodules recursively to ensure everything is checked out
5487 (cd $srcdir && scripts/update_submodules.sh)
5489 AC_OUTPUT([
5490 Makefile
5491 mono-uninstalled.pc
5492 acceptance-tests/Makefile
5493 llvm/Makefile
5494 scripts/mono-find-provides
5495 scripts/mono-find-requires
5496 mk/Makefile
5497 mono/Makefile
5498 mono/btls/Makefile
5499 mono/utils/Makefile
5500 mono/utils/jemalloc/Makefile
5501 mono/metadata/Makefile
5502 mono/dis/Makefile
5503 mono/cil/Makefile
5504 mono/arch/Makefile
5505 mono/arch/x86/Makefile
5506 mono/arch/amd64/Makefile
5507 mono/arch/ppc/Makefile
5508 mono/arch/sparc/Makefile
5509 mono/arch/s390x/Makefile
5510 mono/arch/arm/Makefile
5511 mono/arch/arm64/Makefile
5512 mono/arch/mips/Makefile
5513 mono/sgen/Makefile
5514 mono/tests/Makefile
5515 mono/tests/assembly-load-reference/Makefile
5516 mono/tests/tests-config
5517 mono/tests/gc-descriptors/Makefile
5518 mono/tests/testing_gac/Makefile
5519 mono/unit-tests/Makefile
5520 mono/benchmark/Makefile
5521 mono/mini/Makefile
5522 mono/profiler/Makefile
5523 mono/eglib/Makefile
5524 mono/eglib/eglib-config.h
5525 mono/eglib/test/Makefile
5526 m4/Makefile
5527 ikvm-native/Makefile
5528 scripts/Makefile
5529 man/Makefile
5530 docs/Makefile
5531 data/Makefile
5532 data/net_2_0/Makefile
5533 data/net_4_0/Makefile
5534 data/net_4_5/Makefile
5535 data/net_2_0/Browsers/Makefile
5536 data/net_4_0/Browsers/Makefile
5537 data/net_4_5/Browsers/Makefile
5538 data/mint.pc
5539 data/mono-2.pc
5540 data/monosgen-2.pc
5541 data/mono.pc
5542 data/mono-cairo.pc
5543 data/mono-nunit.pc
5544 data/mono-options.pc
5545 data/mono-lineeditor.pc
5546 data/monodoc.pc
5547 data/dotnet.pc
5548 data/dotnet35.pc
5549 data/wcf.pc
5550 data/cecil.pc
5551 data/system.web.extensions_1.0.pc
5552 data/system.web.extensions.design_1.0.pc
5553 data/system.web.mvc.pc
5554 data/system.web.mvc2.pc
5555 data/system.web.mvc3.pc
5556 data/aspnetwebstack.pc
5557 data/reactive.pc
5558 samples/Makefile
5559 support/Makefile
5560 data/config
5561 tools/Makefile
5562 tools/locale-builder/Makefile
5563 tools/sgen/Makefile
5564 tools/monograph/Makefile
5565 tools/pedump/Makefile
5566 runtime/Makefile
5567 msvc/Makefile
5568 po/Makefile
5571 if test x$host_win32 = xyes; then
5572    # Get rid of 'cyg' prefixes in library names
5573    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5574    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5575    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5576    # executable doesn't work...
5577    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5580 if test x$host_darwin = xyes; then
5581    # This doesn't seem to be required and it slows down parallel builds
5582    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5586   case $prefix in
5587   NONE) prefix=$ac_default_prefix ;;
5588   esac
5589   case $exec_prefix in
5590   NONE) exec_prefix='${prefix}' ;;
5591   esac
5593   #
5594   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5595   # any existing config.make.  This allows people to share the same source tree
5596   # with different build directories, one native and one cross
5597   #
5598   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5600     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5602     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5603     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5604     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5605     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5606     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5607     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5608     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5609     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5610     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5612     case $INSTALL in
5613     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5614     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5615     esac
5617     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5619     export VERSION
5620     [myver=$($AWK 'BEGIN {
5621       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5622       if(length(vsplit [1]) > 4) {
5623         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5624       }
5625       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5626     }')]
5628     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5629     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5631     if test x$host_darwin = xyes; then
5632       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
5633       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
5634       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5635     elif test x$host_win32 = xyes; then
5636       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5637       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5638       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5639     elif test x$host_linux = xyes; then
5640       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5641       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5642       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5643     else
5644       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
5645       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5646       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5647     fi
5649     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5650       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5651     fi
5653         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5654            enable_system_aot=yes
5655         fi
5657     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5658       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5659     fi
5661     if test x$DISABLE_MCS_DOCS = xyes; then
5662       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5663     fi
5665     if test x$has_extension_module != xno; then
5666         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5667     fi
5668     
5669     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5670     
5671     if test "x$test_bcl_opt" = "xyes"; then    
5672       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5673     fi
5675     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5677     if test $csc_compiler = mcs; then
5678       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5679     fi
5681     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5682       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5683       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5684       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5685     fi
5687     if test "x$AOT_MODE" != "x" ; then
5688       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5689     fi
5691     if test "x$enable_btls" = "xyes"; then
5692       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5693     fi
5695   fi
5699 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5701 btls_platform_string=
5702 if test x$enable_btls = xyes; then
5703         if test x$btls_android = xyes; then
5704                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5705         else
5706                 btls_platform_string=" ($BTLS_PLATFORM)"
5707         fi
5710 thread_suspend_msg=
5711 if test x$buildsgen = xyes; then
5712         if test x$enable_cooperative_suspend != xno; then
5713                 thread_suspend_msg="Suspend:       Cooperative"
5714         elif test x$enable_hybrid_suspend != xno; then
5715                 thread_suspend_msg="Suspend:       Hybrid"
5716         else
5717                 thread_suspend_msg="Suspend:       Preemptive"
5718         fi
5720         
5721 echo "
5722         mcs source:    $mcsdir
5723         C# Compiler:   $csc_compiler
5725    Engine:
5726         Host:          $host
5727         Target:        $target
5728         GC:            $gc_msg 
5729         $thread_suspend_msg
5730         TLS:           $with_tls
5731         SIGALTSTACK:   $with_sigaltstack
5732         Engine:        $jit_status
5733         BigArrays:     $enable_big_arrays
5734         DTrace:        $enable_dtrace
5735         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
5736         Spectre:       $spectre_mitigation_status
5738    Libraries:
5739         .NET 4.x:        $with_profile4_x
5740         Xamarin.Android: $with_monodroid
5741         Xamarin.iOS:     $with_monotouch
5742         Xamarin.WatchOS: $with_monotouch_watch
5743         Xamarin.TVOS:    $with_monotouch_tv
5744         Xamarin.Mac:     $with_xammac
5745         Windows AOT:     $with_winaot
5746         Orbis:           $with_orbis
5747         Unreal:          $with_unreal
5748         WebAssembly:     $with_wasm
5749         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5750         JNI support:     $jdk_headers_found
5751         libgdiplus:      $libgdiplus_msg
5752         zlib:            $zlib_msg
5753         BTLS:            $enable_btls$btls_platform_string
5754         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5755         crash reporting: $crash_reporting
5756         $disabled
5758 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5759    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)