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