[System.XML] Switch tests to use embedded test resources
[mono-project.git] / configure.ac
blob90d83ad85eedbc3925e81b50df4d131fbfd2a907
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.19.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 working poll() (macosx defines it but doesn't ***
2639         dnl *** have it in the library (duh))                            ***
2640         dnl ****************************************************************
2641         AC_CHECK_FUNCS(poll)
2643         dnl **********************************
2644         dnl *** epoll                      ***
2645         dnl **********************************
2646         AC_CHECK_HEADERS(sys/epoll.h)
2647         haveepoll=no
2648         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2649         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2650                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2651         fi
2653         havekqueue=no
2655         AC_CHECK_HEADERS(sys/event.h)
2656         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2658         dnl **************************************
2659         dnl * Darwin has a race that prevents us from using reliably:
2660         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2661         dnl * Since kqueue is mostly used for scaling large web servers, 
2662         dnl * and very few folks run Mono on large web servers on OSX, falling
2663         dnl * back 
2664         dnl **************************************
2665         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2666                 if test "x$host_darwin" = "xno"; then
2667                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2668                 fi
2669         fi
2671         dnl ******************************
2672         dnl *** Checks for SIOCGIFCONF ***
2673         dnl ******************************
2674         AC_CHECK_HEADERS(sys/ioctl.h)
2675         AC_CHECK_HEADERS(net/if.h, [], [],
2676            [
2677            #ifdef HAVE_SYS_TYPES_H
2678            # include <sys/types.h>
2679            #endif
2680            #ifdef HAVE_SYS_SOCKET_H
2681            # include <sys/socket.h>
2682            #endif
2683            ])
2684         AC_MSG_CHECKING(for ifreq)
2685         AC_TRY_COMPILE([
2686                 #include <stdio.h>
2687                 #include <sys/ioctl.h>
2688                 #include <net/if.h>
2689                 ], [
2690                 struct ifconf ifc;
2691                 struct ifreq *ifr;
2692                 void *x;
2693                 ifc.ifc_len = 0;
2694                 ifc.ifc_buf = NULL;
2695                 x = (void *) &ifr->ifr_addr;
2696                 ],[
2697                         AC_MSG_RESULT(yes)
2698                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2699                 ], [
2700                         AC_MSG_RESULT(no)
2701                 ])
2702         dnl **********************************
2703         dnl ***     Checks for sin_len     ***
2704         dnl **********************************
2705         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2706         AC_TRY_COMPILE([
2707                 #include <netinet/in.h>
2708                 ], [
2709                 struct sockaddr_in saddr;
2710                 saddr.sin_len = sizeof (saddr);
2711                 ],[
2712                         AC_MSG_RESULT(yes)
2713                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2714                 ], [
2715                         AC_MSG_RESULT(no)
2716                 ])      
2717         dnl **********************************
2718         dnl ***    Checks for sin6_len     ***
2719         dnl **********************************
2720         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2721         AC_TRY_COMPILE([
2722                 #include <netinet/in.h>
2723                 ], [
2724                 struct sockaddr_in6 saddr6;
2725                 saddr6.sin6_len = sizeof (saddr6);
2726                 ],[
2727                         AC_MSG_RESULT(yes)
2728                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2729                 ], [
2730                         AC_MSG_RESULT(no)
2731                 ])
2732         dnl **********************************
2733         dnl *** Check for getifaddrs       ***
2734         dnl **********************************
2735         AC_MSG_CHECKING(for getifaddrs)
2736                 AC_TRY_LINK([
2737                 #include <stdio.h>
2738                 #include <sys/types.h>
2739                 #include <sys/socket.h>
2740                 #include <ifaddrs.h>
2741         ], [
2742                 getifaddrs(NULL);
2743         ], [
2744                 # Yes, we have it...
2745                 AC_MSG_RESULT(yes)
2746                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2747         ], [
2748                 AC_MSG_RESULT(no)
2749         ])
2750         dnl **********************************
2751         dnl *** Check for if_nametoindex   ***
2752         dnl **********************************
2753         AC_MSG_CHECKING(for if_nametoindex)
2754                 AC_TRY_LINK([
2755                 #include <stdio.h>
2756                 #include <sys/types.h>
2757                 #include <sys/socket.h>
2758                 #include <net/if.h>
2759         ], [
2760                 if_nametoindex(NULL);
2761         ], [
2762                 # Yes, we have it...
2763                 AC_MSG_RESULT(yes)
2764                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2765         ], [
2766                 AC_MSG_RESULT(no)
2767         ])
2768         dnl **********************************
2769         dnl *** Check for access ***
2770         dnl **********************************
2771         AC_MSG_CHECKING(for access)
2772                 AC_TRY_LINK([
2773                 #include <unistd.h>
2774         ], [
2775                 access(NULL,0);
2776         ], [
2777                 # Yes, we have it...
2778                 AC_MSG_RESULT(yes)
2779                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2780         ], [
2781                 AC_MSG_RESULT(no)
2782         ])
2783                         
2784         dnl **********************************
2785         dnl *** Checks for proclib         ***
2786         dnl **********************************
2787         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.)])
2788         dnl **********************************
2789         dnl *** Checks for MonoPosixHelper ***
2790         dnl **********************************
2791         AC_CHECK_HEADERS(checklist.h)
2792         AC_CHECK_HEADERS(pathconf.h)
2793         AC_CHECK_HEADERS(fstab.h)
2794         AC_CHECK_HEADERS(attr/xattr.h)
2795         AC_CHECK_HEADERS(sys/extattr.h)
2796         AC_CHECK_HEADERS(sys/sendfile.h)
2797         AC_CHECK_HEADERS(sys/statvfs.h)
2798         AC_CHECK_HEADERS(sys/statfs.h)
2799         AC_CHECK_HEADERS(sys/vfstab.h)
2800         AC_CHECK_HEADERS(sys/xattr.h)
2801         AC_CHECK_HEADERS(sys/mman.h)
2802         AC_CHECK_HEADERS(sys/param.h)
2803         AC_CHECK_HEADERS(sys/mount.h, [], [],
2804                 [
2805                 #ifdef HAVE_SYS_PARAM_H
2806                 # include <sys/param.h>
2807                 #endif
2808                 ])
2809         AC_CHECK_HEADERS(sys/mount.h)
2810         AC_CHECK_FUNCS(confstr)
2811         AC_CHECK_FUNCS(seekdir telldir)
2812         AC_CHECK_FUNCS(getdomainname)
2813         AC_CHECK_FUNCS(setdomainname)
2814         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2815         AC_CHECK_FUNCS(setgroups)
2816         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2817         AC_CHECK_FUNCS(getfsstat)
2818         AC_CHECK_FUNCS(lutimes futimes)
2819         AC_CHECK_FUNCS(mremap)
2820         AC_CHECK_FUNCS(remap_file_pages)
2821         AC_CHECK_FUNCS(posix_fadvise)
2822         AC_CHECK_FUNCS(posix_fallocate)
2823         AC_CHECK_FUNCS(posix_madvise)
2824         AC_CHECK_FUNCS(vsnprintf)
2825         AC_CHECK_FUNCS(sendfile)
2826         AC_CHECK_FUNCS(gethostid sethostid)
2827         AC_CHECK_FUNCS(sethostname)
2828         AC_CHECK_FUNCS(statfs)
2829         AC_CHECK_FUNCS(fstatfs)
2830         AC_CHECK_FUNCS(statvfs)
2831         AC_CHECK_FUNCS(fstatvfs)
2832         AC_CHECK_FUNCS(stime)
2833         AC_CHECK_FUNCS(ttyname_r)
2834         AC_CHECK_FUNCS(psignal)
2835         AC_CHECK_FUNCS(getlogin_r)
2836         AC_CHECK_FUNCS(lockf)
2837         AC_CHECK_FUNCS(swab)
2838         AC_CHECK_FUNCS(setusershell endusershell)
2839         AC_CHECK_FUNCS(futimens utimensat)
2840         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2841         AC_CHECK_FUNCS(readv writev preadv pwritev)
2842         AC_CHECK_FUNCS(setpgid)
2843         AC_CHECK_FUNCS(system)
2844         AC_CHECK_FUNCS(fork execv execve)
2845         AC_CHECK_FUNCS(accept4)
2846         AC_CHECK_FUNCS(localtime_r)
2847         AC_CHECK_FUNCS(mkdtemp)
2848         AC_CHECK_SIZEOF(size_t)
2849         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2850                 [#include <sys/types.h>
2851                  #include <sys/stat.h>
2852                  #include <unistd.h>])
2853         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2854                 [#include <sys/types.h>
2855                  #include <sys/stat.h>
2856                  #include <unistd.h>])
2857         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2858                 [#include <sys/time.h>])
2859         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2860                 [#include <sys/socket.h>])
2861         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2862                 [#include <unistd.h>
2863                  #include <fcntl.h>])
2864         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2865                 [#include <sys/uio.h>])
2866         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2867                 [#include <sys/socket.h>])
2868         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2869                 [#include <sys/poll.h>])
2870         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2871                 [#include <sys/socket.h>])
2872         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2873                 [#include <sys/socket.h>])
2874         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2875                 [#include <netinet/in.h>])
2876         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2877                 [#include <netinet/in.h>])
2878         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2879                 [#include <sys/un.h>])
2880         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2881                 [#include <sys/types.h>
2882                  #include <sys/stat.h>
2883                  #include <unistd.h>])
2884         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2885                 [#include <time.h>])
2886         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2887                 [#include <sys/time.h>
2888                  #include <sys/types.h>
2889                  #include <utime.h>])
2890         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2891                 [#include <sys/time.h>])
2892         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2893                 [#include <sys/types.h>
2894                  #include <utime.h>])
2895         AC_CHECK_MEMBERS(
2896                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2897                 [#include <sys/types.h>
2898                  #include <dirent.h>])
2899         AC_CHECK_MEMBERS(
2900                 [struct passwd.pw_gecos],,, 
2901                 [#include <sys/types.h>
2902                  #include <pwd.h>])
2903         AC_CHECK_MEMBERS(
2904                 [struct statfs.f_flags],,, 
2905                 [#include <sys/types.h>
2906                  #include <sys/vfs.h>])
2907         AC_CHECK_MEMBERS(
2908                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2909                 [#include <sys/types.h>
2910                  #include <sys/stat.h>
2911                  #include <unistd.h>])
2913         dnl Favour xattr through glibc, but use libattr if we have to
2914         AC_CHECK_FUNC(lsetxattr, ,
2915                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2916         )
2917         AC_SUBST(XATTR_LIB)
2919         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2920         AC_CHECK_MEMBERS(
2921                 [struct kinfo_proc.kp_proc],,, 
2922                 [#include <sys/types.h>
2923                  #include <sys/param.h>
2924                  #include <sys/sysctl.h>
2925                  #include <sys/proc.h>
2926                  ])
2928         dnl *********************************
2929         dnl *** Checks for Windows compilation ***
2930         dnl *********************************
2931         AC_CHECK_HEADERS(sys/time.h)
2932         AC_CHECK_HEADERS(sys/param.h)
2933         AC_CHECK_HEADERS(dirent.h)
2935         dnl ******************************************
2936         dnl *** Checks for OSX and iOS compilation ***
2937         dnl ******************************************
2938         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2940         dnl *********************************
2941         dnl *** Check for Console 2.0 I/O ***
2942         dnl *********************************
2943         AC_CHECK_HEADERS([curses.h])
2944         AC_CHECK_HEADERS([term.h], [], [],
2945         [#if HAVE_CURSES_H
2946          #include <curses.h>
2947          #endif
2948         ])
2949         AC_CHECK_HEADERS([termios.h])
2951         dnl *********************************
2952         dnl *** Checks for random         ***
2953         dnl *********************************
2954         if test x$host_darwin = xno; then
2955                 AC_CHECK_HEADERS(sys/random.h)
2956                 AC_CHECK_FUNCS(getrandom getentropy)
2957         fi
2959         dnl *********************************
2960         dnl *** Checks for System.Native  ***
2961         dnl *********************************
2963         AC_MSG_CHECKING(for linux/in.h)
2964         AC_TRY_COMPILE([
2965                 #include <sys/socket.h>
2966                 #include <linux/in.h>
2967         ], [
2968         ],[
2969                 AC_MSG_RESULT(yes)
2970                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
2971         ], [
2972                 AC_MSG_RESULT(no)
2973         ])
2975         AC_MSG_CHECKING(for struct in_pktinfo)
2976         AC_TRY_COMPILE([
2977                 #ifdef HAVE_LINUX_IN_H
2978                 #include <sys/socket.h>
2979                 #include <linux/in.h>
2980                 #else
2981                 #include <netinet/in.h>
2982                 #endif
2983         ], [
2984                 struct in_pktinfo pktinfo;
2985         ],[
2986                 AC_MSG_RESULT(yes)
2987                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
2988         ], [
2989                 AC_MSG_RESULT(no)
2990         ])
2992         AC_MSG_CHECKING(for struct ip_mreqn)
2993         AC_TRY_COMPILE([
2994                 #if HAVE_LINUX_IN_H
2995                 #include <sys/socket.h>
2996                 #include <linux/in.h>
2997                 #else
2998                 #include <netinet/in.h>
2999                 #endif
3000         ], [
3001                 struct ip_mreqn mreqn;
3002         ],[
3003                 AC_MSG_RESULT(yes)
3004                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3005         ], [
3006                 AC_MSG_RESULT(no)
3007         ])
3009         if test x$host_darwin = xno; then
3010                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3011         fi
3013         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3014         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3015         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3016         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3017         AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3018         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3019         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3020         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3021         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3022         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3023         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3024         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3025         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3026         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3027         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3028         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3029         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3030         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3031         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3032         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3034         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3035         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3037         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>]])
3038         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>]])
3039         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>]])
3040         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>]])
3041         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3042         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3043         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3045         AC_MSG_CHECKING(for struct statfs)
3046         AC_TRY_COMPILE([
3047                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3048                 #include <sys/mount.h>
3049                 #else
3050                 #include <sys/statfs.h>
3051                 #endif
3052         ], [
3053                 struct statfs;
3054         ],[
3055                 AC_MSG_RESULT(yes)
3056                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3057         ], [
3058                 AC_MSG_RESULT(no)
3059         ])
3061         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3062                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3063         fi
3065         AC_MSG_CHECKING(for readdir_r)
3066         AC_TRY_COMPILE([
3067                 #include <dirent.h>
3068         ], [
3069                 DIR* dir;
3070                 struct dirent* entry;
3071                 struct dirent* result;
3072                 readdir_r(dir, entry, &result);
3073         ],[
3074                 AC_MSG_RESULT(yes)
3075                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3076         ], [
3077                 AC_MSG_RESULT(no)
3078         ])
3080         AC_MSG_CHECKING(for kevent with void *data)
3081         AC_TRY_COMPILE([
3082                 #include <sys/types.h>
3083                 #include <sys/event.h>
3084         ], [
3085                 struct kevent event;
3086                 void* data;
3087                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3088         ],[
3089                 AC_MSG_RESULT(yes)
3090                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3091         ], [
3092                 AC_MSG_RESULT(no)
3093         ])
3095         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3096         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3098         AC_MSG_CHECKING(for sendfile with 4 arguments)
3099         AC_TRY_COMPILE([
3100                 #include <sys/sendfile.h>
3101         ], [
3102                 int result = sendfile(0, 0, 0, 0);
3103         ],[
3104                 AC_MSG_RESULT(yes)
3105                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3106         ], [
3107                 AC_MSG_RESULT(no)
3108         ])
3110         AC_MSG_CHECKING(for sendfile with 6 arguments)
3111         AC_TRY_LINK([
3112                 #include <stdlib.h>
3113                 #include <sys/types.h>
3114                 #include <sys/socket.h>
3115                 #include <sys/uio.h>
3116         ], [
3117                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3118         ],[
3119                 AC_MSG_RESULT(yes)
3120                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3121         ], [
3122                 AC_MSG_RESULT(no)
3123         ])
3125         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3126         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3127         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3128         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3130         ORIG_CFLAGS="$CFLAGS"
3131         CFLAGS="-Werror -Wsign-conversion"
3133         AC_MSG_CHECKING(for getnameinfo with signed flags)
3134         AC_TRY_COMPILE([
3135                 #include <sys/types.h>
3136                 #include <netdb.h>
3137         ], [
3138                 const struct sockaddr *addr;
3139                 socklen_t addrlen;
3140                 char *host;
3141                 socklen_t hostlen;
3142                 char *serv;
3143                 socklen_t servlen;
3144                 int flags;
3145                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3146         ],[
3147                 AC_MSG_RESULT(yes)
3148                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3149         ], [
3150                 AC_MSG_RESULT(no)
3151         ])
3153         CFLAGS="$ORIG_CFLAGS"
3155         if test "x$host_linux" = "xyes"; then
3156                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3157         else
3158                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3159         fi
3161         ORIG_CFLAGS="$CFLAGS"
3162         CFLAGS="-Werror -Wsign-conversion"
3164         AC_MSG_CHECKING(for bind with unsigned addrlen)
3165         AC_TRY_COMPILE([
3166                 #include <sys/socket.h>
3167         ], [
3168                 int fd;
3169                 struct sockaddr* addr;
3170                 socklen_t addrLen;
3171                 bind(fd, addr, addrLen);
3172         ],[
3173                 AC_MSG_RESULT(yes)
3174                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3175         ], [
3176                 AC_MSG_RESULT(no)
3177         ])
3179         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3180         AC_TRY_COMPILE([
3181                 #include <netinet/in.h>
3182                 #include <netinet/tcp.h>
3183         ], [
3184                 struct ipv6_mreq opt;
3185                 unsigned int index = 0;
3186                 opt.ipv6mr_interface = index;
3187         ],[
3188                 AC_MSG_RESULT(yes)
3189                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3190         ], [
3191                 AC_MSG_RESULT(no)
3192         ])
3194         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3195         AC_TRY_COMPILE([
3196                 #include <sys/inotify.h>
3197         ], [
3198                 intptr_t fd;
3199                 uint32_t wd;
3200                 int result = inotify_rm_watch(fd, wd);
3201         ],[
3202                 AC_MSG_RESULT(yes)
3203                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3204         ], [
3205                 AC_MSG_RESULT(no)
3206         ])
3208         CFLAGS="$ORIG_CFLAGS"
3210         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3211         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3212                 AC_MSG_RESULT(no)
3213         else
3214                 AC_TRY_RUN([
3215                         #include <sys/mman.h>
3216                         #include <fcntl.h>
3217                         #include <unistd.h>
3219                         int main ()
3220                         {
3221                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3222                                 if (fd == -1)
3223                                         return -1;
3225                                 shm_unlink("/mono_configure_shm_open");
3227                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3228                                 //       on at least the current version of Mac OS X
3230                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3231                                         return -1;
3233                                 return 0;
3234                         }
3235                 ],[
3236                         AC_MSG_RESULT(yes)
3237                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3238                 ], [
3239                         AC_MSG_RESULT(no)
3240                 ])
3241         fi
3243         AC_MSG_CHECKING(for getpriority with int who)
3244         AC_TRY_COMPILE([
3245                 #include <sys/resource.h>
3246         ], [
3247                 int which;
3248                 int who;
3249                 int result = getpriority(which, who);
3250         ],[
3251                 AC_MSG_RESULT(yes)
3252                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3253         ], [
3254                 AC_MSG_RESULT(no)
3255         ])
3257         AC_MSG_CHECKING(for kevent with int parameters)
3258         AC_TRY_COMPILE([
3259                 #include <sys/types.h>
3260                 #include <sys/event.h>
3261         ], [
3262                 int kg;
3263                 const struct kevent* chagelist;
3264                 int nchanges;
3265                 struct kevent* eventlist;
3266                 int nevents;
3267                 const struct timespec* timeout;
3268                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3269         ],[
3270                 AC_MSG_RESULT(yes)
3271                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3272         ], [
3273                 AC_MSG_RESULT(no)
3274         ])
3276         ORIG_CFLAGS="$CFLAGS"
3277         CFLAGS="-Werror -Wimplicit-function-declaration"
3279         AC_MSG_CHECKING(for mkstemps)
3280         AC_TRY_COMPILE([
3281                 #include <stdlib.h>
3282                 #include <unistd.h>
3283                 #include <string.h>
3284         ], [
3285                 char *template;
3286                 int suffixlen;
3287                 int result = mkstemps(template, suffixlen);
3288         ],[
3289                 AC_MSG_RESULT(yes)
3290                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3291                 have_mkstemps=yes
3292         ], [
3293                 AC_MSG_RESULT(no)
3294         ])
3296         CFLAGS="$ORIG_CFLAGS"
3298         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3299                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3300         fi
3302         AC_MSG_CHECKING(for tcp/var.h)
3303         AC_TRY_COMPILE([
3304                 #include <sys/types.h>
3305                 #include <sys/socketvar.h>
3306                 #include <netinet/ip.h>
3307                 #include <netinet/tcp.h>
3308                 #include <netinet/tcp_var.h>
3309         ], [
3310         ],[
3311                 AC_MSG_RESULT(yes)
3312                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3313         ], [
3314                 AC_MSG_RESULT(no)
3315         ])
3317         AC_CHECK_HEADERS([sys/cdefs.h])
3319         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3320         AC_TRY_COMPILE([
3321                 #ifdef HAVE_SYS_CDEFS_H
3322                 #include <sys/cdefs.h>
3323                 #endif
3324                 #include <netinet/tcp.h>
3325         ], [
3326                 int result = TCP_ESTABLISHED;
3327         ],[
3328                 AC_MSG_RESULT(yes)
3329                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3330         ], [
3331                 AC_MSG_RESULT(no)
3332         ])
3334         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3336         AC_MSG_CHECKING(for struct rt_msghdr)
3337         AC_TRY_COMPILE([
3338                 #include <sys/types.h>
3339                 #include <net/route.h>
3340         ], [
3341                 struct rt_msghdr;
3342         ],[
3343                 AC_MSG_RESULT(yes)
3344                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3345         ], [
3346                 AC_MSG_RESULT(no)
3347         ])
3349         AC_CHECK_HEADERS([sys/sysctl.h])
3350         AC_CHECK_HEADERS([linux/rtnetlink.h])
3352         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3353         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3354         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3356         ORIG_CFLAGS="$CFLAGS"
3357         CFLAGS="-Werror -Weverything"
3359         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3360         AC_TRY_COMPILE([
3361                 #include <unistd.h>
3362         ], [
3363                 size_t namelen = 20;
3364                 char name[20];
3365                 int result = getdomainname(name, namelen);
3366         ],[
3367                 AC_MSG_RESULT(yes)
3368                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3369         ], [
3370                 AC_MSG_RESULT(no)
3371         ])
3373         CFLAGS="$ORIG_CFLAGS"
3375         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3376         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3377         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3379         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
3380                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3381         elif test "x$host_linux" = "xyes"; then
3382                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3383         fi
3385         AC_CHECK_HEADERS([crt_externs.h])
3387         AC_MSG_CHECKING(for _NSGetEnviron)
3388         AC_TRY_COMPILE([
3389                 #include <crt_externs.h>
3390         ], [
3391                 char **result = *(_NSGetEnviron());
3392         ],[
3393                 AC_MSG_RESULT(yes)
3394                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3395         ], [
3396                 AC_MSG_RESULT(no)
3397         ])
3399         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3401 else
3402         dnl *********************************
3403         dnl *** Checks for Windows compilation ***
3404         dnl *********************************
3405         AC_CHECK_HEADERS(winternl.h)
3407         jdk_headers_found=no
3408         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3409         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3410         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3411         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3412         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3413         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3414         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3416         dnl *********************************
3417         dnl *** Check for struct ip_mreqn ***
3418         dnl *********************************
3419         AC_MSG_CHECKING(for struct ip_mreqn)
3420         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3421                 struct ip_mreqn mreq;
3422                 mreq.imr_address.s_addr = 0;
3423         ], [
3424                 # Yes, we have it...
3425                 AC_MSG_RESULT(yes)
3426                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3427         ], [
3428                 # We'll just have to try and use struct ip_mreq
3429                 AC_MSG_RESULT(no)
3430                 AC_MSG_CHECKING(for struct ip_mreq)
3431                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3432                         struct ip_mreq mreq;
3433                         mreq.imr_interface.s_addr = 0;
3434                 ], [
3435                         # Yes, we have it...
3436                         AC_MSG_RESULT(yes)
3437                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3438                 ], [
3439                         # No multicast support
3440                         AC_MSG_RESULT(no)
3441                 ])
3442         ])
3444         dnl **********************************
3445         dnl *** Check for getaddrinfo ***
3446         dnl **********************************
3447         AC_MSG_CHECKING(for getaddrinfo)
3448                 AC_TRY_LINK([
3449                 #include <stdio.h>
3450                 #include <winsock2.h>
3451                 #include <ws2tcpip.h>
3452         ], [
3453                 getaddrinfo(NULL,NULL,NULL,NULL);
3454         ], [
3455                 # Yes, we have it...
3456                 AC_MSG_RESULT(yes)
3457                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3458         ], [
3459                 AC_MSG_RESULT(no)
3460         ])
3462         dnl **********************************
3463         dnl *** Check for gethostbyname ***
3464         dnl **********************************
3465         AC_MSG_CHECKING(for gethostbyname)
3466                 AC_TRY_LINK([
3467                 #include <stdio.h>
3468                 #include <winsock2.h>
3469                 #include <ws2tcpip.h>
3470         ], [
3471                 gethostbyname(NULL);
3472         ], [
3473                 # Yes, we have it...
3474                 AC_MSG_RESULT(yes)
3475                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3476         ], [
3477                 AC_MSG_RESULT(no)
3478         ])
3480         dnl **********************************
3481         dnl *** Check for getprotobyname ***
3482         dnl **********************************
3483         AC_MSG_CHECKING(for getprotobyname)
3484                 AC_TRY_LINK([
3485                 #include <stdio.h>
3486                 #include <winsock2.h>
3487                 #include <ws2tcpip.h>
3488         ], [
3489                 getprotobyname(NULL);
3490         ], [
3491                 # Yes, we have it...
3492                 AC_MSG_RESULT(yes)
3493                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3494         ], [
3495                 AC_MSG_RESULT(no)
3496         ])
3498         dnl **********************************
3499         dnl *** Check for getnameinfo ***
3500         dnl **********************************
3501         AC_MSG_CHECKING(for getnameinfo)
3502                 AC_TRY_LINK([
3503                 #include <stdio.h>
3504                 #include <winsock2.h>
3505                 #include <ws2tcpip.h>
3506         ], [
3507                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3508         ], [
3509                 # Yes, we have it...
3510                 AC_MSG_RESULT(yes)
3511                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3512         ], [
3513                 AC_MSG_RESULT(no)
3514         ])
3516         dnl **********************************
3517         dnl *** Check for inet_ntop ***
3518         dnl **********************************
3519         AC_MSG_CHECKING(for inet_ntop)
3520                 AC_TRY_LINK([
3521                 #include <stdio.h>
3522                 #include <winsock2.h>
3523                 #include <ws2tcpip.h>
3524         ], [
3525                 inet_ntop (0, NULL, NULL, 0);
3526         ], [
3527                 # Yes, we have it...
3528                 AC_MSG_RESULT(yes)
3529                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3530         ], [
3531                 AC_MSG_RESULT(no)
3532         ])
3534         dnl **********************************
3535         dnl *** Check for inet_pton ***
3536         dnl **********************************
3537         AC_MSG_CHECKING(for inet_pton)
3538                 AC_TRY_LINK([
3539                 #include <stdio.h>
3540                 #include <winsock2.h>
3541                 #include <ws2tcpip.h>
3542         ], [
3543                 #ifndef inet_pton
3544                 (void) inet_pton;
3545                 #endif
3546                 inet_pton (0, NULL, NULL);
3547         ], [
3548                 # Yes, we have it...
3549                 AC_MSG_RESULT(yes)
3550                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3551         ], [
3552                 AC_MSG_RESULT(no)
3553         ])
3555         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3556         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3557         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3558         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3559         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3560         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3561         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3564 dnl socklen_t check
3565 AC_MSG_CHECKING(for socklen_t)
3566 AC_TRY_COMPILE([
3567 #include <sys/types.h>
3568 #include <sys/socket.h>
3570   socklen_t foo;
3572 ac_cv_c_socklen_t=yes
3573         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3574         AC_MSG_RESULT(yes)
3576         AC_MSG_RESULT(no)
3579 AC_MSG_CHECKING(for array element initializer support)
3580 AC_TRY_COMPILE([#include <sys/socket.h>], [
3581         const int array[] = {[1] = 2,};
3582 ], [
3583         # Yes, we have it...
3584         AC_MSG_RESULT(yes)
3585         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
3586 ], [
3587         # We'll have to use signals
3588         AC_MSG_RESULT(no)
3591 AC_CHECK_FUNCS(execvp)
3593 dnl ****************************
3594 dnl *** Look for /dev/random ***
3595 dnl ****************************
3597 AC_MSG_CHECKING([if usage of random device is requested])
3598 AC_ARG_ENABLE(dev-random,
3599 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3600 try_dev_random=$enableval, try_dev_random=yes)
3602 AC_MSG_RESULT($try_dev_random)
3604 case "{$build}" in
3606 dnl IBM i does not have /dev/random, use unblocking only
3608     *-*-os400*)
3609     NAME_DEV_RANDOM="/dev/urandom"
3610     ;;
3612 dnl Win32 does not have /dev/random, they have their own method...
3614     *-mingw*|*-*-cygwin*)
3615     ac_cv_have_dev_random=no
3616     ;;
3618 dnl Everywhere else, it's /dev/random
3620     *)
3621     NAME_DEV_RANDOM="/dev/random"
3622     ;;
3623 esac
3625 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3627 dnl Now check if the device actually exists
3629 if test "x$try_dev_random" = "xyes"; then
3630     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3631     [if test -r "$NAME_DEV_RANDOM" ; then
3632         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3633     if test "x$ac_cv_have_dev_random" = "xyes"; then
3634         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3635     fi
3636 else
3637     AC_MSG_CHECKING(for random device)
3638     ac_cv_have_dev_random=no
3639     AC_MSG_RESULT(has been disabled)
3642 if test "x$host_win32" = "xyes"; then
3643     AC_DEFINE(HAVE_CRYPT_RNG)
3646 if test "x$ac_cv_have_dev_random" = "xno" \
3647     && test "x$host_win32" = "xno"; then
3648     AC_MSG_WARN([[
3650 *** A system-provided entropy source was not found on this system.
3651 *** Because of this, the System.Security.Cryptography random number generator
3652 *** will throw a NotImplemented exception.
3654 *** If you are seeing this message, and you know your system DOES have an
3655 *** entropy collection in place, please report an issue on GitHub and
3656 *** provide information about the system and how to access the random device.
3658 *** Otherwise you can install either egd or prngd and set the environment
3659 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3660 ***]])
3663 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)
3665 AC_MSG_CHECKING([if big-arrays are to be enabled])
3666 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)
3667 if test "x$enable_big_arrays" = "xyes" ; then
3668     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3669         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3670     else
3671         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3672     fi
3674 AC_MSG_RESULT($enable_big_arrays)
3676 dnl **************
3677 dnl *** DTRACE ***
3678 dnl **************
3680 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3682 if test "x$enable_dtrace" = "xyes"; then
3683    if test "x$has_dtrace" = "xno"; then
3684           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3685    fi
3686    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3687    if test "x$DTRACE" = "xno"; then
3688           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3689           enable_dtrace=no
3690    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3691           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3692           enable_dtrace=no
3693    fi
3696 dtrace_g=no
3697 if test "x$enable_dtrace" = "xyes"; then
3698         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3699         DTRACEFLAGS=
3700         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3701                 case "$host" in
3702                         powerpc-*-darwin*)
3703                         DTRACEFLAGS="-arch ppc64"
3704                         ;;
3705                         i*86-*-darwin*)
3706                         DTRACEFLAGS="-arch x86_64"
3707                         ;;
3708                         *)
3709                         DTRACEFLAGS=-64
3710                         ;;
3711                 esac
3712         else
3713                 case "$host" in
3714                         powerpc-*-darwin*)
3715                         DTRACEFLAGS="-arch ppc"
3716                         ;;
3717                         i*86-*-darwin*)
3718                         DTRACEFLAGS="-arch i386"
3719                         ;;
3720                         *)
3721                         DTRACEFLAGS=-32
3722                         ;;
3723                 esac
3724         fi
3725         AC_SUBST(DTRACEFLAGS)
3726         case "$host" in
3727                 *-*-solaris*)
3728                 dtrace_g=yes
3729                 ;;
3730         esac
3731         AC_CHECK_HEADERS([sys/sdt.h])
3733 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3734 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3736 dnl **************************
3737 dnl *** AOT cross offsets  ***
3738 dnl **************************
3740 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3741     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3743 dnl **************
3744 dnl ***  LLVM  ***
3745 dnl **************
3747 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3748 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3749 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)
3750 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3751 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3753 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3755 if test "x$enable_llvm" = "xdefault"; then
3756    enable_llvm=$enable_llvm_default
3759 internal_llvm="no"
3760 if test "x$enable_llvm" = "xyes"; then
3761         if test "x$with_llvm" != "x"; then
3762                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3763                 if test x$host_win32 = xyes; then
3764                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3765                 fi
3766                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3767                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3768                 fi
3769         else
3770                 if test x$host_win32 = xyes; then
3771                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3772                 else
3773                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3774                 fi
3775                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3776                         internal_llvm=yes
3777                 fi
3778         fi
3780         LLVM_CODEGEN_LIBS="x86codegen"
3781         case "$target" in
3782         arm*)
3783                 LLVM_CODEGEN_LIBS="armcodegen"
3784                 ;;
3785         aarch64*)
3786                 LLVM_CODEGEN_LIBS="aarch64codegen"
3787                 ;;
3788         powerpc*)
3789                 LLVM_CODEGEN_LIBS="powerpccodegen"
3790                 ;;
3791         esac
3792         if test "x$host" != "x$target"; then
3793                 # No need for jit libs
3794                 LLVM_CODEGEN_LIBS=
3795         fi
3797         AC_SUBST(LLVM_CODEGEN_LIBS)
3798         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3799         
3800         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3801 fi # ENABLE_LLVM
3803 # AC_DEFINE necessary for correct restore behavior on Linux
3804 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3805 if test "x$internal_llvm" != "xno"; then
3806    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3809 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3810 if test "x$enable_llvm_asserts" != "xno"; then
3811    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3814 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3816 if test "x$enable_loadedllvm" = "xyes"; then
3817    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3819 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3821 if test "x$enable_llvm" = "xyes"; then
3822    enable_llvm_runtime=yes
3824 if test "x$enable_llvm_runtime" = "xyes"; then
3825    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3827 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3829 TARGET="unknown"
3830 ACCESS_UNALIGNED="yes"
3832 LIBC="libc.so.6"
3833 INTL="libc.so.6"
3834 SQLITE="libsqlite.so.0"
3835 SQLITE3="libsqlite3.so.0"
3836 X11="libX11.so"
3837 GDKX11="libgdk-x11-2.0.so.0"
3838 GTKX11="libgtk-x11-2.0.so.0"
3839 XINERAMA="libXinerama.so.1"
3841 sizeof_register="SIZEOF_VOID_P"
3843 jit_wanted=true
3844 boehm_supported=true
3845 BTLS_SUPPORTED=no
3846 BTLS_PLATFORM=
3848 case "$host" in
3849         wasm32*)
3850                 TARGET=WASM
3851                 arch_target=wasm
3852                 BTLS_SUPPORTED=no
3853                 ACCESS_UNALIGNED="no"
3854                 with_tls=pthread
3855                 ;;
3856         mips*)
3857                 TARGET=MIPS;
3858                 arch_target=mips;
3859                 with_tls=pthread;
3860                 ACCESS_UNALIGNED="no"
3862                 AC_MSG_CHECKING(for mips n32)
3863                 AC_TRY_COMPILE([],[
3864                 #if _MIPS_SIM != _ABIN32
3865                 #error Not mips n32
3866                 #endif
3867                 ],[
3868                 AC_MSG_RESULT(yes)
3869                 sizeof_register=8
3870                 ],[
3871                 AC_MSG_RESULT(no)
3872                 ])
3873                 ;;
3874         i*86-*-*)
3875                 TARGET=X86;
3876                 arch_target=x86;
3877                 case $host_os in
3878                   solaris*)
3879                         LIBC="libc.so"
3880                         INTL="libintl.so"
3881                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3882                                 TARGET=AMD64
3883                                 arch_target=amd64
3884                         fi
3886                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3887                         # int astruct __attribute__ ((visibility ("hidden")));
3888                         # void foo ()
3889                         # {
3890                         #       void *p = &astruct;
3891                         # }
3892                         # gcc -fPIC --shared -o libfoo.so foo.c
3893                         # yields:
3894                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3895                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3896                         have_visibility_hidden=no
3897                         ;;
3898                   mingw*|cygwin*)
3899                         have_visibility_hidden=no                 
3900                         ;;
3901                   haiku*)
3902                         LIBC=libroot.so
3903                         ;;
3904                   linux*)
3905                         AOT_SUPPORTED="yes"
3906                         BTLS_SUPPORTED=yes
3907                         BTLS_PLATFORM=i386
3908                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3909                         ;;
3910                   darwin*)
3911                         AOT_SUPPORTED="yes"
3912                         BTLS_SUPPORTED=yes
3913                         BTLS_PLATFORM=i386
3914                         ;;
3915                   openbsd*|freebsd*|kfreebsd-gnu*)
3916                         AOT_SUPPORTED="yes"
3917                         BTLS_SUPPORTED=yes
3918                         BTLS_PLATFORM=i386
3919                         ;;
3920                 esac
3921                 ;;
3922         x86_64-*-* | amd64-*-*)
3923                 TARGET=AMD64;
3924                 arch_target=amd64;
3925                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3926                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3927                         sizeof_register=8
3928                 fi
3929                 case $host_os in
3930                   linux*)
3931                         AOT_SUPPORTED="yes"
3932                         BTLS_SUPPORTED=yes
3933                         BTLS_PLATFORM=x86_64
3934                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3935                         ;;
3936                   darwin*)
3937                         AOT_SUPPORTED="yes"
3938                         BTLS_SUPPORTED=yes
3939                         BTLS_PLATFORM=x86_64
3940                         boehm_supported=false
3941                         ;;
3942                   openbsd*|freebsd*|kfreebsd-gnu*)
3943                         AOT_SUPPORTED="yes"
3944                         BTLS_SUPPORTED=yes
3945                         BTLS_PLATFORM=x86_64
3946                         ;;
3947                   mingw*)
3948                         ;;
3949                 esac
3950                 ;;
3951         sparc*-*-*)
3952                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3953                    TARGET=SPARC64
3954                 else
3955                         TARGET=SPARC
3956                 fi
3957                 arch_target=sparc;
3958                 ACCESS_UNALIGNED="no"
3959                 case $host_os in
3960                   linux*) ;;
3961                   *)
3962                         LIBC="libc.so"
3963                         INTL="libintl.so"
3964                 esac
3965                 if test x"$GCC" = xyes; then
3966                         # We don't support v8 cpus
3967                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3968                 fi
3969                 if test x"$AR" = xfalse; then
3970                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3971                 fi
3972                 ;;
3973         *-mingw*|*-*-cygwin*)
3974                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3975                 have_visibility_hidden=no
3976                 INTL="intl"
3977                 ;;
3978         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3979         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3980         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
3981                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3982                         TARGET=POWERPC64;
3983                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3984                         if ! (echo $CC | grep -q -- 'clang'); then
3985                                 CFLAGS="$CFLAGS -mminimal-toc"
3986                         fi
3987                 else
3988                         TARGET=POWERPC;
3989                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3990                 fi
3991                 arch_target=ppc;
3992                 case $host_os in
3993                   aix*|os400*)
3994                         BTLS_SUPPORTED=yes
3995                         BTLS_PLATFORM=powerpc
3996                         dnl on AIX/PASE, shared libraries can be inside archives
3997                         dnl if they are, we specify them by lib.a(lib.so)
3998                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
3999                         LIBC="libc.a(shr_64.o)"
4000                         INTL="libintl.a(libintl.so.8)"
4001                         ;;
4002                   linux*)
4003                         BTLS_SUPPORTED=yes
4004                         BTLS_PLATFORM=powerpc
4005                         ;;
4006                 esac
4007                 ;;
4008         armv7k-*-darwin*)
4009                 TARGET=ARM;
4010                 TARGET_SYS=WATCHOS
4011                 arch_target=arm;
4012                 arm_fpu=VFP_HARD
4013                 ACCESS_UNALIGNED="no"
4014                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4015                 ;;
4017         arm*-darwin*)
4018                 TARGET=ARM;
4019                 arch_target=arm;
4020                 ACCESS_UNALIGNED="no"
4021                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4022                 ;;
4023         arm*-linux*)
4024                 TARGET=ARM;
4025                 arch_target=arm;
4026                 ACCESS_UNALIGNED="no"
4027                 AOT_SUPPORTED="yes"
4028                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4029                 BTLS_SUPPORTED=yes
4030                 BTLS_PLATFORM=arm
4031                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4032                 case "$target" in
4033                 arm*-linux*-gnueabi)
4034                         BTLS_PLATFORM=armsoft
4035                         ;;
4036                 esac
4037                 ;;
4038         arm*-netbsd*-eabi*)
4039                 TARGET=ARM;
4040                 arch_target=arm;
4041                 ACCESS_UNALIGNED="no"
4042                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4043                 ;;
4044         aarch64-*)
4045                 # https://lkml.org/lkml/2012/7/15/133
4046                 TARGET=ARM64
4047                 arch_target=arm64
4048                 boehm_supported=false
4049                 AOT_SUPPORTED="yes"
4050                 BTLS_SUPPORTED=yes
4051                 BTLS_PLATFORM=aarch64
4052                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4053                 ;;
4054         s390x-*-linux*)
4055                 TARGET=S390X;
4056                 arch_target=s390x;
4057                 ACCESS_UNALIGNED="yes"
4058                 BTLS_SUPPORTED=yes
4059                 BTLS_PLATFORM=s390x
4060                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4061                 ;;
4062 esac
4064 HOST=$TARGET
4066 if test "x$host" != "x$target"; then
4067    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4068    enable_mcs_build=no
4069    enable_support_build=no
4070    BTLS_SUPPORTED=no
4071    # Can't use tls, since it depends on the runtime detection of tls offsets
4072    # in mono-compiler.h
4073    with_tls=pthread
4074    target_mach=no
4075    case "$target" in
4076    wasm32*)
4077                 TARGET=WASM
4078                 arch_target=wasm
4079                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4080                 ;;
4081    arm*-darwin*)
4082                 TARGET=ARM;
4083                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4084                 case "$target" in
4085                 armv7k-*)
4086                         arm_fpu=VFP_HARD
4087                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4088                         ;;
4089                 esac            
4090                 ;;
4091    powerpc64-ps3-linux-gnu)
4092                 TARGET=POWERPC64
4093                 arch_target=powerpc64
4094                 AC_DEFINE(TARGET_PS3, 1, [...])
4095                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4096                 # uses this define
4097                 AC_DEFINE(__mono_ppc64__, 1, [...])
4098                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
4099                 sizeof_register=8
4100                 target_byte_order=G_BIG_ENDIAN
4101                 ;;
4102    powerpc64-xbox360-linux-gnu)
4103                 TARGET=POWERPC64
4104                 arch_target=powerpc64
4105                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4106                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4107                 # uses this define
4108                 sizeof_register=8
4109                 target_byte_order=G_BIG_ENDIAN
4110                 ;;
4111    arm*-linux-*)
4112                 TARGET=ARM;
4113                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4114                 ;;
4115    arm*-netbsd*-eabi*)
4116                 TARGET=ARM;
4117                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4118                 ;;
4119    i686*-linux-*)
4120                 TARGET=X86;
4121                 ;;
4122    i*86-apple-*)
4123                 TARGET=X86;
4124                 ;;
4125    x86_64*-linux-*)
4126                 TARGET=AMD64;
4127                 ;;
4128    x86_64-ps4-freebsd)
4129                 TARGET=AMD64;
4130                 AC_DEFINE(TARGET_PS4, 1, [...])
4131                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4132                 CPPFLAGS="$CPPFLAGS"
4133                 target_win32=no
4134                 ;;
4135    aarch64*-linux-*)
4136                 TARGET=ARM64;
4137                 ;;
4138         aarch64-*)
4139                 TARGET=ARM64
4140                 ;;
4141         *)
4142                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4143         esac
4145         case "$target" in
4146         *-darwin*)
4147                 target_mach=yes
4148                 ;;
4149         *-linux-android*)
4150                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4151                 ;;
4152         esac
4155 case "$TARGET" in
4156 WASM)
4157         AC_DEFINE(TARGET_WASM, 1, [...])
4158         arch_target=wasm
4159         target_sizeof_void_p=4
4160         ;;
4161 X86)
4162         AC_DEFINE(TARGET_X86, 1, [...])
4163         arch_target=x86
4164         target_sizeof_void_p=4
4165         ;;
4166 AMD64)
4167         AC_DEFINE(TARGET_AMD64, 1, [...])
4168         arch_target=amd64
4169         ;;
4170 ARM)
4171         AC_DEFINE(TARGET_ARM, 1, [...])
4172         arch_target=arm
4173         ACCESS_UNALIGNED="no"
4174         target_sizeof_void_p=4
4175         ;;
4176 ARM64)
4177         AC_DEFINE(TARGET_ARM64, 1, [...])
4178         arch_target=arm64
4179         ;;
4180 POWERPC)
4181         AC_DEFINE(TARGET_POWERPC, 1, [...])
4182         ;;
4183 POWERPC64)
4184         AC_DEFINE(TARGET_POWERPC, 1, [...])
4185         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4186         ;;
4187 S390X)
4188         AC_DEFINE(TARGET_S390X, 1, [...])
4189         ;;
4190 MIPS)
4191         AC_DEFINE(TARGET_MIPS, 1, [...])
4192         ;;
4193 SPARC)
4194         AC_DEFINE(TARGET_SPARC, 1, [...])
4195         ;;
4196 SPARC64)
4197         AC_DEFINE(TARGET_SPARC64, 1, [...])
4198         ;;
4199 esac
4201 case "$HOST" in
4202 WASM)
4203         AC_DEFINE(HOST_WASM, 1, [...])
4204         ;;
4205 X86)
4206         AC_DEFINE(HOST_X86, 1, [...])
4207         ;;
4208 AMD64)
4209         AC_DEFINE(HOST_AMD64, 1, [...])
4210         ;;
4211 ARM)
4212         AC_DEFINE(HOST_ARM, 1, [...])
4213         ;;
4214 ARM64)
4215         AC_DEFINE(HOST_ARM64, 1, [...])
4216         ;;
4217 POWERPC)
4218         AC_DEFINE(HOST_POWERPC, 1, [...])
4219         ;;
4220 POWERPC64)
4221         AC_DEFINE(HOST_POWERPC, 1, [...])
4222         AC_DEFINE(HOST_POWERPC64, 1, [...])
4223         ;;
4224 S390X)
4225         AC_DEFINE(HOST_S390X, 1, [...])
4226         ;;
4227 MIPS)
4228         AC_DEFINE(HOST_MIPS, 1, [...])
4229         ;;
4230 SPARC)
4231         AC_DEFINE(HOST_SPARC, 1, [...])
4232         ;;
4233 SPARC64)
4234         AC_DEFINE(HOST_SPARC64, 1, [...])
4235         ;;
4236 esac
4238 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4239 case "$HOST" in
4240 X86 | AMD64 | ARM | ARM64)
4241         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4242         ;;
4243 esac
4245 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4246 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4248 dnl *************
4249 dnl *** VTUNE ***
4250 dnl *************
4252 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4253 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4255 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4257 if test "x$enable_vtune" = "xyes"; then
4258         if test "x$with_vtune" = "x"; then
4259                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4260         else
4261                 VTUNE_PATH=$with_vtune
4262         fi
4263         VTUNE_INCLUDE=$VTUNE_PATH/include
4264         case "$TARGET" in
4265         X86)
4266                 VTUNE_LIB=$VTUNE_PATH/lib32
4267                 ;;
4268         AMD64)
4269                 VTUNE_LIB=$VTUNE_PATH/lib64
4270                 ;;
4271         *)
4272                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4273                 ;;
4274         esac
4275         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4276                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4277         fi
4278         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4279                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4280         fi
4282         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4283         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4285         AC_SUBST(VTUNE_LIBS)
4286         AC_SUBST(VTUNE_CFLAGS)
4288 dnl Use GCC atomic ops if they work on the target.
4289 if test x$GCC = "xyes"; then
4290         case $TARGET in
4291         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
4292                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4293                 ;;
4294         esac
4297 if test "x$target_mach" = "xyes"; then
4299    if test "x$TARGET_SYS" = "xWATCHOS"; then
4300           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4301           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4302           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4303           BTLS_SUPPORTED=no
4304    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4305           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4306           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4307           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4308           BTLS_SUPPORTED=no
4309    else
4310        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4311        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4312        #error fail this for ios
4313        #endif
4314        ], [
4315                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4316           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4317           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4318           target_osx=yes
4319        ], [
4320           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4321           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4322           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4323           BTLS_SUPPORTED=no
4324                   target_ios=yes
4325        ])
4326         fi
4327    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4330 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4332 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4334 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4335    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4336 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4337    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4338 else
4339    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4342 if test "x$target_sizeof_void_p" != "x"; then
4343    AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4344    # This is true for all the current cross-compiling targets
4345    AC_DEFINE(SIZEOF_REGISTER,TARGET_SIZEOF_VOID_P,[size of target machine integer registers])
4346 else
4347    AC_DEFINE(TARGET_SIZEOF_VOID_P,SIZEOF_VOID_P,[wordsize of target])
4348    if test "x$sizeof_register" = "x4"; then
4349       AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4350    elif test "x$sizeof_register" = "x8"; then
4351       AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4352    else
4353       AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of target machine integer registers])
4354    fi
4357 if test "x$have_visibility_hidden" = "xyes"; then
4358    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4361 if test "x$have_deprecated" = "xyes"; then
4362    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4365 dnl 
4366 dnl Simple Generational checks (sgen)
4368 SGEN_DEFINES=
4369 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4370 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4371 if test x$buildsgen = xyes; then
4372    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4373    SGEN_DEFINES="-DHAVE_SGEN_GC"
4375         conc_gc_msg=""
4376    if test x$with_sgen_default_concurrent != xno; then
4377        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4378            conc_gc_msg=" (concurrent by default)"
4379    fi
4381    if test "x$gc_msg" = "x"; then
4382       gc_msg="sgen$conc_gc_msg"
4383    else
4384       gc_msg="sgen$conc_gc_msg and $gc_msg"
4385    fi
4387 AC_SUBST(SGEN_DEFINES)
4388 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4390 jit_status="Building and using the JIT"
4392 libsuffix=".so"
4394 case "$host" in
4395      *-*-darwin*)
4396         libsuffix=".dylib"
4397         LIBC="libc.dylib"
4398         INTL="libintl.dylib"
4399         SQLITE="libsqlite.0.dylib"
4400         SQLITE3="libsqlite3.0.dylib"
4401         X11="libX11.dylib"
4402         GDKX11="libgdk-x11-2.0.dylib"
4403         GTKX11="libgtk-x11-2.0.dylib"
4404         ;;
4405      *-*-*netbsd*)
4406         LIBC="libc.so"
4407         INTL="libintl.so"
4408         SQLITE="libsqlite.so"
4409         SQLITE3="libsqlite3.so"
4410         ;;
4411      *-*-kfreebsd*-gnu)
4412         LIBC="libc.so.0.1"
4413         INTL="libc.so.0.1"
4414         X11="libX11.so.6"
4415         ;;
4416     *-*-*freebsd*)
4417         LIBC="libc.so.7"
4418         INTL="libintl.so"
4419         SQLITE="libsqlite.so"
4420         SQLITE3="libsqlite3.so"
4421         ;;
4422     *-*-*openbsd*)
4423         LIBC="libc.so"
4424         INTL="libintl.so"
4425         SQLITE="libsqlite.so"
4426         SQLITE3="libsqlite3.so"
4427         ;;
4428     *-*-*linux*)
4429         AC_PATH_X
4430         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4431         AC_MSG_CHECKING(for the soname of libX11.so)
4432         for i in $x_libraries $dlsearch_path; do
4433                 for r in 4 5 6; do
4434                         if test -f $i/libX11.so.$r; then
4435                                 X11=libX11.so.$r
4436                                 AC_MSG_RESULT($X11)
4437                         fi
4438                 done
4439         done
4440         
4441         if test "x$X11" = "xlibX11.so"; then
4442                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4443                 X11=libX11.so.6
4444         fi
4445         ;;
4446 esac
4448 AC_SUBST(libsuffix)
4450 ######################################
4451 # EGLIB CHECKS
4452 ######################################
4454 GNUC_PRETTY=
4455 GNUC_UNUSED=
4456 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4457 if test x$GCC = xyes; then
4458    GNUC_UNUSED='__attribute__((__unused__))'
4459    GNUC_NORETURN='__attribute__((__noreturn__))'
4460    case $host_cpu in
4461      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4462    esac
4464 AC_SUBST(GNUC_PRETTY)
4465 AC_SUBST(GNUC_UNUSED)
4466 AC_SUBST(GNUC_NORETURN)
4467 AC_SUBST(BREAKPOINT)
4469 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4471 case $host in
4472 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4473     PATHSEP='\\'
4474     SEARCHSEP=';'
4475     OS="WIN32"
4476     PIDTYPE='void *'
4477     ;;
4479     PATHSEP='/'
4480     SEARCHSEP=':'
4481     OS="UNIX"
4482     PIDTYPE='int'
4483     ;;
4484 esac
4486 case $host in
4487         *-*-solaris*)
4488         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4489         ;;
4490 esac
4492 case $target in
4493 arm*-darwin*|aarch64*-*)
4494     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4495     ;;
4496 i*86-*-darwin*)
4497     ORDER=G_LITTLE_ENDIAN
4498     ;;
4499 *-*-haiku*)
4500     LDFLAGS="$LDFLAGS -ltextencoding"
4501     ;;
4502 *-*-openbsd*)
4503     CFLAGS="$CFLAGS -pthread"
4504     LDFLAGS="$LDFLAGS -pthread"
4505     ;;
4506 esac
4508 AC_SUBST(ORDER)
4509 AC_SUBST(CFLAGS)
4510 AC_SUBST(PATHSEP)
4511 AC_SUBST(SEARCHSEP)
4512 AC_SUBST(OS)
4513 AC_SUBST(PIDTYPE)
4515 # Defined for all targets/platforms using classic Windows API support.
4516 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4517 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4519 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4520 AC_CHECK_FUNCS(getrlimit)
4521 AC_CHECK_FUNCS(fork execv execve)
4523 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4525 if test x$with_overridable_allocators = xyes; then
4526         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4527   AC_MSG_NOTICE([Overridable allocator support enabled])
4528 else
4529   AC_MSG_NOTICE([Overridable allocator support disabled])
4533 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4534 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4535 # removed once support for 10.6 is dropped.
4537 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4539 if test x$target_osx = xyes; then
4540 AC_CHECK_FUNCS(getpwuid_r)
4541 elif test x$target_ios = xno; then
4542 AC_CHECK_FUNCS(strndup getpwuid_r)
4545 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4547 AC_SEARCH_LIBS(sqrtf, m)
4549 # nanosleep may not be part of libc, also search it in other libraries
4550 AC_SEARCH_LIBS(nanosleep, rt)
4552 AC_SEARCH_LIBS(dlopen, dl)
4553 old_ldflags="${LDFLAGS}"
4554 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4555 if test $lt_cv_prog_gnu_ld = yes; then
4556         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4557 else
4558         case $host in
4559         *-*-aix*|*-*-os400*)
4560                 ;;
4561         *)
4562                 dnl Try to use export-dynamic anyways
4563                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4564                 ;;
4565         esac
4567 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4568 if test $found_export_dynamic = no; then
4569         LDFLAGS="${old_ldflags}"
4572 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4573 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4574 AC_CHECK_LIB(iconv, iconv_open)
4575 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4576 AC_SUBST(HAVE_ALLOCA_H)
4578 # Get the exact type of size_t, not just its size.
4579 # This is so we can find an exact printf format among u, lu, llu, I64u.
4580 # To avoid warnings about slight mismatches.
4581 # C99 runtime "zu" dependency is being avoided here.
4583 # We have to compile as C++ because C is too lenient
4584 # and lets the wrong thing compile, with warnings.
4586 # Note: "zu" or ifdef <something> have the advantage
4587 # of producing installable "biarch" headers. i.e. one Mac header
4588 # for Mac/x86 and Mac/amd64.
4590 AC_LANG_PUSH(C++)
4592 # Check long before int because it is the overwhelming Unix answer,
4593 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4595 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4597 AC_MSG_CHECKING(if size_t is unsigned long)
4598 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4599         #include <stddef.h>
4600         unsigned long *a = (size_t*)0;
4601 ])], [
4602         AC_MSG_RESULT(yes)
4603         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4604 ], [
4605         AC_MSG_RESULT(no)
4606         AC_MSG_CHECKING(if size_t is unsigned int)
4607         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4608                 #include <stddef.h>
4609                 unsigned *a = (size_t*)0;
4610         ])], [
4611                 AC_MSG_RESULT(yes)
4612                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4613         ], [
4614 # At this point the majority of systems have their answer,
4615 # and we descend into non-standard or new-standard territory.
4617 # Check __int64 first because I64 on some systems predates ll, enabling
4618 # new compiler/old runtime interop, and the types always have the same size.
4619                 AC_MSG_RESULT(no)
4620                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4621                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4622                         #include <stddef.h>
4623                         unsigned __int64 *a = (size_t*)0;
4624                 ])], [
4625                         AC_MSG_RESULT(yes)
4626                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4627                 ], [
4628                         AC_MSG_RESULT(no)
4629                         AC_MSG_CHECKING(if size_t is unsigned long long)
4630                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4631                                 #include <stddef.h>
4632                                 unsigned long long *a = (size_t*)0;
4633                         ])], [
4634                                 AC_MSG_RESULT(yes)
4635                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4636                         ], [
4637                                 AC_MSG_RESULT(no)
4638                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4639                         ] )
4640                 ] )
4641         ] )
4642 ] )
4644 AC_LANG_POP
4646 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4647 # This provides for an exact match with functions that
4648 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4649 # uintptr_t is not necessarily the same.
4651 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4652 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4654 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4655    GSIZE="size_t"
4656    GSSIZE="ptrdiff_t"
4657 else
4658    GSIZE="uintptr_t"
4659    GSSIZE="intptr_t"
4662 AC_SUBST(GSIZE)
4663 AC_SUBST(GSSIZE)
4664 AC_SUBST(GSIZE_FORMAT)
4667 # END OF EGLIB CHECKS
4670 AC_ARG_WITH([libgdiplus],
4671         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4672         [], [with_libgdiplus=installed])
4674 # default install location
4675 libgdiplus_install_loc=libgdiplus${libsuffix}
4676 case "$host" in
4677     *-*-*linux*)
4678     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4679     ;;
4680 esac
4682 case $with_libgdiplus in
4683     no)
4684     libgdiplus_loc=
4685     ;;
4687     installed)
4688     libgdiplus_loc=
4689     if test x$cross_compiling = xno; then
4690         if test x$host_darwin = xyes; then
4691             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4692             if test -x $a; then
4693               libgdiplus_install_loc=$a
4694               libgdiplus_loc=$a
4695             fi
4696         fi
4697     fi
4698     ;;
4700     yes|sibling)
4701     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4702     ;;
4704     /*) # absolute path, assume it is an install location
4705     libgdiplus_loc=$with_libgdiplus
4706     libgdiplus_install_loc=$with_libgdiplus
4707     ;;
4709     *)
4710     libgdiplus_loc=`pwd`/$with_libgdiplus
4711     ;;
4712 esac
4713 AC_SUBST(libgdiplus_loc)
4714 AC_SUBST(libgdiplus_install_loc)
4716 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)
4717 if test "x$icall_symbol_map" = "xyes"; then
4718    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4721 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4722 if test "x$icall_export" = "xyes"; then
4723    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4726 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4727 if test "x$icall_tables" = "xno"; then
4728    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4731 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4733 if test "x$with_tls" = "x__thread"; then
4734         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4735         # Pass the information to libgc
4736         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4737         AC_MSG_CHECKING(if the tls_model attribute is supported)
4738         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4739                 ], [
4740                         AC_MSG_RESULT(yes)
4741                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4742                 ], [
4743                         AC_MSG_RESULT(no)
4744         ])
4747 if test ${TARGET} = ARM; then
4748         dnl ******************************************
4749         dnl *** Check to see what FPU is available ***
4750         dnl ******************************************
4751         AC_MSG_CHECKING(which FPU to use)
4753         #
4754         # This is a bit tricky:
4755         #
4756         # if (__ARM_PCS_VFP) {
4757         #       /* mfloat-abi=hard == VFP with hard ABI */
4758         # } elif (!__SOFTFP__) {
4759         #       /* mfloat-abi=softfp == VFP with soft ABI */
4760         # } else {
4761         #       /* mfloat-abi=soft == no VFP */
4762         # }
4763         #
4764         # The exception is iOS (w/ GCC) where none of the above
4765         # are defined (but iOS always uses the 'softfp' ABI).
4766         #
4767         # No support for FPA.
4768         #
4770         fpu=NONE
4772         # iOS GCC always uses the 'softfp' ABI.
4773         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4774                 fpu=VFP
4775         fi
4777         # Are we using the 'hard' ABI?
4778         if test x$fpu = xNONE; then
4779                 AC_TRY_COMPILE([], [
4780                         #ifndef __ARM_PCS_VFP
4781                         #error "Float ABI is not 'hard'"
4782                         #endif
4783                 ], [
4784                         fpu=VFP_HARD
4785                 ], [
4786                         fpu=NONE
4787                 ])
4788         fi
4790         # No 'hard' ABI. 'soft' or 'softfp'?
4791         if test x$fpu = xNONE; then
4792                 AC_TRY_COMPILE([], [
4793                         #ifdef __SOFTFP__
4794                         #error "Float ABI is not 'softfp'"
4795                         #endif
4796                 ], [
4797                         fpu=VFP
4798                 ], [
4799                         fpu=NONE
4800                 ])
4801         fi
4803         if test x$arm_fpu != x; then
4804            fpu=$arm_fpu
4805         fi
4807         AC_MSG_RESULT($fpu)
4808         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4809         unset fpu
4811         dnl *********************************************
4812         dnl *** Check which ARM version(s) we can use ***
4813         dnl *********************************************
4814         AC_MSG_CHECKING(which ARM version to use)
4816         AC_TRY_COMPILE([], [
4817                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4818                 #error Not on ARM v5.
4819                 #endif
4820         ], [
4821                 arm_v5=yes
4823                 arm_ver=ARMv5
4824         ], [])
4826         AC_TRY_COMPILE([], [
4827                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4828                 #error Not on ARM v6.
4829                 #endif
4830         ], [
4831                 arm_v5=yes
4832                 arm_v6=yes
4834                 arm_ver=ARMv6
4835         ], [])
4837         AC_TRY_COMPILE([], [
4838                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4839                 #error Not on ARM v7.
4840                 #endif
4841         ], [
4842                 arm_v5=yes
4843                 arm_v6=yes
4844                 arm_v7=yes
4846                 arm_ver=ARMv7
4847         ], [])
4849         AC_MSG_RESULT($arm_ver)
4851         if test x$arm_v5 = xyes; then
4852                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4853                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4854         fi
4856         if test x$arm_v6 = xyes; then
4857                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4858                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4859         fi
4861         if test x$arm_v7 = xyes; then
4862                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4863                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4864         fi
4867 if test ${TARGET} = unknown; then
4868         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4869         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4872 if test "x$platform_android" = "xyes"; then
4873         case "x${TARGET}" in
4874         xARM)
4875                 case "x$arm_ver" in
4876                 xARMv5)
4877                         BTLS_SUPPORTED=yes
4878                         BTLS_PLATFORM=android-armv5
4879                         ;;
4880                 xARMv6)
4881                         BTLS_SUPPORTED=yes
4882                         BTLS_PLATFORM=android-armv6
4883                         ;;
4884                 xARMv7)
4885                         BTLS_SUPPORTED=yes
4886                         BTLS_PLATFORM=android-armv7
4887                         ;;
4888                 *)
4889                         BTLS_SUPPORTED=no
4890                         ;;
4891                 esac
4892                 ;;
4893         xARM64)
4894                 BTLS_SUPPORTED=yes
4895                 BTLS_PLATFORM=android-v8a
4896                 ;;
4897         xX86)
4898                 BTLS_SUPPORTED=yes
4899                 BTLS_PLATFORM=android-x86
4900                 ;;
4901         xAMD64)
4902                 BTLS_SUPPORTED=yes
4903                 BTLS_PLATFORM=android-x64
4904                 ;;
4905         *)
4906                 BTLS_SUPPORTED=no
4907                 ;;
4908         esac
4911 if test ${ACCESS_UNALIGNED} = no; then
4912         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4915 if test x$host_darwin = xyes; then
4916         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4917         AS_IF(
4918                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4919                 [AC_MSG_RESULT([no])],
4920                 [
4921                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4922                         AR_FLAGS="Scru"
4923                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4924                         AC_MSG_RESULT([yes])
4925                 ]
4926         )
4929 case "x$libgc" in
4930         xincluded)
4931                 # Pass CPPFLAGS to libgc configure
4932                 # We should use a separate variable for this to avoid passing useless and
4933                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4934                 # This should be executed late so we pick up the final version of CPPFLAGS
4935                 # The problem with this approach, is that during a reconfigure, the main
4936                 # configure scripts gets invoked with these arguments, so we use separate
4937                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4938                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4939                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4940                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4941                 fi
4942                 # Don't pass -finstrument-for-thread-suspension in, 
4943                 # if these are instrumented it will be very bad news 
4944                 # (infinite recursion, undefined parking behavior, etc)
4945                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4946                 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\""
4947                 if test "x$support_boehm" = "xyes"; then
4948                         AC_CONFIG_SUBDIRS(libgc)
4949                 fi
4950                 ;;
4951 esac
4953 MALLOC_MEMPOOLS=no
4954 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4955         if test x$with_malloc_mempools = xyes; then
4956                 MALLOC_MEMPOOLS=yes
4957                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4958         fi
4962 DISABLE_MCS_DOCS=default
4963 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4964         if test x$with_mcs_docs != xyes; then
4965                 DISABLE_MCS_DOCS=yes
4966         fi
4968 if test -n "$INSTALL_4_x_TRUE"; then :
4969         DISABLE_MCS_DOCS=yes
4971 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4972    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4975 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)],[
4976         if test x$with_lazy_gc_thread_creation != xno ; then
4977                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4978         fi
4979 ], [with_lazy_gc_thread_creation=no])
4981 dnl *****************************
4982 dnl *** Thread suspend policy ***
4983 dnl *****************************
4985 dnl Set a default hybrid or cooperative suspend on some platforms
4987 dnl Coop default is set by the bitcode preset.
4989 dnl If coop isn't on by default, maybe hybrid should be?
4990 if test x$enable_cooperative_suspend_default != xyes; then
4991         case $HOST in
4992         X86 | AMD64)
4993                 dnl Some host/target confusion, there's no host_osx (and
4994                 dnl host_darwin would be true on iOS not just macOS).
4995                 if test x$target_osx = xyes; then
4996                         enable_hybrid_suspend_default=yes
4997                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
4998                         enable_hybrid_suspend_default=yes
4999                 fi
5000                 ;;
5001         esac
5004 dnl Now check if there were flags overriding the defaults
5006 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])
5007 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5009 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5010         enable_cooperative_suspend=$with_cooperative_gc
5013 if test x$enable_cooperative_suspend = xdefault; then
5014         enable_cooperative_suspend=$enable_cooperative_suspend_default
5017 if test x$enable_cooperative_suspend != xno; then
5018         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5021 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5023 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])
5025 if test x$enable_hybrid_suspend = xdefault; then
5026    enable_hybrid_suspend=$enable_hybrid_suspend_default
5029 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5030         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5033 if test x$enable_hybrid_suspend != xno ; then
5034         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5037 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5039 dnl End of thread suspend policy
5041 dnl **********************
5042 dnl *** checked builds ***
5043 dnl **********************
5045 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],[
5047         if test x$enable_checked_build != x ; then
5048                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5049         fi
5050         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5051                 eval "mono_checked_build_test_enable_$feature='yes'"
5052         done
5054         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5055                 eval "mono_checked_build_test_enable_gc='yes'"
5056                 eval "mono_checked_build_test_enable_metadata='yes'"
5057                 eval "mono_checked_build_test_enable_thread='yes'"
5058                 eval "mono_checked_build_test_enable_private_types='yes'"
5059         fi
5061         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5062                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5063         fi
5065         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5066                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5067         fi
5069         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5070                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5071         fi
5073         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5074                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5075         fi
5076 ], [])
5078 dnl End of checked builds
5080 AC_CHECK_HEADER([malloc.h], 
5081                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5082                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5084 if test x"$GCC" = xyes; then
5085         # Implicit function declarations are not 64 bit safe
5086         # Do this late, since this causes lots of configure tests to fail
5087         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5088         # jay has a lot of implicit declarations
5089         JAY_CFLAGS="-Wno-implicit-function-declaration"
5092 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5093 # instead of libmono-static.a
5094 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5095    LIBMONO_LA=libmini-static.la
5096 else
5097    if test x$buildsgen = xyes; then
5098       LIBMONO_LA=libmonosgen-$API_VER.la
5099    else
5100       LIBMONO_LA=libmonoboehm-$API_VER.la
5101    fi
5103 AC_SUBST(LIBMONO_LA)
5105 dnl **************
5106 dnl ***  Btls  ***
5107 dnl **************
5109 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5110 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5111 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5113 if test "x$enable_btls" = "xno"; then
5114    enable_btls_lib=no
5117 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5119 btls_android=no
5120 if test "x$enable_btls" = "xyes"; then
5121         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5122         if test "x$CMAKE" = "xno"; then
5123                 AC_MSG_ERROR("cmake not found")
5124         fi
5126         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5127         AC_SUBST(BTLS_ROOT)
5129         btls_arch=
5130         btls_cflags=
5131         BTLS_CMAKE_ARGS=
5133         case "$BTLS_PLATFORM" in
5134         i386)
5135                 btls_arch=i386
5136                 btls_cflags="-m32"
5137                 case $host_os in
5138                         darwin*)
5139                                 btls_cflags="$btls_cflags -arch i386"
5140                 esac
5141                 ;;
5142         x86_64)
5143                 btls_arch=x86_64
5144                 ;;
5145         arm)
5146                 btls_arch=arm
5147                 btls_cflags="-DOPENSSL_NO_ASM=1"
5148                 ;;
5149         armsoft)
5150                 btls_arch=arm
5151                 btls_cflags="-DOPENSSL_NO_ASM=1"
5152                 ;;
5153         aarch64)
5154                 btls_arch=aarch64
5155                 btls_cflags="-march=armv8-a+crypto"
5156                 ;;
5157         s390x)
5158                 btls_arch=s390x
5159                 ;;
5160         powerpc)
5161                 btls_arch=powerpc
5162                 case $host_os in
5163                         aix*|os400*)
5164                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5165                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5166                 esac
5167                 ;;
5168         android-armv5)
5169                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5170                 ;;
5171         android-armv6)
5172                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5173                 ;;
5174         android-armv7)
5175                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5176                 ;;
5177         android-v8a)
5178                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5179                 ;;
5180         android-x86)
5181                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5182                 ;;
5183         android-x64)
5184                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5185                 ;;
5186         *)
5187                 AC_MSG_ERROR(Invalid BTLS platform)
5188         esac
5190         if test "x$platform_android" = "xyes"; then
5191                 btls_android=yes
5192                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5193                 if test "x$with_btls_android_ndk" != "x"; then
5194                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5195                 else
5196                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5197                 fi
5198         fi
5200         if test "x$btls_arch" != "x"; then
5201                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5202         fi
5204         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5205         AC_SUBST(BTLS_ARCH)
5206         AC_SUBST(BTLS_CFLAGS)
5207         AC_SUBST(BTLS_PLATFORM)
5208         AC_SUBST(BTLS_CMAKE_ARGS)
5210         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5211 else
5212         enable_btls=no
5215 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5217 if test x$DISABLE_MCS_DOCS = xyes; then
5218    docs_dir=""
5219 else
5220    docs_dir=docs
5222 AC_SUBST(docs_dir)
5224 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5225 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5226 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5228 libmono_ldflags="$libmono_ldflags $LIBS"
5230 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5231 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5232 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5233 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5234 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5235 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5236 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5237 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5238 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5239 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5240 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5241 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5242 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5243 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5244 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5245 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5246 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5247 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5249 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5251 AC_SUBST(LIBC)
5252 AC_SUBST(INTL)
5253 AC_SUBST(SQLITE)
5254 AC_SUBST(SQLITE3)
5255 AC_SUBST(X11)
5256 AC_SUBST(GDKX11)
5257 AC_SUBST(GTKX11)
5258 AC_SUBST(XINERAMA)
5259 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5260 AC_SUBST(arch_target)
5261 AC_SUBST(CFLAGS)
5262 AC_SUBST(CPPFLAGS)
5263 AC_SUBST(LDFLAGS)
5265 #This must always be defined when building the runtime
5266 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5268 mono_build_root=`pwd`
5269 AC_SUBST(mono_build_root)
5271 mono_runtime=mono/mini/mono
5272 AC_SUBST(mono_runtime)
5274 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5276 if test $csc_compiler = mcs; then
5277   CSC=$mcs_topdir/class/lib/build/mcs.exe
5278 else
5279   CSC=$CSC_LOCATION
5282 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5284 mono_cfg_root=$mono_build_root/runtime
5285 if test x$host_win32 = xyes; then
5286   if test "x$cross_compiling" = "xno"; then
5287     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5288     CSC=`cygpath -m -a $CSC`
5289     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5290   else
5291     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5292   fi
5293 else
5294   mono_cfg_dir=$mono_cfg_root/etc
5296 AC_SUBST(mono_cfg_dir)
5298 AC_SUBST(CSC)
5300 AC_CONFIG_FILES([po/mcs/Makefile.in])
5302 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5303 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5305 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5306 [   depth=../../../..
5307     case $srcdir in
5308     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5309     .) reldir=$depth ;;
5310     *) reldir=$depth/$srcdir ;;
5311     esac
5312     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5313     cd runtime/etc/mono/1.0
5314     rm -f machine.config
5315     $LN_S $reldir/data/net_1_1/machine.config machine.config
5316     cd $depth
5317 ],[LN_S='$LN_S'])
5319 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5320 [   depth=../../../..
5321     case $srcdir in
5322     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5323     .) reldir=$depth ;;
5324     *) reldir=$depth/$srcdir ;;
5325     esac
5326     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5327     cd runtime/etc/mono/2.0
5328     rm -f machine.config
5329     $LN_S $reldir/data/net_2_0/machine.config machine.config
5330     cd $depth
5331 ],[LN_S='$LN_S'])
5333 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5334 [   depth=../../../..
5335     case $srcdir in
5336     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5337     .) reldir=$depth ;;
5338     *) reldir=$depth/$srcdir ;;
5339     esac
5340     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5341     cd runtime/etc/mono/2.0
5342     rm -f web.config
5343     $LN_S $reldir/data/net_2_0/web.config web.config
5344     cd $depth
5345 ],[LN_S='$LN_S'])
5347 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5348 [   depth=../../..
5349     case $srcdir in
5350     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5351     .) reldir=$depth ;;
5352     *) reldir=$depth/$srcdir ;;
5353     esac
5354     $ac_aux_dir/install-sh -d runtime/etc/mono/
5355     cd runtime/etc/mono/
5356     rm -f browscap.ini
5357     $LN_S $reldir/data/browscap.ini browscap.ini
5358     cd $depth
5359 ],[LN_S='$LN_S'])
5361 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5362 [   depth=../../../../..
5363     case $srcdir in
5364     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5365     .) reldir=$depth ;;
5366     *) reldir=$depth/$srcdir ;;
5367     esac
5368     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5369     cd runtime/etc/mono/2.0/Browsers
5370     rm -f Compat.browser
5371     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5372     cd $depth
5373 ],[LN_S='$LN_S'])
5375 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5376 [   depth=../../../../..
5377     case $srcdir in
5378     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5379     .) reldir=$depth ;;
5380     *) reldir=$depth/$srcdir ;;
5381     esac
5382     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5383     cd runtime/etc/mono/4.0/Browsers
5384     rm -f Compat.browser
5385     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5386     cd $depth
5387 ],[LN_S='$LN_S'])
5389 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5390 [   depth=../../../../..
5391     case $srcdir in
5392     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5393     .) reldir=$depth ;;
5394     *) reldir=$depth/$srcdir ;;
5395     esac
5396     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5397     cd runtime/etc/mono/4.5/Browsers
5398     rm -f Compat.browser
5399     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5400     cd $depth
5401 ],[LN_S='$LN_S'])
5403 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5404 [   depth=../../../..
5405     case $srcdir in
5406     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5407     .) reldir=$depth ;;
5408     *) reldir=$depth/$srcdir ;;
5409     esac
5410     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5411     cd runtime/etc/mono/4.0
5412     rm -f machine.config
5413     $LN_S $reldir/data/net_4_0/machine.config machine.config
5414     cd $depth
5415 ],[LN_S='$LN_S'])
5417 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5418 [   depth=../../../..
5419     case $srcdir in
5420     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5421     .) reldir=$depth ;;
5422     *) reldir=$depth/$srcdir ;;
5423     esac
5424     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5425     cd runtime/etc/mono/4.0
5426     rm -f web.config
5427     $LN_S $reldir/data/net_4_0/web.config web.config
5428     cd $depth
5429 ],[LN_S='$LN_S'])
5431 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5432 [   depth=../../../..
5433     case $srcdir in
5434     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5435     .) reldir=$depth ;;
5436     *) reldir=$depth/$srcdir ;;
5437     esac
5438     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5439     cd runtime/etc/mono/4.5
5440     rm -f machine.config
5441     $LN_S $reldir/data/net_4_5/machine.config machine.config
5442     cd $depth
5443 ],[LN_S='$LN_S'])
5445 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5446 [   depth=../../../..
5447     case $srcdir in
5448     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5449     .) reldir=$depth ;;
5450     *) reldir=$depth/$srcdir ;;
5451     esac
5452     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5453     cd runtime/etc/mono/4.5
5454     rm -f web.config
5455     $LN_S $reldir/data/net_4_5/web.config web.config
5456     cd $depth
5457 ],[LN_S='$LN_S'])
5459 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])
5460 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])
5461 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5463 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5464 if test x"$GCC" = xyes; then
5466         # incompatible-pointer-types requires gcc circa 5.x
5468         ORIG_CFLAGS=$CFLAGS
5469         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5470         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5471         AC_TRY_COMPILE([],[
5472         ], [
5473                 AC_MSG_RESULT(yes)
5474                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5475         ], [
5476                 AC_MSG_RESULT(no)
5477                 CFLAGS=$ORIG_CFLAGS
5478         ])
5481 # Update all submodules recursively to ensure everything is checked out
5482 (cd $srcdir && scripts/update_submodules.sh)
5484 AC_OUTPUT([
5485 Makefile
5486 mono-uninstalled.pc
5487 acceptance-tests/Makefile
5488 llvm/Makefile
5489 scripts/mono-find-provides
5490 scripts/mono-find-requires
5491 mk/Makefile
5492 mono/Makefile
5493 mono/btls/Makefile
5494 mono/utils/Makefile
5495 mono/utils/jemalloc/Makefile
5496 mono/metadata/Makefile
5497 mono/dis/Makefile
5498 mono/cil/Makefile
5499 mono/arch/Makefile
5500 mono/arch/x86/Makefile
5501 mono/arch/amd64/Makefile
5502 mono/arch/ppc/Makefile
5503 mono/arch/sparc/Makefile
5504 mono/arch/s390x/Makefile
5505 mono/arch/arm/Makefile
5506 mono/arch/arm64/Makefile
5507 mono/arch/mips/Makefile
5508 mono/sgen/Makefile
5509 mono/tests/Makefile
5510 mono/tests/assembly-load-reference/Makefile
5511 mono/tests/tests-config
5512 mono/tests/gc-descriptors/Makefile
5513 mono/tests/testing_gac/Makefile
5514 mono/unit-tests/Makefile
5515 mono/benchmark/Makefile
5516 mono/mini/Makefile
5517 mono/profiler/Makefile
5518 mono/eglib/Makefile
5519 mono/eglib/eglib-config.h
5520 mono/eglib/test/Makefile
5521 m4/Makefile
5522 ikvm-native/Makefile
5523 scripts/Makefile
5524 man/Makefile
5525 docs/Makefile
5526 data/Makefile
5527 data/net_2_0/Makefile
5528 data/net_4_0/Makefile
5529 data/net_4_5/Makefile
5530 data/net_2_0/Browsers/Makefile
5531 data/net_4_0/Browsers/Makefile
5532 data/net_4_5/Browsers/Makefile
5533 data/mint.pc
5534 data/mono-2.pc
5535 data/monosgen-2.pc
5536 data/mono.pc
5537 data/mono-cairo.pc
5538 data/mono-nunit.pc
5539 data/mono-options.pc
5540 data/mono-lineeditor.pc
5541 data/monodoc.pc
5542 data/dotnet.pc
5543 data/dotnet35.pc
5544 data/wcf.pc
5545 data/cecil.pc
5546 data/system.web.extensions_1.0.pc
5547 data/system.web.extensions.design_1.0.pc
5548 data/system.web.mvc.pc
5549 data/system.web.mvc2.pc
5550 data/system.web.mvc3.pc
5551 data/aspnetwebstack.pc
5552 data/reactive.pc
5553 samples/Makefile
5554 support/Makefile
5555 data/config
5556 tools/Makefile
5557 tools/locale-builder/Makefile
5558 tools/sgen/Makefile
5559 tools/monograph/Makefile
5560 tools/pedump/Makefile
5561 runtime/Makefile
5562 msvc/Makefile
5563 po/Makefile
5566 if test x$host_win32 = xyes; then
5567    # Get rid of 'cyg' prefixes in library names
5568    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5569    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5570    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5571    # executable doesn't work...
5572    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5575 if test x$host_darwin = xyes; then
5576    # This doesn't seem to be required and it slows down parallel builds
5577    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5581   case $prefix in
5582   NONE) prefix=$ac_default_prefix ;;
5583   esac
5584   case $exec_prefix in
5585   NONE) exec_prefix='${prefix}' ;;
5586   esac
5588   #
5589   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5590   # any existing config.make.  This allows people to share the same source tree
5591   # with different build directories, one native and one cross
5592   #
5593   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5595     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5597     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5598     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5599     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5600     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5601     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5602     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5603     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5604     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5605     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5607     case $INSTALL in
5608     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5609     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5610     esac
5612     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5614     export VERSION
5615     [myver=$($AWK 'BEGIN {
5616       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5617       if(length(vsplit [1]) > 4) {
5618         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5619       }
5620       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5621     }')]
5623     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5624     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5626     if test x$host_darwin = xyes; then
5627       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
5628       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
5629       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5630     elif test x$host_win32 = xyes; then
5631       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5632       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5633       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5634     elif test x$host_linux = xyes; then
5635       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5636       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5637       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5638     else
5639       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
5640       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5641       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5642     fi
5644     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5645       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5646     fi
5648         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5649            enable_system_aot=yes
5650         fi
5652     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5653       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5654     fi
5656     if test x$DISABLE_MCS_DOCS = xyes; then
5657       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5658     fi
5660     if test x$has_extension_module != xno; then
5661         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5662     fi
5663     
5664     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5665     
5666     if test "x$test_bcl_opt" = "xyes"; then    
5667       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5668     fi
5670     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5672     if test $csc_compiler = mcs; then
5673       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5674     fi
5676     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5677       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5678       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5679       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5680     fi
5682     if test "x$AOT_MODE" != "x" ; then
5683       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5684     fi
5686     if test "x$enable_btls" = "xyes"; then
5687       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5688     fi
5690   fi
5694 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5696 btls_platform_string=
5697 if test x$enable_btls = xyes; then
5698         if test x$btls_android = xyes; then
5699                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5700         else
5701                 btls_platform_string=" ($BTLS_PLATFORM)"
5702         fi
5705 thread_suspend_msg=
5706 if test x$buildsgen = xyes; then
5707         if test x$enable_cooperative_suspend != xno; then
5708                 thread_suspend_msg="Suspend:       Cooperative"
5709         elif test x$enable_hybrid_suspend != xno; then
5710                 thread_suspend_msg="Suspend:       Hybrid"
5711         else
5712                 thread_suspend_msg="Suspend:       Preemptive"
5713         fi
5715         
5716 echo "
5717         mcs source:    $mcsdir
5718         C# Compiler:   $csc_compiler
5720    Engine:
5721         Host:          $host
5722         Target:        $target
5723         GC:            $gc_msg 
5724         $thread_suspend_msg
5725         TLS:           $with_tls
5726         SIGALTSTACK:   $with_sigaltstack
5727         Engine:        $jit_status
5728         BigArrays:     $enable_big_arrays
5729         DTrace:        $enable_dtrace
5730         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
5731         Spectre:       $spectre_mitigation_status
5733    Libraries:
5734         .NET 4.x:        $with_profile4_x
5735         Xamarin.Android: $with_monodroid
5736         Xamarin.iOS:     $with_monotouch
5737         Xamarin.WatchOS: $with_monotouch_watch
5738         Xamarin.TVOS:    $with_monotouch_tv
5739         Xamarin.Mac:     $with_xammac
5740         Windows AOT:     $with_winaot
5741         Orbis:           $with_orbis
5742         Unreal:          $with_unreal
5743         WebAssembly:     $with_wasm
5744         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5745         JNI support:     $jdk_headers_found
5746         libgdiplus:      $libgdiplus_msg
5747         zlib:            $zlib_msg
5748         BTLS:            $enable_btls$btls_platform_string
5749         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5750         crash reporting: $crash_reporting
5751         $disabled
5753 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5754    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)