[configure] Pass -stdlib=libc++ to clang on darwin to build C++ code (#11673)
[mono-project.git] / configure.ac
blob7c132bf2f93084ce4f2d330e883279a820ef8b3f
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
23 AM_EXTRA_RECURSIVE_TARGETS([test])
24 AM_EXTRA_RECURSIVE_TARGETS([test-bundle])
26 API_VER=2.0
27 AC_SUBST(API_VER)
29 AC_PROG_LN_S
31 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
33 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
34 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
35 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
38 # This is the version of the corlib-runtime interface. When
39 # making changes to this interface (by changing the layout
40 # of classes the runtime knows about, changing icall signature or
41 # semantics etc), change this variable.
43 # This must be unique relative to corlib interface/semantics.
45 # Generate it with uuidgen. For example:
46 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
48 # There is no ordering of corlib versions, no old or new,
49 # the runtime expects an exact match.
51 MONO_CORLIB_VERSION=0CC970F6-6F25-4218-9427-3E4C3DC8DE33
54 # Put a quoted #define in config.h.
55 # Substitute @MONO_CORLIB_VERSION@ unquoted.
57 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,"$MONO_CORLIB_VERSION",[Version of the corlib-runtime interface])
58 AC_SUBST(MONO_CORLIB_VERSION)
60 case $host_os in
61 *cygwin* )
62                  echo "Run configure using ./configure --host=i686-w64-mingw32 or --host=x86_64-w64-mingw32"
63                  exit 1
64 esac
66 # In case of cygwin, override LN_S, irrespective of what it determines.
67 # The build uses cygwin, but the actual runtime doesn't.
68 case $host_os in
69 *cygwin* ) LN_S='cp -p';;
70 esac
73 # libgc defaults
75 libgc_configure_args=
77 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
78 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
79 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
80 CFLAGS_FOR_LIBGC=$CFLAGS
81 CPPFLAGS_FOR_BTLS=$CPPFLAGS
82 CFLAGS_FOR_BTLS=$CFLAGS
84 # libgc uses some deprecated APIs
85 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
88 # These are the flags that need to be stored in the mono.pc file for 
89 # compiling code that will embed Mono
91 libmono_cflags=""
92 libmono_ldflags=""
93 AC_SUBST(libmono_cflags)
94 AC_SUBST(libmono_ldflags)
96 # Variable to have relocatable .pc files (lib, or lib64)
97 # realpath isn't always available, and requires that all but the tip of the provided
98 # path exists. Fall back to the old behaviour, but realpath allows depth >1
99 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
100 # too deep for the old method to work
101 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
102 AC_SUBST(reloc_libdir)
104 # Set to yes if Unix sockets cannot be created in an anonymous namespace
105 need_link_unlink=no
107 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
108 extra_runtime_ldflags=""
110 # Thread configuration inspired by sleepycat's db
111 AC_MSG_CHECKING([host platform characteristics])
113 libgc_threads=no
114 has_dtrace=no
115 parallel_mark=yes
116 ikvm_native=yes
118 host_win32=no
119 target_win32=no
120 platform_android=no
121 platform_tizen=no
122 platform_ios=no
123 host_darwin=no
124 host_linux=no
126 case "$host" in
127         wasm32*)
128                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
129                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
130                 libdl="-ldl"
131                 libgc_threads=pthreads
132                 platform_wasm=yes
133                 ;;
134         *-mingw*|*-*-cygwin*)
135                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
136                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
137                 host_win32=yes
138                 mono_cv_clang=no
139                 if test "x$cross_compiling" = "xno"; then
140                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
141                                 target_win32=yes
142                         fi
143                 else
144                         if test "x$host" = "x$target"; then
145                                 target_win32=yes
146                         fi
147                 fi
148                 HOST_CC="gcc"
150                 # Windows 7 or later is required
151                 WIN32_CPPFLAGS="-DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
152                 CPPFLAGS="$CPPFLAGS $WIN32_CPPFLAGS"
153                 WIN32_LDFLAGS="-lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
154                 LDFLAGS="$LDFLAGS $WIN32_LDFLAGS"
155                 libmono_cflags="-mms-bitfields -mwindows"
156                 libmono_ldflags="-mms-bitfields -mwindows"
157                 libdl=
158                 libgc_threads=win32
159                 with_sigaltstack=no
160                 with_tls=pthread
161                 with_sgen_default_concurrent=yes
162                 LN_S=cp
163                 # This forces libgc to use the DllMain based thread registration code on win32
164                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
165                 ;;
166         *-*-*netbsd*)
167                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
168                 libmono_cflags="-D_REENTRANT"
169                 LDFLAGS="$LDFLAGS -pthread"
170                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
171                 libmono_ldflags="-pthread"
172                 need_link_unlink=yes
173                 libdl="-ldl"
174                 libgc_threads=pthreads
175                 with_sigaltstack=no
176                 use_sigposix=yes
177                 with_sgen_default_concurrent=yes
178                 ;;
179         *-*-kfreebsd*-gnu)
180                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
181                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
182                 libmono_ldflags="-lpthread -pthread"
183                 libdl="-ldl"
184                 libgc_threads=pthreads
185                 need_link_unlink=yes
186                 with_sigaltstack=no
187                 use_sigposix=yes
188                 with_sgen_default_concurrent=yes
189                 ;;
190         *-*-*freebsd*)
191                 dnl For close_my_fds
192                 LDFLAGS="$LDFLAGS -lutil"
193                 if test "x$PTHREAD_CFLAGS" = "x"; then
194                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
195                         libmono_cflags=
196                 else
197                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
198                         libmono_cflags="$PTHREAD_CFLAGS"
199                 fi
200                 if test "x$PTHREAD_LIBS" = "x"; then
201                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
202                         libmono_ldflags="-pthread"
203                 else
204                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
205                         libmono_ldflags="$PTHREAD_LIBS"
206                 fi
207                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
208                 need_link_unlink=yes
209                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
210                 libdl=
211                 libgc_threads=pthreads
212                 use_sigposix=yes
213                 has_dtrace=yes
214                 with_sgen_default_concurrent=yes
215                 ;;
216         *-*-*openbsd*)
217                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
218                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
219                 if test "x$disable_munmap" != "xyes"; then
220                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
221                 fi
222                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
223                 LDFLAGS="$LDFLAGS -pthread"
224                 need_link_unlink=yes
225                 AC_DEFINE(PTHREAD_POINTER_ID)
226                 libdl=
227                 libgc_threads=pthreads
228                 with_tls=pthread
229                 with_sigaltstack=no
230                 use_sigposix=yes
231                 with_sgen_default_concurrent=yes
232                 ;;
233         *-*-linux-android*)
234                 platform_android=yes
235                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
236                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
238                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
239                 if test "x$disable_munmap" != "xyes"; then
240                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
241                 fi
242                 libmono_cflags="-D_REENTRANT"
243                 libdl="-ldl"
244                 libgc_threads=pthreads
245                 use_sigposix=yes
247                 with_tls=pthread
248                 with_sigaltstack=no
249                 with_static_mono=no
251                 # Android doesn't support boehm, as it's missing <link.h>
252                 support_boehm=no
253                 with_gc=sgen
255                 # isinf(3) requires -lm
256                 LDFLAGS="$LDFLAGS -lm"
258                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
259                 # PAGE_SIZE; breaks mono/io-layer/collection.c
260                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
261                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
262                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
264                 # to bypass the underscore linker check, can't work when cross-compiling
265                 mono_cv_uscore=yes
266                 mono_cv_clang=no
267                 ;;
268         *-*-linux*)
269                 host_linux=yes
270                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
271                 if test "x$disable_munmap" != "xyes"; then
272                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
273                 fi
274                 libmono_cflags="-D_REENTRANT"
275                 libdl="-ldl"
276                 libgc_threads=pthreads
277                 use_sigposix=yes
278                 if test "x$cross_compiling" != "xno"; then
279                         # to bypass the underscore linker check, not
280                         # available during cross-compilation
281                         mono_cv_uscore=no
282                 fi
283                 case "$host" in
284                 *-tizen-linux-*)
285                         platform_tizen=yes
286                         ;;
287                 esac
288                 case "$host" in
289                 aarch64-*)
290                         support_boehm=no
291                         with_gc=sgen
292                         ;;
293                 powerpc*-*-linux*)
294                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
295                         disable_munmap=yes
296                         ;;
297                 riscv*)
298                         support_boehm=no
299                         with_gc=sgen
300                         ;;
301                 esac
302                 with_sgen_default_concurrent=yes
303                 ;;
304         *-*-nacl*)
305                 echo "nacl no longer supported."
306                 exit 1
307                 ;;
308         *-*-hpux*)
309                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
310                 # +ESdbgasm only valid on bundled cc on RISC
311                 # silently ignored for ia64
312                 if test $GCC != "yes"; then
313                         CFLAGS="$CFLAGS +ESdbgasm"
314                         # Arrange for run-time dereferencing of null
315                         # pointers to produce a SIGSEGV signal.
316                         LDFLAGS="$LDFLAGS -z"
317                 fi
318                 CFLAGS="$CFLAGS +ESdbgasm"
319                 LDFLAGS="$LDFLAGS -z"
320                 libmono_cflags="-D_REENTRANT"
321                 libmono_ldflags="-lpthread"
322                 libgc_threads=pthreads
323                 need_link_unlink=yes
324                 use_sigposix=yes
325                 ;;
326         *-*-solaris*)
327                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
328                 need_link_unlink=yes
329                 libmono_cflags="-D_REENTRANT"
330                 libgc_threads=pthreads
331                 has_dtrace=yes
332                 use_sigposix=yes
333                 enable_solaris_tar_check=yes
334                 ;;
335         *-*-darwin*)
336                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
337                 host_darwin=yes
338                 target_mach=yes
339                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
340                 libmono_cflags="-D_THREAD_SAFE"
341                 need_link_unlink=yes
342                 AC_DEFINE(PTHREAD_POINTER_ID)
343                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
344                 libdl=
345                 libgc_threads=pthreads
346                 has_dtrace=yes
347                 if test "x$cross_compiling" = "xyes"; then
348                         has_broken_apple_cpp=yes
349                 fi
350                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
351                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
352                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
353                 case "$host" in
354                         dnl Snow Leopard and newer config.guess reports as this
355                         i*86-*-darwin*)
356                                 BROKEN_DARWIN_FLAGS="-arch i386"
357                                 BROKEN_DARWIN_CPPFLAGS=""
358                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
359                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
360                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
361                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
362                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
363                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
364                                 with_sgen_default_concurrent=yes
365                                 ;;
366                         x*64-*-darwin*)
367                                 with_sgen_default_concurrent=yes
368                                 ;;
369                         arm*-darwin*)
370                                 platform_ios=yes
371                                 has_dtrace=no
372                                 ;;
373                         aarch64*-darwin*)
374                                 platform_ios=yes
375                                 ;;
376                 esac
377                 ;;
378         *-*-haiku*)
379                 dnl BSD_SOURCE is for getifaddrs
380                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
381                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
382                 libdl=
383                 LIBS="$LIBS -lnetwork -ltextencoding"
384                 need_link_unlink=yes
385                 AC_DEFINE(PTHREAD_POINTER_ID)
386                 dnl Haiku does not support static TLS with __thread
387                 with_tls=pthread
388                 libgc_threads=pthreads
389                 use_sigposix=yes
390                 with_sigaltstack=no
391                 ;;
392         *-*-aix*|*-*-os400*)
393                 dnl Set up a 64-bit build
394                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
395                 LDFLAGS="-maix64"
396                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
397                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
398                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
399                 dnl specifiy 64-bit mode for tools.
400                 AR="/usr/bin/ar -X64"
401                 NM="/usr/bin/nm -X64"
402                 dnl SGen is the future (changes to Boehm support code would be
403                 dnl required if you wish to re-enable Boehm)
404                 support_boehm=no
405                 with_gc=sgen
406                 need_link_unlink=yes
407                 use_sigposix=yes
408                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
409                 with_sigaltstack=no
410                 dnl use pthread TLS, __thread has issues with the compiler flags we use
411                 with_tls=pthread
412                 dnl ppc Linux is the same? test further
413                 disable_munmap=yes
414                 ;;
415         *)
416                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
417                 libdl="-ldl"
418                 ;;
419 esac
421 AC_MSG_RESULT(ok)
423 if test x$need_link_unlink = xyes; then
424    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
427 if test x$host_win32 = xyes; then
428    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
431 if test x$target_win32 = xyes; then
432    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
435 if test x$host_darwin = xyes; then
436    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
439 # Defined for all targets/platforms using classic Windows API support.
440 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
441 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
443 AC_SUBST(extra_runtime_ldflags)
444 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
445 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
446 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
447 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
448 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
449 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
450 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
451 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
452 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
454 if test -z "$HOST_DARWIN_TRUE"; then :
455 PLATFORM_AOT_SUFFIX=.dylib
458 if test -z "$HOST_LINUX_TRUE"; then :
459 PLATFORM_AOT_SUFFIX=.so
462 if test -z "$HOST_WIN32_TRUE"; then :
463 PLATFORM_AOT_SUFFIX=.dll
466 AC_SUBST(PLATFORM_AOT_SUFFIX)
468 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
470 AC_CHECK_TOOL(CC, gcc, gcc)
471 AC_PROG_CC
472 AC_CHECK_TOOL(CXX, g++, g++)
473 AC_PROG_CXX
474 AM_PROG_AS
475 AC_PROG_INSTALL
476 AC_PROG_AWK
477 AM_PROG_CC_C_O
478 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
479 : ${CCAS='$(CC)'}
480 # Set ASFLAGS if not already set.
481 : ${CCASFLAGS='$(CFLAGS)'}
482 AC_SUBST(CCAS)
483 AC_SUBST(CCASFLAGS)
485 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
486 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
487 if test "x$CXX" = "xg++"; then
488         if test "x$GXX" != "xyes"; then
489                 # automake/libtool is so broken, it requires g++ even if the c++ sources
490                 # are inside automake conditionals
491                 AC_MSG_ERROR([You need to install g++])
492         fi
495 dnl may require a specific autoconf version
496 dnl AC_PROG_CC_FOR_BUILD
497 dnl CC_FOR_BUILD not automatically detected
498 CC_FOR_BUILD=$CC
499 CFLAGS_FOR_BUILD=$CFLAGS
500 BUILD_EXEEXT=
501 if test "x$cross_compiling" = "xyes"; then
502         CC_FOR_BUILD=cc
503         CFLAGS_FOR_BUILD=
504         BUILD_EXEEXT=""
506 AC_SUBST(CC_FOR_BUILD)
507 AC_SUBST(CFLAGS_FOR_BUILD)
508 AC_SUBST(HOST_CC)
509 AC_SUBST(BUILD_EXEEXT)
511 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
512 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
514 # Set STDC_HEADERS
515 AC_HEADER_STDC
516 AC_LIBTOOL_WIN32_DLL
517 # This causes monodis to not link correctly
518 #AC_DISABLE_FAST_INSTALL
520 #lookup makedev() header
521 AC_HEADER_MAJOR
523 AM_PROG_LIBTOOL
524 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
525 DOLT
527 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
528 AC_SUBST(export_ldflags)
530 # Test whenever ld supports -version-script
531 AC_PROG_LD
532 AC_PROG_LD_GNU
534 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)
535 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)
536 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
537                   [], [], [#include <stddef.h>
538                   #include <sys/socket.h>
539                   #include <linux/socket.h>])
541 AC_CHECK_HEADERS(sys/user.h, [], [],
543 #ifdef HAVE_SYS_PARAM_H
544 # include <sys/param.h>
545 #endif
548 AC_CHECK_HEADERS(linux/serial.h)
550 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
551 if test x$have_zlib = xyes; then
552    AC_TRY_COMPILE([#include <zlib.h>], [
553    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
554    #else
555    #error No good zlib found
556    #endif
557    ],[
558         AC_MSG_RESULT(Using system zlib)
559         zlib_msg="system zlib"
560         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
561    ],[
562         AC_MSG_RESULT(Using embedded zlib)
563         have_zlib=no
564         zlib_msg="bundled zlib"
565    ])
568 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
569 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
571 # for mono/metadata/debug-symfile.c
572 AC_CHECK_HEADERS(elf.h)
574 # for support
575 AC_CHECK_HEADERS(poll.h)
576 AC_CHECK_HEADERS(sys/poll.h)
577 AC_CHECK_HEADERS(sys/wait.h)
578 AC_CHECK_HEADERS(grp.h)
579 AC_CHECK_HEADERS(syslog.h)
580 AC_CHECK_FUNCS(vsyslog)
582 # for mono/dis
583 AC_CHECK_HEADERS(wchar.h)
585 # for Linux statfs support
586 AC_CHECK_HEADERS(linux/magic.h)
588 # For Android NDK unified headers
589 if test x$platform_android = xyes; then
590         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
591         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
593         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
594         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
595         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
596         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
597         # doesn't contain the required definitions (NDK 14)
598         if test x$have_android_signal_inlines = xyes; then
599                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
600                 AC_COMPILE_IFELSE([
601                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
602                                 int i;
603                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
604                                 }
605                         ])],[
606                                 AC_MSG_RESULT(yes)
607                                 android_sigrtminmax_work=yes
608                         ],[
609                                 AC_MSG_RESULT(no)
610                                 android_sigrtminmax_work=no
611                         ]
612                 )
614                 if test x$android_sigrtminmax_work = xno; then
615                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
616                 fi
617         fi
619         # Attempt to detect whether we're using Android NDK unified headers
620         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
621         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
623         android_unified_headers=no
624         if test x$have_android_api_level = xyes; then
625                 if test x$have_android_versioning = xyes; then
626                         AC_MSG_CHECKING([whether using Android NDK unified headers])
628                         # Both macros are defined only in the NDK unified headers
629                         AC_COMPILE_IFELSE([
630                                 AC_LANG_PROGRAM([
631                                         #include <android/api-level.h>
632                                         #include <android/versioning.h>
633                                 ],[
634                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
635                                         #else
636                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
637                                         #endif
638                                 ])],[
639                                         AC_MSG_RESULT(yes)
640                                         android_unified_headers=yes
641                                 ],[
642                                         AC_MSG_RESULT(no)
643                                         android_unified_headers=no
644                                 ]
645                         )
646                 fi
647         fi
649         if test x$android_unified_headers = xyes; then
650                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
651         fi
652 fi # Android
654 # not 64 bit clean in cross-compile
655 AC_CHECK_SIZEOF(void *)
656 AC_CHECK_SIZEOF(long)
658 AC_CHECK_SIZEOF(int)
659 AC_CHECK_SIZEOF(long long)
661 AC_CACHE_CHECK([for clang],
662         mono_cv_clang,[
663         AC_TRY_COMPILE([], [
664                 #ifdef __clang__
665                 #else
666                 #error "FAILED"
667                 #endif
668         ],
669         [mono_cv_clang=yes],
670         [mono_cv_clang=no],
671         [])
674 AC_ARG_ENABLE(visibility-hidden,
675 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
676    disable_visibility_hidden=yes, disable_visibility_hidden=no)
678 WARN=''
679 if test x"$GCC" = xyes; then
680                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
681                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
683                 # We require C99 with some GNU extensions, e.g. `linux` macro
684                 CFLAGS="$CFLAGS -std=gnu99"
686                 # The runtime code does not respect ANSI C strict aliasing rules
687                 CFLAGS="$CFLAGS -fno-strict-aliasing"
689                 # We rely on signed overflow to behave
690                 CFLAGS="$CFLAGS -fwrapv"
692                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
693                 if test x"$disable_visibility_hidden" = xno; then
694                    # Don't export any symbols by default
695                    SHARED_CFLAGS="-fvisibility=hidden"
696                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
697                 fi
699                 ORIG_CFLAGS=$CFLAGS
700                 # Check for the normal version, since gcc ignores unknown -Wno options
701                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
702                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
703                 AC_TRY_COMPILE([],[
704                 ], [
705                    AC_MSG_RESULT(yes)
706                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
707                 ], [
708                    AC_MSG_RESULT(no)
709                    CFLAGS=$ORIG_CFLAGS
710                 ])
712                 if test "x$mono_cv_clang" = "xyes"; then
713                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
714                    WARN="$WARN -Qunused-arguments"
715                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
716                    # We rely on zero length arrays in structs
717                    WARN="$WARN -Wno-zero-length-array"
718                 fi
719 else
720         # The Sun Forte compiler complains about inline functions that access static variables
721         # so disable all inlining.
722         case "$host" in
723         *-*-solaris*)
724                 CFLAGS="$CFLAGS -Dinline="
725                 ;;
726         esac
728 CFLAGS="$WARN $CFLAGS -g"
729 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
730 CPPFLAGS="$WARN $CPPFLAGS -g"
732 # Where's the 'mcs' source tree?
733 if test -d $srcdir/mcs; then
734   mcsdir=mcs
735 else
736   mcsdir=../mcs
739 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
740         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
741                 mcsdir=$with_mcs_path
742         fi
745 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
748 # A sanity check to catch cases where the package was unpacked
749 # with an ancient tar program (Solaris)
751 AC_ARG_ENABLE(solaris-tar-check,
752 [  --disable-solaris-tar-check    disable solaris tar check],
753    do_solaris_tar_check=no, do_solaris_tar_check=yes)
755 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
756         AC_MSG_CHECKING(integrity of package)
757         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
758         then
759                 AC_MSG_RESULT(ok)
760         else
761                 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"
762                 AC_MSG_ERROR([$errorm])
763         fi
766 if test "x$with_mcs_path" != "x"; then
767 mcs_topdir=$(cd "$mcsdir" && pwd)
768 mcs_topdir_from_srcdir=$mcs_topdir
769 else
770 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
771 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
774 # Convert mcs_topdir* paths to Windows syntax.
775 if test x$cross_compiling$host_win32 = xnoyes; then
776   mcs_topdir=$(cygpath -m $mcs_topdir)
777   case $mcs_topdir_from_srcdir in
778     /cygdrive/*)
779         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
780         ;;
781   esac
784 AC_SUBST([mcs_topdir])
785 AC_SUBST([mcs_topdir_from_srcdir])
787 # gettext: prepare the translation directories. 
788 # we do not configure the full gettext, as we consume it dynamically from C#
789 AM_PO_SUBDIRS
791 if test "x$USE_NLS" = "xyes"; then
792    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
794    if test "x$HAVE_MSGFMT" = "xno"; then
795           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
796    fi
799 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
801 pkg_config_path=
802 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
803         if test x$with_crosspkgdir = "x"; then
804                 if test -s $PKG_CONFIG_PATH; then
805                         pkg_config_path=$PKG_CONFIG_PATH
806                 fi
807         else
808                 pkg_config_path=$with_crosspkgdir
809                 PKG_CONFIG_PATH=$pkg_config_path
810                 export PKG_CONFIG_PATH
811         fi
814 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
815 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
816 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
818 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
819 if test x$werror_flag = xyes; then
820         WERROR_CFLAGS="-Werror"
822 AC_SUBST([WERROR_CFLAGS])
823 AC_SUBST([SHARED_CFLAGS])
825 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
826   
827 AC_SUBST(GLIB_CFLAGS)
829 # Enable support for fast thread-local storage
830 # Some systems have broken support, so we allow to disable it.
831 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
833 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
834 # This does not work on some platforms (bug #55253)
835 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
837 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
838 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
839 # Same as --with-shared_mono=no
840 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
842 if test "x$enable_static" = "xno"; then
843    with_static_mono=no
846 if test "x$enable_shared" = "xno"; then
847    with_shared_mono=no
850 if test "x$enable_libraries" = "xno"; then
851    with_shared_mono=no
854 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
856 if test "x$host_win32" = "xyes"; then
857    # Boehm GC requires the runtime to be in its own dll
858    with_static_mono=no
861 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
862 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
863 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
864 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
866 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
867 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
868         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
869         ORIG_CFLAGS=$CFLAGS
870         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
871         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
872         AC_TRY_COMPILE([], [
873         ], [
874            AC_MSG_RESULT(yes)
875            # Pass it to libgc as well
876            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
877         ], [
878            AC_MSG_RESULT(no)
879            CFLAGS=$ORIG_CFLAGS
880         ])
883 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
885 if test x$enable_small_config = xyes; then
886         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
887         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
890 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)
892 DISABLED_FEATURES=none
893 csc_compiler=default
894 endian=unknown
895 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
896 AC_MSG_CHECKING([CSharp compiler to use])
897 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
898    if test x$withval = xmcs; then
899        csc_compiler=mcs
900    elif test x$withval = xroslyn; then
901        csc_compiler=roslyn
902    elif test x$withval = xdefault; then
903        :
904    else
905        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
906    fi
907 ],[csc_compiler=default])
909 if test $csc_compiler = default; then
910    if test $endian = big; then
911       csc_compiler=mcs
912    elif test $endian = little; then
913       case "$host" in
914         powerpc*) csc_compiler=mcs ;;
915         *) csc_compiler=roslyn ;;
916       esac
917    else
918       csc_compiler=mcs
919    fi
921 AC_MSG_RESULT($csc_compiler)
923 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
924 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
925 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])
928 if test x$target_win32 = xyes; then
929 with_jemalloc=no
930 with_jemalloc_assert=no
931 with_jemalloc_always=no
934 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
935 if test "x$with_jemalloc_assert" = "xyes"; then
936 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
937 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
938 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
941 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
942 if test "x$with_jemalloc_always" = "xyes"; then
943 with_jemalloc=yes
944 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
945 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
946 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
949 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
950 if test "x$with_jemalloc" = "xyes"; then
951 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
952 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
953 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
955 if test "x$target_mach" = "xyes"; then
956         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
959 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
960 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
962 AC_SUBST(JEMALLOC_CFLAGS)
963 AC_SUBST(JEMALLOC_CPPFLAGS)
964 AC_SUBST(JEMALLOC_LDFLAGS)
965 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
968 # Terminology:
969 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
970 # MERP - The MS telemetry profile. Not for general use.
971 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
973 # 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.
975 #--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.
976 #--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.
977 #--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.
978 #--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.
980 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])
981 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])
982 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
984 if test "x$with_crash_privacy" = "xyes"; then
985 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
988 if test "x$with_structured_crashes" = "xno"; then
989 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
992 case "$host" in
993         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
994                 crash_reporting=no
995                 ;;
996 esac
998 if test "x$crash_reporting" != "xyes"; then
999 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1000 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1003 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1004 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1006 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1007 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1009 if test x$enable_monodroid = xyes; then
1010         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1013 if test x$enable_monotouch = xyes; then
1014         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1017 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1019 # mono/corefx/native has a lot of invalid C++98 in its headers
1020 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1021 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1022 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1023 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1025 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1026 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1027 # and add it whenever we're running clang on Darwin.
1028 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1029         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1032 AC_SUBST(CXXFLAGS_COMMON)
1034 if test "x$enable_cxx" = "xyes"; then
1036         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1038         # -std=gnu99 -xc++ is not allowed and errors.
1039         CXX_REMOVE_CFLAGS=-std=gnu99
1040         # These give warnings and should be removed. They are C-only.
1041         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1042         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1043         # Likewise with CentOS 6 gcc 4.4.
1044         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1046         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1047         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1048         # generates a warning every time we run gcc which is very unsightly.
1049         # The warning is for e.g. sprintf(foo, "") which can just be
1050         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1051         # and completely legal and valid.
1052         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1053         # Alternatively, just run $CXX -xc++ -c /dev/null.
1054         AC_LANG_PUSH(C++)
1055         ORIG_CXXFLAGS=$CXXFLAGS
1056         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1057         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1058         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1059                                  [ AC_MSG_RESULT(no)
1060                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1061         CXXFLAGS=$ORIG_CXXFLAGS
1062         AC_LANG_POP(C++)
1064 AC_SUBST(CXX_ADD_CFLAGS)
1065 AC_SUBST(CXX_REMOVE_CFLAGS)
1068 # Set the build profiles and options before things which use them
1071 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])
1072 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1073 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1074 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])
1075 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])
1076 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1077 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1078 AC_ARG_WITH(testing_aot_full_interp,  [  --with-testing_aot_full_interp=yes,no    If you want to build the testing_aot_full_interp assemblies (defaults to no)],   [], [with_testing_aot_full_interp=default])
1079 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])
1080 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])
1081 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1082 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1083 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1084 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1087 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal,fullaotinterp  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1088 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])
1089 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])
1090 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])
1093 dnl Spectre compiler mitigation flag checks
1095 if test "x$with_spectre_mitigation" = "xyes"; then
1096    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1097    SPECTRE_CFLAGS=
1098    SPECTRE_INDIRECT_BRANCH_KIND=
1099    case "x$with_spectre_indirect_branch_choice" in
1100        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1101        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1102        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1103        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1104        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1105    esac
1107    SPECTRE_FUNCTION_RETURN_KIND=""
1108    case "x$with_spectre_function_return_choice" in
1109        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1110        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1111        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1112        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1113        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1114    esac
1116    AX_CHECK_COMPILE_FLAG(
1117         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1118         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1119    )
1121    AX_CHECK_COMPILE_FLAG(
1122         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1123         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1124    )
1126    if test "x$SPECTRE_CFLAGS" != "x" ; then
1127         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1128         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1129         spectre_mitigation_status="mitigation enabled"
1130    fi
1131 else
1132         spectre_mitigation_status="no mitigation"
1136 dnl Profile defaults
1138 TEST_PROFILE=default
1139 enable_llvm_default=no
1141 with_profile4_x_default=no
1142 with_monodroid_default=no
1143 with_monotouch_default=no
1144 with_monotouch_watch_default=no
1145 with_monotouch_tv_default=no
1146 with_xammac_default=no
1147 with_testing_aot_full_interp_default=no
1148 with_testing_aot_hybrid_default=no
1149 with_testing_aot_full_default=no
1150 with_winaot_default=no
1151 with_orbis_default=no
1152 with_unreal_default=no
1153 with_wasm_default=no
1155 with_bitcode_default=no
1156 enable_cooperative_suspend_default=no
1157 enable_hybrid_suspend_default=no
1159 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1161 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1163 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1164    DISABLE_MCS_DOCS_default=yes
1165 elif test x$with_runtime_preset = xnet_4_x; then
1166    with_profile4_x_default=yes
1167 elif test x$with_runtime_preset = xall; then
1168    with_profile4_x_default=yes
1169    with_monodroid_default=yes
1170    with_monotouch_default=yes
1171    with_monotouch_watch_default=yes
1172    with_monotouch_tv_default=yes
1173    with_xammac_default=yes
1174    with_winaot_default=yes
1175    with_orbis_default=yes
1176    with_unreal_default=yes
1177    with_wasm_default=yes
1178    with_testing_aot_full_interp_default=yes
1179    with_testing_aot_hybrid_default=yes
1180    with_testing_aot_full_default=yes
1181 elif test x$with_runtime_preset = xbitcode; then
1182    DISABLE_MCS_DOCS_default=yes
1183    with_testing_aot_full_default=yes
1184    with_bitcode_default=yes
1185    enable_cooperative_suspend_default=yes
1186    TEST_PROFILE=testing_aot_full
1187    enable_llvm_default=yes
1189    mono_feature_disable_com='yes'
1190    mono_feature_disable_remoting='yes'
1191    mono_feature_disable_reflection_emit_save='yes'
1192    mono_feature_disable_reflection_emit='yes'
1193    mono_feature_disable_appdomains='yes'
1195    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1196    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1197    AOT_MODE="llvmonly"
1198 elif test x$with_runtime_preset = xfullaot; then
1199    DISABLE_MCS_DOCS_default=yes
1200    with_testing_aot_full_default=yes
1201    TEST_PROFILE=testing_aot_full
1203    mono_feature_disable_com='yes'
1204    mono_feature_disable_remoting='yes'
1205    mono_feature_disable_reflection_emit_save='yes'
1206    mono_feature_disable_reflection_emit='yes'
1207    mono_feature_disable_appdomains='yes'
1209    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1210    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1211    AOT_MODE="full"
1212 elif test x$with_runtime_preset = xfullaot_llvm; then
1213    DISABLE_MCS_DOCS_default=yes
1214    with_testing_aot_full_default=yes
1215    TEST_PROFILE=testing_aot_full
1217    mono_feature_disable_com='yes'
1218    mono_feature_disable_remoting='yes'
1219    mono_feature_disable_reflection_emit_save='yes'
1220    mono_feature_disable_reflection_emit='yes'
1221    mono_feature_disable_appdomains='yes'
1223    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1224    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1225    AOT_MODE="full"
1226 elif test x$with_runtime_preset = xhybridaot; then
1227    DISABLE_MCS_DOCS_default=yes
1228    with_testing_aot_hybrid_default=yes
1229    TEST_PROFILE=testing_aot_hybrid 
1231    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1232    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1233 elif test x$with_runtime_preset = xhybridaot_llvm; then
1234    DISABLE_MCS_DOCS_default=yes
1235    with_testing_aot_hybrid_default=yes
1236    TEST_PROFILE=testing_aot_hybrid
1238    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1239    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1240 elif test x$with_runtime_preset = xfullaotinterp; then
1241    with_testing_aot_full_interp_default=yes
1242    TEST_PROFILE=testing_aot_full_interp
1244    # mscorlib.dll aot compilation crashes
1245    mono_feature_disable_com='yes'
1247    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1248    AOT_RUN_FLAGS="--full-aot-interp"
1249 elif test x$with_runtime_preset = xaot; then
1250    with_profile4_x_default=yes
1252    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1253    AOT_RUN_FLAGS=""
1255    DISABLE_MCS_DOCS_default=yes
1256 elif test x$with_runtime_preset = xaot_llvm; then
1257    with_profile4_x_default=yes
1259    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1260    AOT_RUN_FLAGS=""
1262    DISABLE_MCS_DOCS_default=yes
1263 elif test x$with_runtime_preset = xwinaot; then
1264    DISABLE_MCS_DOCS_default=yes
1265    with_winaot_default=yes
1266    TEST_PROFILE=winaot
1268    mono_feature_disable_com='yes'
1269    mono_feature_disable_remoting='yes'
1270    mono_feature_disable_reflection_emit_save='yes'
1271    mono_feature_disable_reflection_emit='yes'
1272    mono_feature_disable_appdomains='yes'
1274    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1275    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1276    AOT_MODE="llvmonly"
1277 elif test x$with_runtime_preset = xorbis; then
1278    DISABLE_MCS_DOCS_default=yes
1279    with_orbis_default=yes
1280    TEST_PROFILE=orbis
1282    mono_feature_disable_com='yes'
1283    mono_feature_disable_remoting='yes'
1284    mono_feature_disable_reflection_emit_save='yes'
1285    mono_feature_disable_reflection_emit='yes'
1286    mono_feature_disable_appdomains='yes'
1288    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1289    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1290    AOT_MODE="full"
1291 elif test x$with_runtime_preset = xunreal; then
1292    DISABLE_MCS_DOCS_default=yes
1293    with_unreal_default=yes
1294    TEST_PROFILE=unreal
1296    mono_feature_disable_com='yes'
1297    mono_feature_disable_remoting='yes'
1298    mono_feature_disable_appdomains='no'
1300    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1301    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1302 elif test x$with_runtime_preset = xwasm; then
1303    DISABLE_MCS_DOCS_default=yes
1304    with_wasm_default=yes
1305    TEST_PROFILE=wasm
1307    mono_feature_disable_com='yes'
1308    mono_feature_disable_remoting='yes'
1309    mono_feature_disable_reflection_emit_save='yes'
1310    mono_feature_disable_reflection_emit='yes'
1311    mono_feature_disable_appdomains='yes'
1313    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1314    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1315 else
1316    with_profile4_x_default=yes
1319 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1320    AC_SUBST(AOT_BUILD_FLAGS)
1321    AC_SUBST(AOT_RUN_FLAGS)
1322    # For llvmonlycheck + fullaotcheck
1323    AC_SUBST(INVARIANT_AOT_OPTIONS)
1326 AC_SUBST(TEST_PROFILE)
1328 if test "x$with_profile4_x" = "xdefault"; then
1329    with_profile4_x=$with_profile4_x_default
1331 if test "x$with_monodroid" = "xdefault"; then
1332    with_monodroid=$with_monodroid_default
1334 if test "x$with_monotouch" = "xdefault"; then
1335    with_monotouch=$with_monotouch_default
1337 if test "x$with_monotouch_watch" = "xdefault"; then
1338    with_monotouch_watch=$with_monotouch_watch_default
1340 if test "x$with_monotouch_tv" = "xdefault"; then
1341    with_monotouch_tv=$with_monotouch_tv_default
1343 if test "x$with_bitcode" = "xdefault"; then
1344    with_bitcode=$with_bitcode_default
1346 if test "x$with_xammac" = "xdefault"; then
1347    with_xammac=$with_xammac_default
1349 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1350    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1352 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1353    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1355 if test "x$with_testing_aot_full" = "xdefault"; then
1356    with_testing_aot_full=$with_testing_aot_full_default
1358 if test "x$with_winaot" = "xdefault"; then
1359    with_winaot=$with_winaot_default
1361 if test "x$with_orbis" = "xdefault"; then
1362    with_orbis=$with_orbis_default
1364 if test "x$with_unreal" = "xdefault"; then
1365    with_unreal=$with_unreal_default
1367 if test "x$with_wasm" = "xdefault"; then
1368    with_wasm=$with_wasm_default
1372 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1373 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1374 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1375 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1376 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1377 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1378 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1379 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1380 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1381 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1382 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1383 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1384 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1385 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1386 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"])
1387 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1388 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1390 default_profile=net_4_x
1391 if test -z "$INSTALL_MONODROID_TRUE"; then :
1392    default_profile=monodroid
1394 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1395    default_profile=monotouch
1397 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1398    default_profile=xammac
1400 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1401    default_profile=testing_aot_full_interp
1403 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1404    default_profile=testing_aot_hybrid
1406 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1407    default_profile=testing_aot_full
1409 if test -z "$INSTALL_WINAOT_TRUE"; then :
1410    default_profile=winaot
1412 if test -z "$INSTALL_ORBIS_TRUE"; then :
1413    default_profile=orbis
1415 if test -z "$INSTALL_UNREAL_TRUE"; then :
1416    default_profile=unreal
1418 if test -z "$INSTALL_WASM_TRUE"; then :
1419    default_profile=wasm
1421 if test -z "$INSTALL_4_x_TRUE"; then :
1422    default_profile=net_4_x
1424 DEFAULT_PROFILE=$default_profile
1425 AC_SUBST(DEFAULT_PROFILE)
1428 # End build profile configuration
1431 if test x$USE_NLS = xprofile_default; then
1433         AC_MSG_CHECKING([NLS used])
1435         # We make the default value for USE_NLS
1436         # "no" on OSX because it isn't available on most
1437         # default OSX installs. The most common configurations will
1438         # all disable it, so this saves us typing.
1439         if test x$host_darwin = xyes; then
1440                 USE_NLS=no;
1441         else
1442                 USE_NLS=yes;
1443         fi
1445         AC_SUBST([USE_NLS])
1446         AC_MSG_RESULT([$USE_NLS])
1449 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1450      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1451      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1452          security, lldb, mdb, assert_messages, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1454         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1455                 eval "mono_feature_disable_$feature='yes'"
1456         done
1457         DISABLED_FEATURES=$enable_minimal
1458         disabled="Disabled:      $enable_minimal"
1459 ],[])
1461 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1463 if test "x$mono_feature_disable_aot" = "xyes"; then
1464         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1465         enable_system_aot=no
1466         AC_MSG_NOTICE([Disabled AOT compiler])
1469 if test "x$mono_feature_disable_profiler" = "xyes"; then
1470         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1471         AC_MSG_NOTICE([Disabled support for the profiler])
1473 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1475 if test "x$mono_feature_disable_decimal" = "xyes"; then
1476         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1477         AC_MSG_NOTICE([Disabled support for decimal])
1480 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1481         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1482         AC_MSG_NOTICE([Disabled support for P/Invoke])
1485 if test "x$mono_feature_disable_debug" = "xyes"; then
1486         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1487         AC_MSG_NOTICE([Disabled support for runtime debugging])
1490 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1491         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1492         mono_feature_disable_reflection_emit_save=yes
1493         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1496 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1497         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1498         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1501 if test "x$mono_feature_disable_large_code" = "xyes"; then
1502         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1503         AC_MSG_NOTICE([Disabled support for large assemblies])
1506 if test "x$mono_feature_disable_logging" = "xyes"; then
1507         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1508         AC_MSG_NOTICE([Disabled support for logging])
1511 if test "x$mono_feature_disable_com" = "xyes"; then
1512         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1513         AC_MSG_NOTICE([Disabled COM support])
1516 if test "x$mono_feature_disable_ssa" = "xyes"; then
1517         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1518         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1521 if test "x$mono_feature_disable_generics" = "xyes"; then
1522         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1523         AC_MSG_NOTICE([Disabled Generics Support])
1526 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1527         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1528         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1531 if test "x$mono_feature_disable_portability" = "xyes"; then
1532         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1533         AC_MSG_NOTICE([Disabled IO Portability layer])
1536 if test "x$mono_feature_disable_attach" = "xyes"; then
1537         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1538         AC_MSG_NOTICE([Disabled agent attach])
1541 if test "x$mono_feature_disable_verifier" = "xyes"; then
1542         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1543         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1546 if test "x$mono_feature_disable_jit" = "xyes"; then
1547         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1548         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1551 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1553 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1554         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1555         AC_MSG_NOTICE([Disabled the interpreter])
1558 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1560 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1561         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1564 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1566 if test "x$mono_feature_disable_simd" = "xyes"; then
1567         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1568         AC_MSG_NOTICE([Disabled SIMD support])
1571 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1572         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1573         AC_MSG_NOTICE([Disabled Soft Debugger.])
1576 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1578 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1579         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1580         AC_MSG_NOTICE([Disabled Performance Counters.])
1582 if test "x$mono_feature_disable_normalization" = "xyes"; then
1583         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1584         AC_MSG_NOTICE([Disabled String normalization support.])
1587 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1588 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1589         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1590         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1593 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1594         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1595         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1598 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1599         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1600         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1603 if test "x$mono_feature_disable_remoting" = "xyes"; then
1604         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1605         AC_MSG_NOTICE([Disabled remoting])
1608 if test "x$mono_feature_disable_security" = "xyes"; then
1609         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1610         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1613 if test "x$mono_feature_disable_lldb" = "xyes"; then
1614         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1615         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1618 if test "x$mono_feature_disable_mdb" = "xyes"; then
1619         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1620         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1623 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1624         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1625         AC_MSG_NOTICE([Disabled assertion messages.])
1628 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1629         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1630         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1634 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1635         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1636         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1639 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1640         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1641         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1644 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1645         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1646         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1649 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1650 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1652 has_extension_module=no
1653 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1655         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1656                 if test x$extension = xdefault ; then
1657                         has_extension_module=yes;
1658                 fi
1659         done
1660         if test x$enable_extension_module = xyes; then
1661                 has_extension_module=yes;
1662         fi
1663 ], [])
1665 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1667 if test x$has_extension_module != xno ; then
1668         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1669         AC_MSG_NOTICE([Enabling mono extension module.])
1672 # Deprecated
1673 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1675 AC_MSG_CHECKING(for visibility __attribute__)
1676 AC_COMPILE_IFELSE([
1677         AC_LANG_SOURCE([[
1678                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1679                 int main () { doit (); return 0; }
1680         ]])
1681 ], [
1682    have_visibility_hidden=yes
1683    AC_MSG_RESULT(yes)
1684 ], [
1685    have_visibility_hidden=no
1686    AC_MSG_RESULT(no)
1690 dnl Boehm GC configuration
1693 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1695 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1696 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1698 if test "x$support_boehm" = "xyes"; then
1700         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1701         if test x$enable_parallel_mark = xyes; then
1702                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1703         fi
1705         gc_msg=""
1706         LIBGC_CPPFLAGS=
1707         LIBGC_LIBS=
1708         LIBGC_STATIC_LIBS=
1709         libgc_dir=
1710         case "x$libgc" in
1711                 xincluded)
1712                         if test "x$support_boehm" = "xyes"; then
1713                                 libgc_dir=libgc
1714                         fi
1716                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1717                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1718                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1720                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1722                         if test x$target_win32 = xyes; then
1723                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1724                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1725                         fi
1727                         gc_msg="Included Boehm GC with typed GC"
1728                         if test x$enable_parallel_mark = xyes; then
1729                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1730                                 gc_msg="$gc_msg and parallel mark"
1731                         else
1732                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1733                         fi
1734                         ;;
1736                 xboehm|xbohem|xyes)
1737                         AC_MSG_WARN("External Boehm is no longer supported")
1738                         ;;
1740                 xsgen)
1741                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1742                         ;;
1744                 xnone)
1745                         AC_MSG_WARN("Compiling mono without GC.")
1746                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1747                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1748                         gc_msg="none"
1749                         ;;
1750                 *)
1751                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1752                         ;;
1753         esac
1755         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])
1756         if test "x$large_heap" = "xyes"; then
1757            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1758         fi
1760         AC_SUBST(LIBGC_CPPFLAGS)
1761         AC_SUBST(LIBGC_LIBS)
1762         AC_SUBST(LIBGC_STATIC_LIBS)
1763         AC_SUBST(libgc_dir)
1764         AC_SUBST(BOEHM_DEFINES)
1767 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1770 dnl End of Boehm GC Configuration
1773 dnl *************************************
1774 dnl *** Checks for zero length arrays ***
1775 dnl *************************************
1776 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1777 AC_TRY_COMPILE([
1778         struct s {
1779                 int  length;
1780                 char data [0];
1781         };
1782 ], [], [
1783         AC_MSG_RESULT(yes)
1784         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1785 ], [
1786         AC_MSG_RESULT(no)
1787         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1790 dnl ***********************************
1791 dnl *** Checks for signals
1792 dnl ***********************************
1793 AC_CHECK_HEADERS(signal.h)
1794 AC_CHECK_FUNCS(sigaction)
1795 AC_CHECK_FUNCS(kill)
1796 AC_CHECK_FUNCS(signal)
1798 # signal() is declared inline in Android headers
1799 # so we need to workaround it by overriding the check.
1800 if test x$platform_android = xyes; then
1801         AC_DEFINE(HAVE_SIGNAL,1)
1804 dnl ***********************************
1805 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1806 dnl ***********************************
1807 enable_gss=no;
1808 AC_MSG_CHECKING(for GSS/GSS.h)
1809 AC_TRY_COMPILE([
1810     #include <GSS/GSS.h>
1811 ], [
1813     AC_MSG_RESULT(yes)
1814     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1815     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1816     enable_gss=yes
1817 ], [
1818     AC_MSG_RESULT(no)
1821 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1822 AC_TRY_COMPILE([
1823     #include <gssapi/gssapi_ext.h>
1824 ], [
1826     AC_MSG_RESULT(yes)
1827     enable_gss=yes
1828 ], [
1829     AC_MSG_RESULT(no)
1832 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1833 AC_TRY_COMPILE([
1834     #include <gssapi/gssapi_ext.h>
1835     #include <gssapi/gssapi_krb5.h>
1836     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1837 ], [
1839     AC_MSG_RESULT(yes)
1840     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1841 ], [
1842     AC_MSG_RESULT(no)
1845 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1847 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1848 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1850 if test x$host_win32 = xno; then
1851         dnl *************************************
1852         dnl *** Checks for time capabilities ***
1853         dnl *************************************
1855         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1856         AC_TRY_COMPILE([#include <time.h>], [
1857                 const int foo = CLOCK_MONOTONIC;
1858         ],[
1859                 AC_MSG_RESULT(yes)
1860                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1861         ], [
1862                 AC_MSG_RESULT(no)
1863         ])
1865         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1866         AC_TRY_COMPILE([#include <time.h>], [
1867                 const int foo = CLOCK_MONOTONIC_COARSE;
1868         ],[
1869                 AC_MSG_RESULT(yes)
1870                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1871         ], [
1872                 AC_MSG_RESULT(no)
1873         ])
1875         AC_MSG_CHECKING(for CLOCK_REALTIME)
1876         AC_TRY_COMPILE([#include <time.h>], [
1877                 const int foo = CLOCK_REALTIME;
1878         ],[
1879                 AC_MSG_RESULT(yes)
1880                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1881         ], [
1882                 AC_MSG_RESULT(no)
1883         ])
1885         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1886         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1887         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1888         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1889         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1890         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1892         dnl hires monotonic clock support
1893         AC_SEARCH_LIBS(clock_gettime, rt)
1894         AC_CHECK_FUNCS(clock_nanosleep)
1896         dnl dynamic loader support
1897         AC_CHECK_FUNC(dlopen, DL_LIB="",
1898                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1899         )
1900         if test x$dl_support = xno; then
1901                 AC_MSG_WARN([No dynamic loading support available])
1902         else
1903                 LIBS="$LIBS $DL_LIB"
1904                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1905                 dnl from glib's configure.ac
1906                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1907                         mono_cv_uscore,[
1908                         AC_TRY_RUN([#include <dlfcn.h>
1909                         int mono_underscore_test (void) { return 42; }
1910                         int main() {
1911                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1912                           handle = dlopen ((void*)0, 0);
1913                           if (handle) {
1914                             f1 = dlsym (handle, "mono_underscore_test");
1915                             f2 = dlsym (handle, "_mono_underscore_test");
1916                           } return (!f2 || f1);
1917                         }],
1918                                 [mono_cv_uscore=yes],
1919                                 [mono_cv_uscore=no],
1920                         [])
1921                 ])
1922                 if test "x$mono_cv_uscore" = "xyes"; then
1923                         MONO_DL_NEED_USCORE=1
1924                 else
1925                         MONO_DL_NEED_USCORE=0
1926                 fi
1927                 AC_SUBST(MONO_DL_NEED_USCORE)
1928                 AC_CHECK_FUNC(dlerror)
1929         fi
1931         dnl ******************************************************************
1932         dnl *** Checks for the IKVM JNI interface library                  ***
1933         dnl ******************************************************************
1934         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])
1936         ikvm_native_dir=
1937         if test x$with_ikvm_native = xyes; then
1938                 ikvm_native_dir=ikvm-native
1939                 jdk_headers_found="IKVM Native"
1940         fi
1942         AC_SUBST(ikvm_native_dir)
1944         AC_CHECK_HEADERS(execinfo.h)
1946         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1948         AC_CHECK_FUNCS(getgrgid_r)
1949         AC_CHECK_FUNCS(getgrnam_r)
1950         AC_CHECK_FUNCS(getresuid)
1951         AC_CHECK_FUNCS(setresuid)
1952         AC_CHECK_FUNCS(kqueue)
1953         AC_CHECK_FUNCS(backtrace_symbols)
1954         AC_CHECK_FUNCS(mkstemp)
1955         AC_CHECK_FUNCS(mmap)
1956         AC_CHECK_FUNCS(madvise)
1957         AC_CHECK_FUNCS(getrusage)
1958         AC_CHECK_FUNCS(getpriority)
1959         AC_CHECK_FUNCS(setpriority)
1960         AC_CHECK_FUNCS(dl_iterate_phdr)
1961         AC_CHECK_FUNCS(dladdr)
1962         AC_CHECK_FUNCS(sysconf)
1963         AC_CHECK_FUNCS(getrlimit)
1964         AC_CHECK_FUNCS(prctl)
1965         AC_CHECK_FUNCS(arc4random)
1966         AC_CHECK_FUNCS(nl_langinfo)
1968         AC_CHECK_FUNCS(sched_getaffinity)
1969         AC_CHECK_FUNCS(sched_setaffinity)
1970         AC_CHECK_FUNCS(sched_getcpu)
1972         if test x$platform_android != xyes; then
1973                 AC_CHECK_FUNCS(getpwnam_r)
1974                 AC_CHECK_FUNCS(getpwuid_r)
1975         fi
1977         AC_FUNC_STRERROR_R()
1979         dnl ****************************************************************
1980         dnl *** Check for sched_setaffinity from glibc versions before   ***
1981         dnl *** 2.3.4. The older versions of the function only take 2    ***
1982         dnl *** parameters, not 3.                                       ***
1983         dnl ***                                                          ***
1984         dnl *** Because the interface change was not made in a minor     ***
1985         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1986         dnl *** won't always indicate the interface sched_affinity has.  ***
1987         dnl ****************************************************************
1988         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1989         AC_TRY_COMPILE([#include <sched.h>], [
1990             int mask = 1; 
1991             sched_setaffinity(0, &mask);
1992         ], [
1993                 # Yes, we have it...
1994                 AC_MSG_RESULT(yes)
1995                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1996         ], [
1997                 # We have the new, three-parameter version
1998                 AC_MSG_RESULT(no)
1999         ])
2000         AC_TRY_COMPILE([#include <sched.h>], [
2001              CPU_COUNT((void *) 0);
2002         ], [
2003                 AC_MSG_RESULT(yes)
2004                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2005         ], [
2006                 # We have the new, three-parameter version
2007                 AC_MSG_RESULT(no)
2008         ])
2010         dnl ******************************************************************
2011         dnl *** Check for large file support                               ***
2012         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2013         dnl ******************************************************************
2014         
2015         # Check that off_t can represent 2**63 - 1 correctly, working around
2016         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2017         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2018         large_offt=no
2019         AC_DEFUN([LARGE_FILES], [
2020                 large_CPPFLAGS=$CPPFLAGS
2021                 CPPFLAGS="$CPPFLAGS $1"
2022                 AC_TRY_COMPILE([
2023                         #include <sys/types.h>
2024                         #include <limits.h>
2025                 ], [
2026                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2027                         #define COMPILE_TIME_ASSERT(pred) \
2028                                 switch(0){case 0:case pred:;}
2029                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2030                 ], [
2031                         AC_MSG_RESULT(ok)
2032                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2033                         large_CPPFLAGS="$large_CPPFLAGS $1"
2034                         large_offt=yes
2035                 ], [
2036                         AC_MSG_RESULT(no)
2037                 ])
2038                 CPPFLAGS=$large_CPPFLAGS
2039         ])
2041         AC_MSG_CHECKING(if off_t is 64 bits wide)
2042         LARGE_FILES("")
2043         if test $large_offt = no; then
2044                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2045                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2046         fi
2047         if test $large_offt = no; then
2048                 AC_MSG_WARN([No 64 bit file size support available])
2049         fi
2050         
2051         dnl *****************************
2052         dnl *** Checks for libsocket  ***
2053         dnl *****************************
2054         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2056         case "$host" in
2057                 *-*-*freebsd*)
2058                         dnl *****************************
2059                         dnl *** Checks for libinotify ***
2060                         dnl *****************************
2061                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2062         esac
2064         dnl *******************************
2065         dnl *** Checks for MSG_NOSIGNAL ***
2066         dnl *******************************
2067         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2068         AC_TRY_COMPILE([#include <sys/socket.h>], [
2069                 int f = MSG_NOSIGNAL;
2070         ], [
2071                 # Yes, we have it...
2072                 AC_MSG_RESULT(yes)
2073                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2074         ], [
2075                 # We'll have to use signals
2076                 AC_MSG_RESULT(no)
2077         ])
2079         dnl *****************************
2080         dnl *** Checks for IPPROTO_IP ***
2081         dnl *****************************
2082         AC_MSG_CHECKING(for IPPROTO_IP)
2083         AC_TRY_COMPILE([#include <netinet/in.h>], [
2084                 int level = IPPROTO_IP;
2085         ], [
2086                 # Yes, we have it...
2087                 AC_MSG_RESULT(yes)
2088                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2089         ], [
2090                 # We'll have to use getprotobyname
2091                 AC_MSG_RESULT(no)
2092         ])
2094         dnl *******************************
2095         dnl *** Checks for IPPROTO_IPV6 ***
2096         dnl *******************************
2097         AC_MSG_CHECKING(for IPPROTO_IPV6)
2098         AC_TRY_COMPILE([#include <netinet/in.h>], [
2099                 int level = IPPROTO_IPV6;
2100         ], [
2101                 # Yes, we have it...
2102                 AC_MSG_RESULT(yes)
2103                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2104         ], [
2105                 # We'll have to use getprotobyname
2106                 AC_MSG_RESULT(no)
2107         ])
2109         dnl ******************************
2110         dnl *** Checks for IPPROTO_TCP ***
2111         dnl ******************************
2112         AC_MSG_CHECKING(for IPPROTO_TCP)
2113         AC_TRY_COMPILE([#include <netinet/in.h>], [
2114                 int level = IPPROTO_TCP;
2115         ], [
2116                 # Yes, we have it...
2117                 AC_MSG_RESULT(yes)
2118                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2119         ], [
2120                 # We'll have to use getprotobyname
2121                 AC_MSG_RESULT(no)
2122         ])
2124         dnl *****************************
2125         dnl *** Checks for SOL_IP     ***
2126         dnl *****************************
2127         AC_MSG_CHECKING(for SOL_IP)
2128         AC_TRY_COMPILE([#include <netdb.h>], [
2129                 int level = SOL_IP;
2130         ], [
2131                 # Yes, we have it...
2132                 AC_MSG_RESULT(yes)
2133                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2134         ], [
2135                 # We'll have to use getprotobyname
2136                 AC_MSG_RESULT(no)
2137         ])
2139         dnl *****************************
2140         dnl *** Checks for SOL_IPV6     ***
2141         dnl *****************************
2142         AC_MSG_CHECKING(for SOL_IPV6)
2143         AC_TRY_COMPILE([#include <netdb.h>], [
2144                 int level = SOL_IPV6;
2145         ], [
2146                 # Yes, we have it...
2147                 AC_MSG_RESULT(yes)
2148                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2149         ], [
2150                 # We'll have to use getprotobyname
2151                 AC_MSG_RESULT(no)
2152         ])
2154         dnl *****************************
2155         dnl *** Checks for SOL_TCP    ***
2156         dnl *****************************
2157         AC_MSG_CHECKING(for SOL_TCP)
2158         AC_TRY_COMPILE([#include <netdb.h>], [
2159                 int level = SOL_TCP;
2160         ], [
2161                 # Yes, we have it...
2162                 AC_MSG_RESULT(yes)
2163                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2164         ], [
2165                 # We'll have to use getprotobyname
2166                 AC_MSG_RESULT(no)
2167         ])
2169         dnl *****************************
2170         dnl *** Checks for IP_PKTINFO ***
2171         dnl *****************************
2172         AC_MSG_CHECKING(for IP_PKTINFO)
2173         AC_TRY_COMPILE([#include <linux/in.h>], [
2174                 int level = IP_PKTINFO;
2175         ], [
2176                 # Yes, we have it...
2177                 AC_MSG_RESULT(yes)
2178                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2179         ], [
2180                 AC_MSG_RESULT(no)
2181         ])
2183         dnl *****************************
2184         dnl *** Checks for IPV6_PKTINFO ***
2185         dnl *****************************
2186         AC_MSG_CHECKING(for IPV6_PKTINFO)
2187         AC_TRY_COMPILE([#include <netdb.h>], [
2188                 int level = IPV6_PKTINFO;
2189         ], [
2190                 # Yes, we have it...
2191                 AC_MSG_RESULT(yes)
2192                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2193         ], [
2194                 AC_MSG_RESULT(no)
2195         ])
2197         dnl **********************************
2198         dnl *** Checks for IP_DONTFRAG     ***
2199         dnl **********************************
2200         AC_MSG_CHECKING(for IP_DONTFRAG)
2201         AC_TRY_COMPILE([#include <netinet/in.h>], [
2202                 int level = IP_DONTFRAG;
2203         ], [
2204                 # Yes, we have it...
2205                 AC_MSG_RESULT(yes)
2206                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2207         ], [
2208                 AC_MSG_RESULT(no)
2209         ])
2211         dnl **********************************
2212         dnl *** Checks for IP_DONTFRAGMENT ***
2213         dnl **********************************
2214         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2215         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2216                 int level = IP_DONTFRAGMENT;
2217         ], [
2218                 # Yes, we have it...
2219                 AC_MSG_RESULT(yes)
2220                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2221         ], [
2222                 AC_MSG_RESULT(no)
2223         ])
2225         dnl **********************************
2226         dnl *** Checks for IP_MTU_DISCOVER ***
2227         dnl **********************************
2228         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2229         AC_TRY_COMPILE([#include <linux/in.h>], [
2230                 int level = IP_MTU_DISCOVER;
2231         ], [
2232                 # Yes, we have it...
2233                 AC_MSG_RESULT(yes)
2234                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2235         ], [
2236                 AC_MSG_RESULT(no)
2237         ])
2239         dnl **********************************
2240         dnl *** Checks for  IP_PMTUDISC_DO ***
2241         dnl **********************************
2242         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2243         AC_TRY_COMPILE([#include <linux/in.h>], [
2244                 int level = IP_PMTUDISC_DO;
2245         ], [
2246                 # Yes, we have it...
2247                 AC_MSG_RESULT(yes)
2248                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2249         ], [
2250                 AC_MSG_RESULT(no)
2251         ])
2253         dnl *********************************
2254         dnl *** Check for struct ip_mreqn ***
2255         dnl *********************************
2256         AC_MSG_CHECKING(for struct ip_mreqn)
2257         AC_TRY_COMPILE([#include <netinet/in.h>], [
2258                 struct ip_mreqn mreq;
2259                 mreq.imr_address.s_addr = 0;
2260         ], [
2261                 # Yes, we have it...
2262                 AC_MSG_RESULT(yes)
2263                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2264         ], [
2265                 # We'll just have to try and use struct ip_mreq
2266                 AC_MSG_RESULT(no)
2267                 AC_MSG_CHECKING(for struct ip_mreq)
2268                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2269                         struct ip_mreq mreq;
2270                         mreq.imr_interface.s_addr = 0;
2271                 ], [
2272                         # Yes, we have it...
2273                         AC_MSG_RESULT(yes)
2274                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2275                 ], [
2276                         # No multicast support
2277                         AC_MSG_RESULT(no)
2278                 ])
2279         ])
2280         
2281         dnl **********************************
2282         dnl *** Check for getaddrinfo ***
2283         dnl **********************************
2284         AC_MSG_CHECKING(for getaddrinfo)
2285                 AC_TRY_LINK([
2286                 #include <stdio.h>
2287                 #include <netdb.h>
2288         ], [
2289                 getaddrinfo(NULL,NULL,NULL,NULL);
2290         ], [
2291                 # Yes, we have it...
2292                 AC_MSG_RESULT(yes)
2293                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2294         ], [
2295                 AC_MSG_RESULT(no)
2296         ])
2298         dnl **********************************
2299         dnl *** Check for gethostbyname2_r ***
2300         dnl **********************************
2301         AC_MSG_CHECKING(for gethostbyname2_r)
2302                 AC_TRY_LINK([
2303                 #include <stdio.h>
2304                 #include <netdb.h>
2305         ], [
2307                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2308         ], [
2309                 # Yes, we have it...
2310                 AC_MSG_RESULT(yes)
2311                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2312         ], [
2313                 AC_MSG_RESULT(no)
2314         ])
2316         dnl **********************************
2317         dnl *** Check for gethostbyname2 ***
2318         dnl **********************************
2319         AC_MSG_CHECKING(for gethostbyname2)
2320                 AC_TRY_LINK([
2321                 #include <stdio.h>
2322                 #include <netdb.h>
2323         ], [
2324                 gethostbyname2(NULL,0);
2325         ], [
2326                 # Yes, we have it...
2327                 AC_MSG_RESULT(yes)
2328                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2329         ], [
2330                 AC_MSG_RESULT(no)
2331         ])
2333         dnl **********************************
2334         dnl *** Check for gethostbyname ***
2335         dnl **********************************
2336         AC_MSG_CHECKING(for gethostbyname)
2337                 AC_TRY_LINK([
2338                 #include <stdio.h>
2339                 #include <netdb.h>
2340         ], [
2341                 gethostbyname(NULL);
2342         ], [
2343                 # Yes, we have it...
2344                 AC_MSG_RESULT(yes)
2345                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2346         ], [
2347                 AC_MSG_RESULT(no)
2348         ])
2350         dnl **********************************
2351         dnl *** Check for getprotobyname ***
2352         dnl **********************************
2353         AC_MSG_CHECKING(for getprotobyname)
2354                 AC_TRY_LINK([
2355                 #include <stdio.h>
2356                 #include <netdb.h>
2357         ], [
2358                 getprotobyname(NULL);
2359         ], [
2360                 # Yes, we have it...
2361                 AC_MSG_RESULT(yes)
2362                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2363         ], [
2364                 AC_MSG_RESULT(no)
2365         ])
2367         dnl **********************************
2368         dnl *** Check for getprotobyname_r ***
2369         dnl **********************************
2370         AC_MSG_CHECKING(for getprotobyname_r)
2371                 AC_TRY_LINK([
2372                 #include <stdio.h>
2373                 #include <netdb.h>
2374         ], [
2375                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2376         ], [
2377                 # Yes, we have it...
2378                 AC_MSG_RESULT(yes)
2379                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2380         ], [
2381                 AC_MSG_RESULT(no)
2382         ])
2384         dnl **********************************
2385         dnl *** Check for getnameinfo ***
2386         dnl **********************************
2387         AC_MSG_CHECKING(for getnameinfo)
2388                 AC_TRY_LINK([
2389                 #include <stdio.h>
2390                 #include <netdb.h>
2391         ], [
2392                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2393         ], [
2394                 # Yes, we have it...
2395                 AC_MSG_RESULT(yes)
2396                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2397         ], [
2398                 AC_MSG_RESULT(no)
2399         ])
2402         dnl **********************************
2403         dnl *** Check for inet_ntop ***
2404         dnl **********************************
2405         AC_MSG_CHECKING(for inet_ntop)
2406                 AC_TRY_LINK([
2407                 #include <stdio.h>
2408                 #include <arpa/inet.h>
2409         ], [
2410                 inet_ntop (0, NULL, NULL, 0);
2411         ], [
2412                 # Yes, we have it...
2413                 AC_MSG_RESULT(yes)
2414                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2415         ], [
2416                 AC_MSG_RESULT(no)
2417         ])
2419         dnl *****************************
2420         dnl *** Checks for libnsl     ***
2421         dnl *****************************
2422         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2424         AC_CHECK_FUNCS(inet_pton inet_aton)
2426         dnl *****************************
2427         dnl *** Checks for libxnet    ***
2428         dnl *****************************
2429         case "${host}" in
2430                 *solaris* )
2431                         AC_MSG_CHECKING(for Solaris XPG4 support)
2432                         if test -f /usr/lib/libxnet.so; then
2433                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2434                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2435                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2436                                 LIBS="$LIBS -lxnet"
2437                                 AC_MSG_RESULT(yes)
2438                         else
2439                                 AC_MSG_RESULT(no)
2440                         fi
2442                         if test "$GCC" = "yes"; then
2443                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2444                         fi
2445                 ;;
2446         esac
2448         dnl *****************************
2449         dnl *** Checks for libpthread ***
2450         dnl *****************************
2451 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2452 # and libpthread does not exist
2454         case "${host}" in
2455                 *-*-*haiku*)
2456                         dnl Haiku has pthread in libroot (libc equiv)
2457                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2458                 ;;
2459                 *-*-*freebsd*)
2460                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2461                 ;;
2462                 *-*-*openbsd*)
2463                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2464                 ;;
2465                 *)
2466                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2467                 ;;
2468         esac
2469         AC_CHECK_HEADERS(pthread.h)
2470         AC_CHECK_HEADERS(pthread_np.h)
2471         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2472         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2473         AC_CHECK_FUNCS(pthread_kill)
2474         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2475         AC_TRY_COMPILE([ #include <pthread.h>], [
2476                 pthread_mutexattr_t attr;
2477                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2478         ], [
2479                 AC_MSG_RESULT(ok)
2480         ], [
2481                 AC_MSG_RESULT(no)
2482                 AC_ERROR(Posix system lacks support for recursive mutexes)
2483         ])
2484         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2485         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2486         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2487         AC_CHECK_FUNCS(mincore mlock munlock)
2489         dnl ***********************************
2490         dnl *** Checks for working __thread ***
2491         dnl ***********************************
2492         AC_MSG_CHECKING(for working __thread)
2493         if test "x$with_tls" != "x__thread"; then
2494                 AC_MSG_RESULT(disabled)
2495         elif test "x$cross_compiling" = "xyes"; then
2496                 AC_MSG_RESULT(cross compiling, assuming yes)
2497         else
2498                 AC_TRY_RUN([
2499                         #if defined(__APPLE__) && defined(__clang__)
2500                         #error "__thread does not currently work with clang on Mac OS X"
2501                         #endif
2502                         
2503                         #include <pthread.h>
2504                         __thread int i;
2505                         static int res1, res2;
2507                         void thread_main (void *arg)
2508                         {
2509                                 i = arg;
2510                                 sleep (1);
2511                                 if (arg == 1)
2512                                         res1 = (i == arg);
2513                                 else
2514                                         res2 = (i == arg);
2515                         }
2517                         int main () {
2518                                 pthread_t t1, t2;
2520                                 i = 5;
2522                                 pthread_create (&t1, NULL, thread_main, 1);
2523                                 pthread_create (&t2, NULL, thread_main, 2);
2525                                 pthread_join (t1, NULL);
2526                                 pthread_join (t2, NULL);
2528                                 return !(res1 + res2 == 2);
2529                         }
2530                 ], [
2531                                 AC_MSG_RESULT(yes)
2532                 ], [
2533                                 AC_MSG_RESULT(no)
2534                                 with_tls=pthread
2535                 ])
2536         fi
2538         dnl **************************************
2539         dnl *** Checks for working sigaltstack ***
2540         dnl **************************************
2541         AC_MSG_CHECKING(for working sigaltstack)
2542         if test "x$with_sigaltstack" != "xyes"; then
2543                 AC_MSG_RESULT(disabled)
2544         elif test "x$cross_compiling" = "xyes"; then
2545                 AC_MSG_RESULT(cross compiling, assuming yes)
2546         else
2547                 AC_TRY_RUN([
2548                         #include <stdio.h>
2549                         #include <stdlib.h>
2550                         #include <unistd.h>
2551                         #include <signal.h>
2552                         #include <pthread.h>
2553                         #include <sys/wait.h>
2554                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2555                         #define SA_STACK SA_ONSTACK
2556                         #endif
2557                         static void
2558                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2559                         {
2560                                 exit (0);
2561                         }
2563                         volatile char*__ptr = NULL;
2564                         static void *
2565                         loop (void *ignored)
2566                         {
2567                                 *__ptr = 0;
2568                                 return NULL;
2569                         }
2571                         static void
2572                         child ()
2573                         {
2574                                 struct sigaction sa;
2575                                 stack_t sas;
2576                                 pthread_t id;
2577                                 pthread_attr_t attr;
2579                                 sa.sa_sigaction = sigsegv_signal_handler;
2580                                 sigemptyset (&sa.sa_mask);
2581                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2582                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2583                                         perror ("sigaction");
2584                                         return;
2585                                 }
2587                                 /* x86 darwin deliver segfaults using SIGBUS */
2588                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2589                                         perror ("sigaction");
2590                                         return;
2591                                 }
2592                                 sas.ss_sp = malloc (SIGSTKSZ);
2593                                 sas.ss_size = SIGSTKSZ;
2594                                 sas.ss_flags = 0;
2595                                 if (sigaltstack (&sas, NULL) == -1) {
2596                                         perror ("sigaltstack");
2597                                         return;
2598                                 }
2600                                 pthread_attr_init (&attr);
2601                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2602                                         printf ("pthread_create\n");
2603                                         return;
2604                                 }
2606                                 sleep (100);
2607                         }
2609                         int
2610                         main ()
2611                         {
2612                                 pid_t son;
2613                                 int status;
2614                                 int i;
2616                                 son = fork ();
2617                                 if (son == -1) {
2618                                         return 1;
2619                                 }
2621                                 if (son == 0) {
2622                                         child ();
2623                                         return 0;
2624                                 }
2626                                 for (i = 0; i < 300; ++i) {
2627                                         waitpid (son, &status, WNOHANG);
2628                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2629                                                 return 0;
2630                                         usleep (10000);
2631                                 }
2633                                 kill (son, SIGKILL);
2634                                 return 1;
2635                         }
2637                 ], [
2638                                 AC_MSG_RESULT(yes)
2639                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2640                 ], [
2641                                 with_sigaltstack=no
2642                                 AC_MSG_RESULT(no)
2643                 ])
2644         fi
2646         dnl ********************************
2647         dnl *** Checks for semaphore lib ***
2648         dnl ********************************
2649         # 'Real Time' functions on Solaris
2650         # posix4 on Solaris 2.6
2651         # pthread (first!) on Linux
2652         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2654         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2655         AC_CHECK_FUNCS(shm_open)
2657         dnl ********************************
2658         dnl *** Checks for timezone stuff **
2659         dnl ********************************
2660         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2661                 AC_TRY_COMPILE([
2662                         #include <time.h>
2663                         ], [
2664                         struct tm tm;
2665                         tm.tm_gmtoff = 1;
2666                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2667         if test $ac_cv_struct_tm_gmtoff = yes; then
2668                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2669         else
2670                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2671                         AC_TRY_COMPILE([
2672                                 #include <time.h>
2673                         ], [
2674                                 timezone = 1;
2675                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2676                 if test $ac_cv_var_timezone = yes; then
2677                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2678                 else
2679                         AC_ERROR(unable to find a way to determine timezone)
2680                 fi
2681         fi
2683         dnl *********************************
2684         dnl *** Checks for math functions ***
2685         dnl *********************************
2686         AC_SEARCH_LIBS(sqrtf, m)
2688         dnl ****************************************************************
2689         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2690         dnl *** have it in the library (duh))                            ***
2691         dnl ****************************************************************
2692         AC_CHECK_FUNCS(poll)
2694         dnl **********************************
2695         dnl *** epoll                      ***
2696         dnl **********************************
2697         AC_CHECK_HEADERS(sys/epoll.h)
2698         haveepoll=no
2699         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2700         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2701                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2702         fi
2704         havekqueue=no
2706         AC_CHECK_HEADERS(sys/event.h)
2707         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2709         dnl **************************************
2710         dnl * Darwin has a race that prevents us from using reliably:
2711         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2712         dnl * Since kqueue is mostly used for scaling large web servers, 
2713         dnl * and very few folks run Mono on large web servers on OSX, falling
2714         dnl * back 
2715         dnl **************************************
2716         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2717                 if test "x$host_darwin" = "xno"; then
2718                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2719                 fi
2720         fi
2722         dnl ******************************
2723         dnl *** Checks for SIOCGIFCONF ***
2724         dnl ******************************
2725         AC_CHECK_HEADERS(sys/ioctl.h)
2726         AC_CHECK_HEADERS(net/if.h, [], [],
2727            [
2728            #ifdef HAVE_SYS_TYPES_H
2729            # include <sys/types.h>
2730            #endif
2731            #ifdef HAVE_SYS_SOCKET_H
2732            # include <sys/socket.h>
2733            #endif
2734            ])
2735         AC_MSG_CHECKING(for ifreq)
2736         AC_TRY_COMPILE([
2737                 #include <stdio.h>
2738                 #include <sys/ioctl.h>
2739                 #include <net/if.h>
2740                 ], [
2741                 struct ifconf ifc;
2742                 struct ifreq *ifr;
2743                 void *x;
2744                 ifc.ifc_len = 0;
2745                 ifc.ifc_buf = NULL;
2746                 x = (void *) &ifr->ifr_addr;
2747                 ],[
2748                         AC_MSG_RESULT(yes)
2749                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2750                 ], [
2751                         AC_MSG_RESULT(no)
2752                 ])
2753         dnl **********************************
2754         dnl ***     Checks for sin_len     ***
2755         dnl **********************************
2756         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2757         AC_TRY_COMPILE([
2758                 #include <netinet/in.h>
2759                 ], [
2760                 struct sockaddr_in saddr;
2761                 saddr.sin_len = sizeof (saddr);
2762                 ],[
2763                         AC_MSG_RESULT(yes)
2764                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2765                 ], [
2766                         AC_MSG_RESULT(no)
2767                 ])      
2768         dnl **********************************
2769         dnl ***    Checks for sin6_len     ***
2770         dnl **********************************
2771         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2772         AC_TRY_COMPILE([
2773                 #include <netinet/in.h>
2774                 ], [
2775                 struct sockaddr_in6 saddr6;
2776                 saddr6.sin6_len = sizeof (saddr6);
2777                 ],[
2778                         AC_MSG_RESULT(yes)
2779                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2780                 ], [
2781                         AC_MSG_RESULT(no)
2782                 ])
2783         dnl **********************************
2784         dnl *** Check for getifaddrs       ***
2785         dnl **********************************
2786         AC_MSG_CHECKING(for getifaddrs)
2787                 AC_TRY_LINK([
2788                 #include <stdio.h>
2789                 #include <sys/types.h>
2790                 #include <sys/socket.h>
2791                 #include <ifaddrs.h>
2792         ], [
2793                 getifaddrs(NULL);
2794         ], [
2795                 # Yes, we have it...
2796                 AC_MSG_RESULT(yes)
2797                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2798         ], [
2799                 AC_MSG_RESULT(no)
2800         ])
2801         dnl **********************************
2802         dnl *** Check for if_nametoindex   ***
2803         dnl **********************************
2804         AC_MSG_CHECKING(for if_nametoindex)
2805                 AC_TRY_LINK([
2806                 #include <stdio.h>
2807                 #include <sys/types.h>
2808                 #include <sys/socket.h>
2809                 #include <net/if.h>
2810         ], [
2811                 if_nametoindex(NULL);
2812         ], [
2813                 # Yes, we have it...
2814                 AC_MSG_RESULT(yes)
2815                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2816         ], [
2817                 AC_MSG_RESULT(no)
2818         ])
2819         dnl **********************************
2820         dnl *** Check for access ***
2821         dnl **********************************
2822         AC_MSG_CHECKING(for access)
2823                 AC_TRY_LINK([
2824                 #include <unistd.h>
2825         ], [
2826                 access(NULL,0);
2827         ], [
2828                 # Yes, we have it...
2829                 AC_MSG_RESULT(yes)
2830                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2831         ], [
2832                 AC_MSG_RESULT(no)
2833         ])
2834                         
2835         dnl **********************************
2836         dnl *** Checks for proclib         ***
2837         dnl **********************************
2838         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.)])
2839         dnl **********************************
2840         dnl *** Checks for MonoPosixHelper ***
2841         dnl **********************************
2842         AC_CHECK_HEADERS(checklist.h)
2843         AC_CHECK_HEADERS(pathconf.h)
2844         AC_CHECK_HEADERS(fstab.h)
2845         AC_CHECK_HEADERS(attr/xattr.h)
2846         AC_CHECK_HEADERS(sys/extattr.h)
2847         AC_CHECK_HEADERS(sys/sendfile.h)
2848         AC_CHECK_HEADERS(sys/statvfs.h)
2849         AC_CHECK_HEADERS(sys/statfs.h)
2850         AC_CHECK_HEADERS(sys/vfstab.h)
2851         AC_CHECK_HEADERS(sys/xattr.h)
2852         AC_CHECK_HEADERS(sys/mman.h)
2853         AC_CHECK_HEADERS(sys/param.h)
2854         AC_CHECK_HEADERS(sys/mount.h, [], [],
2855                 [
2856                 #ifdef HAVE_SYS_PARAM_H
2857                 # include <sys/param.h>
2858                 #endif
2859                 ])
2860         AC_CHECK_HEADERS(sys/mount.h)
2861         AC_CHECK_FUNCS(confstr)
2862         AC_CHECK_FUNCS(seekdir telldir)
2863         AC_CHECK_FUNCS(getdomainname)
2864         AC_CHECK_FUNCS(setdomainname)
2865         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2866         AC_CHECK_FUNCS(setgroups)
2867         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2868         AC_CHECK_FUNCS(getfsstat)
2869         AC_CHECK_FUNCS(lutimes futimes)
2870         AC_CHECK_FUNCS(mremap)
2871         AC_CHECK_FUNCS(remap_file_pages)
2872         AC_CHECK_FUNCS(posix_fadvise)
2873         AC_CHECK_FUNCS(posix_fallocate)
2874         AC_CHECK_FUNCS(posix_madvise)
2875         AC_CHECK_FUNCS(vsnprintf)
2876         AC_CHECK_FUNCS(sendfile)
2877         AC_CHECK_FUNCS(gethostid sethostid)
2878         AC_CHECK_FUNCS(sethostname)
2879         AC_CHECK_FUNCS(statfs)
2880         AC_CHECK_FUNCS(fstatfs)
2881         AC_CHECK_FUNCS(statvfs)
2882         AC_CHECK_FUNCS(fstatvfs)
2883         AC_CHECK_FUNCS(stime)
2884         AC_CHECK_FUNCS(ttyname_r)
2885         AC_CHECK_FUNCS(psignal)
2886         AC_CHECK_FUNCS(getlogin_r)
2887         AC_CHECK_FUNCS(lockf)
2888         AC_CHECK_FUNCS(swab)
2889         AC_CHECK_FUNCS(setusershell endusershell)
2890         AC_CHECK_FUNCS(futimens utimensat)
2891         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2892         AC_CHECK_FUNCS(readv writev preadv pwritev)
2893         AC_CHECK_FUNCS(setpgid)
2894         AC_CHECK_FUNCS(system)
2895         AC_CHECK_FUNCS(fork execv execve)
2896         AC_CHECK_FUNCS(accept4)
2897         AC_CHECK_FUNCS(localtime_r)
2898         AC_CHECK_FUNCS(mkdtemp)
2899         AC_CHECK_SIZEOF(size_t)
2900         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2901                 [#include <sys/types.h>
2902                  #include <sys/stat.h>
2903                  #include <unistd.h>])
2904         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2905                 [#include <sys/types.h>
2906                  #include <sys/stat.h>
2907                  #include <unistd.h>])
2908         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2909                 [#include <sys/time.h>])
2910         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2911                 [#include <sys/socket.h>])
2912         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2913                 [#include <unistd.h>
2914                  #include <fcntl.h>])
2915         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2916                 [#include <sys/uio.h>])
2917         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2918                 [#include <sys/socket.h>])
2919         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2920                 [#include <sys/poll.h>])
2921         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2922                 [#include <sys/socket.h>])
2923         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2924                 [#include <sys/socket.h>])
2925         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2926                 [#include <netinet/in.h>])
2927         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2928                 [#include <netinet/in.h>])
2929         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2930                 [#include <sys/un.h>])
2931         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2932                 [#include <sys/types.h>
2933                  #include <sys/stat.h>
2934                  #include <unistd.h>])
2935         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2936                 [#include <time.h>])
2937         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2938                 [#include <sys/time.h>
2939                  #include <sys/types.h>
2940                  #include <utime.h>])
2941         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2942                 [#include <sys/time.h>])
2943         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2944                 [#include <sys/types.h>
2945                  #include <utime.h>])
2946         AC_CHECK_MEMBERS(
2947                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2948                 [#include <sys/types.h>
2949                  #include <dirent.h>])
2950         AC_CHECK_MEMBERS(
2951                 [struct passwd.pw_gecos],,, 
2952                 [#include <sys/types.h>
2953                  #include <pwd.h>])
2954         AC_CHECK_MEMBERS(
2955                 [struct statfs.f_flags],,, 
2956                 [#include <sys/types.h>
2957                  #include <sys/vfs.h>])
2958         AC_CHECK_MEMBERS(
2959                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2960                 [#include <sys/types.h>
2961                  #include <sys/stat.h>
2962                  #include <unistd.h>])
2964         dnl Favour xattr through glibc, but use libattr if we have to
2965         AC_CHECK_FUNC(lsetxattr, ,
2966                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2967         )
2968         AC_SUBST(XATTR_LIB)
2970         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2971         AC_CHECK_MEMBERS(
2972                 [struct kinfo_proc.kp_proc],,, 
2973                 [#include <sys/types.h>
2974                  #include <sys/param.h>
2975                  #include <sys/sysctl.h>
2976                  #include <sys/proc.h>
2977                  ])
2979         dnl *********************************
2980         dnl *** Checks for Windows compilation ***
2981         dnl *********************************
2982         AC_CHECK_HEADERS(sys/time.h)
2983         AC_CHECK_HEADERS(sys/param.h)
2984         AC_CHECK_HEADERS(dirent.h)
2986         dnl ******************************************
2987         dnl *** Checks for OSX and iOS compilation ***
2988         dnl ******************************************
2989         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2991         dnl *********************************
2992         dnl *** Check for Console 2.0 I/O ***
2993         dnl *********************************
2994         AC_CHECK_HEADERS([curses.h])
2995         AC_CHECK_HEADERS([term.h], [], [],
2996         [#if HAVE_CURSES_H
2997          #include <curses.h>
2998          #endif
2999         ])
3000         AC_CHECK_HEADERS([termios.h])
3002         dnl *********************************
3003         dnl *** Checks for random         ***
3004         dnl *********************************
3005         if test x$host_darwin = xno; then
3006                 AC_CHECK_HEADERS(sys/random.h)
3007                 AC_CHECK_FUNCS(getrandom getentropy)
3008         fi
3010         dnl *********************************
3011         dnl *** Checks for Mono.Native  ***
3012         dnl *********************************
3014         AC_MSG_CHECKING(for linux/in.h)
3015         AC_TRY_COMPILE([
3016                 #include <sys/socket.h>
3017                 #include <linux/in.h>
3018         ], [
3019         ],[
3020                 AC_MSG_RESULT(yes)
3021                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3022         ], [
3023                 AC_MSG_RESULT(no)
3024         ])
3026         AC_MSG_CHECKING(for struct in_pktinfo)
3027         AC_TRY_COMPILE([
3028                 #ifdef HAVE_LINUX_IN_H
3029                 #include <sys/socket.h>
3030                 #include <linux/in.h>
3031                 #else
3032                 #include <netinet/in.h>
3033                 #endif
3034         ], [
3035                 struct in_pktinfo pktinfo;
3036         ],[
3037                 AC_MSG_RESULT(yes)
3038                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3039         ], [
3040                 AC_MSG_RESULT(no)
3041         ])
3043         AC_MSG_CHECKING(for struct ip_mreqn)
3044         AC_TRY_COMPILE([
3045                 #if HAVE_LINUX_IN_H
3046                 #include <sys/socket.h>
3047                 #include <linux/in.h>
3048                 #else
3049                 #include <netinet/in.h>
3050                 #endif
3051         ], [
3052                 struct ip_mreqn mreqn;
3053         ],[
3054                 AC_MSG_RESULT(yes)
3055                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3056         ], [
3057                 AC_MSG_RESULT(no)
3058         ])
3060         if test x$host_darwin = xno; then
3061                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3062         fi
3064         if test x$mono_native_platform_ios = xno; then
3065                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3066                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3067                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3068         fi
3070         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3071         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3072         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3073         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3074         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3075         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3076         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3077         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3078         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3079         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3080         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3081         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3082         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3083         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3084         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3085         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3086         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3087         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3088         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3090         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3091         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3093         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>]])
3094         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>]])
3095         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>]])
3096         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>]])
3097         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3098         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3099         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3101         AC_MSG_CHECKING(for struct statfs)
3102         AC_TRY_COMPILE([
3103                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3104                 #include <sys/mount.h>
3105                 #else
3106                 #include <sys/statfs.h>
3107                 #endif
3108         ], [
3109                 struct statfs;
3110         ],[
3111                 AC_MSG_RESULT(yes)
3112                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3113         ], [
3114                 AC_MSG_RESULT(no)
3115         ])
3117         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3118                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3119         fi
3121         AC_MSG_CHECKING(for readdir_r)
3122         AC_TRY_COMPILE([
3123                 #include <dirent.h>
3124         ], [
3125                 DIR* dir;
3126                 struct dirent* entry;
3127                 struct dirent* result;
3128                 readdir_r(dir, entry, &result);
3129         ],[
3130                 AC_MSG_RESULT(yes)
3131                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3132         ], [
3133                 AC_MSG_RESULT(no)
3134         ])
3136         AC_MSG_CHECKING(for kevent with void *data)
3137         AC_TRY_COMPILE([
3138                 #include <sys/types.h>
3139                 #include <sys/event.h>
3140         ], [
3141                 struct kevent event;
3142                 void* data;
3143                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3144         ],[
3145                 AC_MSG_RESULT(yes)
3146                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3147         ], [
3148                 AC_MSG_RESULT(no)
3149         ])
3151         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3152         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3154         AC_MSG_CHECKING(for sendfile with 4 arguments)
3155         AC_TRY_COMPILE([
3156                 #include <sys/sendfile.h>
3157         ], [
3158                 int result = sendfile(0, 0, 0, 0);
3159         ],[
3160                 AC_MSG_RESULT(yes)
3161                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3162         ], [
3163                 AC_MSG_RESULT(no)
3164         ])
3166         AC_MSG_CHECKING(for sendfile with 6 arguments)
3167         AC_TRY_LINK([
3168                 #include <stdlib.h>
3169                 #include <sys/types.h>
3170                 #include <sys/socket.h>
3171                 #include <sys/uio.h>
3172         ], [
3173                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3174         ],[
3175                 AC_MSG_RESULT(yes)
3176                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3177         ], [
3178                 AC_MSG_RESULT(no)
3179         ])
3181         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3182         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3183         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3184         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3186         ORIG_CFLAGS="$CFLAGS"
3187         CFLAGS="-Werror -Wsign-conversion"
3189         AC_MSG_CHECKING(for getnameinfo with signed flags)
3190         AC_TRY_COMPILE([
3191                 #include <sys/types.h>
3192                 #include <netdb.h>
3193         ], [
3194                 const struct sockaddr *addr;
3195                 socklen_t addrlen;
3196                 char *host;
3197                 socklen_t hostlen;
3198                 char *serv;
3199                 socklen_t servlen;
3200                 int flags;
3201                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3202         ],[
3203                 AC_MSG_RESULT(yes)
3204                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3205         ], [
3206                 AC_MSG_RESULT(no)
3207         ])
3209         CFLAGS="$ORIG_CFLAGS"
3211         if test "x$host_linux" = "xyes"; then
3212                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3213         else
3214                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3215         fi
3217         ORIG_CFLAGS="$CFLAGS"
3218         CFLAGS="-Werror -Wsign-conversion"
3220         AC_MSG_CHECKING(for bind with unsigned addrlen)
3221         AC_TRY_COMPILE([
3222                 #include <sys/socket.h>
3223         ], [
3224                 int fd;
3225                 struct sockaddr* addr;
3226                 socklen_t addrLen;
3227                 bind(fd, addr, addrLen);
3228         ],[
3229                 AC_MSG_RESULT(yes)
3230                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3231         ], [
3232                 AC_MSG_RESULT(no)
3233         ])
3235         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3236         AC_TRY_COMPILE([
3237                 #include <netinet/in.h>
3238                 #include <netinet/tcp.h>
3239         ], [
3240                 struct ipv6_mreq opt;
3241                 unsigned int index = 0;
3242                 opt.ipv6mr_interface = index;
3243         ],[
3244                 AC_MSG_RESULT(yes)
3245                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3246         ], [
3247                 AC_MSG_RESULT(no)
3248         ])
3250         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3251         AC_TRY_COMPILE([
3252                 #include <sys/inotify.h>
3253         ], [
3254                 intptr_t fd;
3255                 uint32_t wd;
3256                 int result = inotify_rm_watch(fd, wd);
3257         ],[
3258                 AC_MSG_RESULT(yes)
3259                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3260         ], [
3261                 AC_MSG_RESULT(no)
3262         ])
3264         CFLAGS="$ORIG_CFLAGS"
3266         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3267         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3268                 AC_MSG_RESULT(no)
3269         else
3270                 AC_TRY_RUN([
3271                         #include <sys/mman.h>
3272                         #include <fcntl.h>
3273                         #include <unistd.h>
3275                         int main ()
3276                         {
3277                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3278                                 if (fd == -1)
3279                                         return -1;
3281                                 shm_unlink("/mono_configure_shm_open");
3283                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3284                                 //       on at least the current version of Mac OS X
3286                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3287                                         return -1;
3289                                 return 0;
3290                         }
3291                 ],[
3292                         AC_MSG_RESULT(yes)
3293                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3294                 ], [
3295                         AC_MSG_RESULT(no)
3296                 ])
3297         fi
3299         AC_MSG_CHECKING(for getpriority with int who)
3300         AC_TRY_COMPILE([
3301                 #include <sys/resource.h>
3302         ], [
3303                 int which;
3304                 int who;
3305                 int result = getpriority(which, who);
3306         ],[
3307                 AC_MSG_RESULT(yes)
3308                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3309         ], [
3310                 AC_MSG_RESULT(no)
3311         ])
3313         AC_MSG_CHECKING(for kevent with int parameters)
3314         AC_TRY_COMPILE([
3315                 #include <sys/types.h>
3316                 #include <sys/event.h>
3317         ], [
3318                 int kg;
3319                 const struct kevent* chagelist;
3320                 int nchanges;
3321                 struct kevent* eventlist;
3322                 int nevents;
3323                 const struct timespec* timeout;
3324                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3325         ],[
3326                 AC_MSG_RESULT(yes)
3327                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3328         ], [
3329                 AC_MSG_RESULT(no)
3330         ])
3332         ORIG_CFLAGS="$CFLAGS"
3333         CFLAGS="-Werror -Wimplicit-function-declaration"
3335         AC_MSG_CHECKING(for mkstemps)
3336         AC_TRY_COMPILE([
3337                 #include <stdlib.h>
3338                 #include <unistd.h>
3339                 #include <string.h>
3340         ], [
3341                 char *template;
3342                 int suffixlen;
3343                 int result = mkstemps(template, suffixlen);
3344         ],[
3345                 AC_MSG_RESULT(yes)
3346                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3347                 have_mkstemps=yes
3348         ], [
3349                 AC_MSG_RESULT(no)
3350         ])
3352         CFLAGS="$ORIG_CFLAGS"
3354         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3355                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3356         fi
3358         AC_MSG_CHECKING(for tcp/var.h)
3359         AC_TRY_COMPILE([
3360                 #include <sys/types.h>
3361                 #include <sys/socketvar.h>
3362                 #include <netinet/ip.h>
3363                 #include <netinet/tcp.h>
3364                 #include <netinet/tcp_var.h>
3365         ], [
3366         ],[
3367                 AC_MSG_RESULT(yes)
3368                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3369         ], [
3370                 AC_MSG_RESULT(no)
3371         ])
3373         AC_CHECK_HEADERS([sys/cdefs.h])
3375         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3376         AC_TRY_COMPILE([
3377                 #ifdef HAVE_SYS_CDEFS_H
3378                 #include <sys/cdefs.h>
3379                 #endif
3380                 #include <netinet/tcp.h>
3381         ], [
3382                 int result = TCP_ESTABLISHED;
3383         ],[
3384                 AC_MSG_RESULT(yes)
3385                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3386         ], [
3387                 AC_MSG_RESULT(no)
3388         ])
3390         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3392         AC_MSG_CHECKING(for struct rt_msghdr)
3393         AC_TRY_COMPILE([
3394                 #include <sys/types.h>
3395                 #include <net/route.h>
3396         ], [
3397                 struct rt_msghdr;
3398         ],[
3399                 AC_MSG_RESULT(yes)
3400                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3401         ], [
3402                 AC_MSG_RESULT(no)
3403         ])
3405         AC_CHECK_HEADERS([sys/sysctl.h])
3406         AC_CHECK_HEADERS([linux/rtnetlink.h])
3408         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3409         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3410         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3412         ORIG_CFLAGS="$CFLAGS"
3413         CFLAGS="-Werror -Weverything"
3415         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3416         AC_TRY_COMPILE([
3417                 #include <unistd.h>
3418         ], [
3419                 size_t namelen = 20;
3420                 char name[20];
3421                 int result = getdomainname(name, namelen);
3422         ],[
3423                 AC_MSG_RESULT(yes)
3424                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3425         ], [
3426                 AC_MSG_RESULT(no)
3427         ])
3429         CFLAGS="$ORIG_CFLAGS"
3431         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3432         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3433         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3435         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
3436                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3437         elif test "x$host_linux" = "xyes"; then
3438                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3439         fi
3441         AC_CHECK_HEADERS([crt_externs.h])
3443         AC_MSG_CHECKING(for _NSGetEnviron)
3444         AC_TRY_COMPILE([
3445                 #include <crt_externs.h>
3446         ], [
3447                 char **result = *(_NSGetEnviron());
3448         ],[
3449                 AC_MSG_RESULT(yes)
3450                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3451         ], [
3452                 AC_MSG_RESULT(no)
3453         ])
3455         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3457 else
3458         dnl *********************************
3459         dnl *** Checks for Windows compilation ***
3460         dnl *********************************
3461         AC_CHECK_HEADERS(winternl.h)
3463         jdk_headers_found=no
3464         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3465         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3466         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3467         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3468         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3469         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3470         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3472         dnl *********************************
3473         dnl *** Check for struct ip_mreqn ***
3474         dnl *********************************
3475         AC_MSG_CHECKING(for struct ip_mreqn)
3476         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3477                 struct ip_mreqn mreq;
3478                 mreq.imr_address.s_addr = 0;
3479         ], [
3480                 # Yes, we have it...
3481                 AC_MSG_RESULT(yes)
3482                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3483         ], [
3484                 # We'll just have to try and use struct ip_mreq
3485                 AC_MSG_RESULT(no)
3486                 AC_MSG_CHECKING(for struct ip_mreq)
3487                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3488                         struct ip_mreq mreq;
3489                         mreq.imr_interface.s_addr = 0;
3490                 ], [
3491                         # Yes, we have it...
3492                         AC_MSG_RESULT(yes)
3493                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3494                 ], [
3495                         # No multicast support
3496                         AC_MSG_RESULT(no)
3497                 ])
3498         ])
3500         dnl **********************************
3501         dnl *** Check for getaddrinfo ***
3502         dnl **********************************
3503         AC_MSG_CHECKING(for getaddrinfo)
3504                 AC_TRY_LINK([
3505                 #include <stdio.h>
3506                 #include <winsock2.h>
3507                 #include <ws2tcpip.h>
3508         ], [
3509                 getaddrinfo(NULL,NULL,NULL,NULL);
3510         ], [
3511                 # Yes, we have it...
3512                 AC_MSG_RESULT(yes)
3513                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3514         ], [
3515                 AC_MSG_RESULT(no)
3516         ])
3518         dnl **********************************
3519         dnl *** Check for gethostbyname ***
3520         dnl **********************************
3521         AC_MSG_CHECKING(for gethostbyname)
3522                 AC_TRY_LINK([
3523                 #include <stdio.h>
3524                 #include <winsock2.h>
3525                 #include <ws2tcpip.h>
3526         ], [
3527                 gethostbyname(NULL);
3528         ], [
3529                 # Yes, we have it...
3530                 AC_MSG_RESULT(yes)
3531                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3532         ], [
3533                 AC_MSG_RESULT(no)
3534         ])
3536         dnl **********************************
3537         dnl *** Check for getprotobyname ***
3538         dnl **********************************
3539         AC_MSG_CHECKING(for getprotobyname)
3540                 AC_TRY_LINK([
3541                 #include <stdio.h>
3542                 #include <winsock2.h>
3543                 #include <ws2tcpip.h>
3544         ], [
3545                 getprotobyname(NULL);
3546         ], [
3547                 # Yes, we have it...
3548                 AC_MSG_RESULT(yes)
3549                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3550         ], [
3551                 AC_MSG_RESULT(no)
3552         ])
3554         dnl **********************************
3555         dnl *** Check for getnameinfo ***
3556         dnl **********************************
3557         AC_MSG_CHECKING(for getnameinfo)
3558                 AC_TRY_LINK([
3559                 #include <stdio.h>
3560                 #include <winsock2.h>
3561                 #include <ws2tcpip.h>
3562         ], [
3563                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3564         ], [
3565                 # Yes, we have it...
3566                 AC_MSG_RESULT(yes)
3567                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3568         ], [
3569                 AC_MSG_RESULT(no)
3570         ])
3572         dnl **********************************
3573         dnl *** Check for inet_ntop ***
3574         dnl **********************************
3575         AC_MSG_CHECKING(for inet_ntop)
3576                 AC_TRY_LINK([
3577                 #include <stdio.h>
3578                 #include <winsock2.h>
3579                 #include <ws2tcpip.h>
3580         ], [
3581                 inet_ntop (0, NULL, NULL, 0);
3582         ], [
3583                 # Yes, we have it...
3584                 AC_MSG_RESULT(yes)
3585                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3586         ], [
3587                 AC_MSG_RESULT(no)
3588         ])
3590         dnl **********************************
3591         dnl *** Check for inet_pton ***
3592         dnl **********************************
3593         AC_MSG_CHECKING(for inet_pton)
3594                 AC_TRY_LINK([
3595                 #include <stdio.h>
3596                 #include <winsock2.h>
3597                 #include <ws2tcpip.h>
3598         ], [
3599                 #ifndef inet_pton
3600                 (void) inet_pton;
3601                 #endif
3602                 inet_pton (0, NULL, NULL);
3603         ], [
3604                 # Yes, we have it...
3605                 AC_MSG_RESULT(yes)
3606                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3607         ], [
3608                 AC_MSG_RESULT(no)
3609         ])
3611         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3612         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3613         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3614         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3615         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3616         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3617         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3620 dnl socklen_t check
3621 AC_MSG_CHECKING(for socklen_t)
3622 AC_TRY_COMPILE([
3623 #include <sys/types.h>
3624 #include <sys/socket.h>
3626   socklen_t foo;
3628 ac_cv_c_socklen_t=yes
3629         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3630         AC_MSG_RESULT(yes)
3632         AC_MSG_RESULT(no)
3635 AC_CHECK_FUNCS(execvp)
3637 dnl ****************************
3638 dnl *** Look for /dev/random ***
3639 dnl ****************************
3641 AC_MSG_CHECKING([if usage of random device is requested])
3642 AC_ARG_ENABLE(dev-random,
3643 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3644 try_dev_random=$enableval, try_dev_random=yes)
3646 AC_MSG_RESULT($try_dev_random)
3648 case "{$build}" in
3650 dnl IBM i does not have /dev/random, use unblocking only
3652     *-*-os400*)
3653     NAME_DEV_RANDOM="/dev/urandom"
3654     ;;
3656 dnl Win32 does not have /dev/random, they have their own method...
3658     *-mingw*|*-*-cygwin*)
3659     ac_cv_have_dev_random=no
3660     ;;
3662 dnl Everywhere else, it's /dev/random
3664     *)
3665     NAME_DEV_RANDOM="/dev/random"
3666     ;;
3667 esac
3669 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3671 dnl Now check if the device actually exists
3673 if test "x$try_dev_random" = "xyes"; then
3674     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3675     [if test -r "$NAME_DEV_RANDOM" ; then
3676         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3677     if test "x$ac_cv_have_dev_random" = "xyes"; then
3678         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3679     fi
3680 else
3681     AC_MSG_CHECKING(for random device)
3682     ac_cv_have_dev_random=no
3683     AC_MSG_RESULT(has been disabled)
3686 if test "x$host_win32" = "xyes"; then
3687     AC_DEFINE(HAVE_CRYPT_RNG)
3690 if test "x$ac_cv_have_dev_random" = "xno" \
3691     && test "x$host_win32" = "xno"; then
3692     AC_MSG_WARN([[
3694 *** A system-provided entropy source was not found on this system.
3695 *** Because of this, the System.Security.Cryptography random number generator
3696 *** will throw a NotImplemented exception.
3698 *** If you are seeing this message, and you know your system DOES have an
3699 *** entropy collection in place, please report an issue on GitHub and
3700 *** provide information about the system and how to access the random device.
3702 *** Otherwise you can install either egd or prngd and set the environment
3703 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3704 ***]])
3707 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)
3709 AC_MSG_CHECKING([if big-arrays are to be enabled])
3710 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)
3711 if test "x$enable_big_arrays" = "xyes" ; then
3712     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3713         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3714     else
3715         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3716     fi
3718 AC_MSG_RESULT($enable_big_arrays)
3720 dnl **************
3721 dnl *** DTRACE ***
3722 dnl **************
3724 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3726 if test "x$enable_dtrace" = "xyes"; then
3727    if test "x$has_dtrace" = "xno"; then
3728           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3729    fi
3730    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3731    if test "x$DTRACE" = "xno"; then
3732           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3733           enable_dtrace=no
3734    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3735           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3736           enable_dtrace=no
3737    fi
3740 dtrace_g=no
3741 if test "x$enable_dtrace" = "xyes"; then
3742         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3743         DTRACEFLAGS=
3744         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3745                 case "$host" in
3746                         powerpc-*-darwin*)
3747                         DTRACEFLAGS="-arch ppc64"
3748                         ;;
3749                         i*86-*-darwin*)
3750                         DTRACEFLAGS="-arch x86_64"
3751                         ;;
3752                         *)
3753                         DTRACEFLAGS=-64
3754                         ;;
3755                 esac
3756         else
3757                 case "$host" in
3758                         powerpc-*-darwin*)
3759                         DTRACEFLAGS="-arch ppc"
3760                         ;;
3761                         i*86-*-darwin*)
3762                         DTRACEFLAGS="-arch i386"
3763                         ;;
3764                         *)
3765                         DTRACEFLAGS=-32
3766                         ;;
3767                 esac
3768         fi
3769         AC_SUBST(DTRACEFLAGS)
3770         case "$host" in
3771                 *-*-solaris*)
3772                 dtrace_g=yes
3773                 ;;
3774         esac
3775         AC_CHECK_HEADERS([sys/sdt.h])
3777 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3778 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3780 dnl **************************
3781 dnl *** AOT cross offsets  ***
3782 dnl **************************
3784 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3785     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3787 dnl **************
3788 dnl ***  LLVM  ***
3789 dnl **************
3791 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3792 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3793 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)
3794 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3795 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3797 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3799 if test "x$enable_llvm" = "xdefault"; then
3800    enable_llvm=$enable_llvm_default
3803 internal_llvm="no"
3804 if test "x$enable_llvm" = "xyes"; then
3805         if test "x$with_llvm" != "x"; then
3806                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3807                 if test x$host_win32 = xyes; then
3808                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3809                 fi
3810                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3811                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3812                 fi
3813         else
3814                 if test x$host_win32 = xyes; then
3815                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3816                 else
3817                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3818                 fi
3819                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3820                         internal_llvm=yes
3821                 fi
3822         fi
3824         LLVM_CODEGEN_LIBS="x86codegen"
3825         case "$target" in
3826         arm*)
3827                 LLVM_CODEGEN_LIBS="armcodegen"
3828                 ;;
3829         aarch64*)
3830                 LLVM_CODEGEN_LIBS="aarch64codegen"
3831                 ;;
3832         powerpc*)
3833                 LLVM_CODEGEN_LIBS="powerpccodegen"
3834                 ;;
3835         esac
3836         if test "x$host" != "x$target"; then
3837                 # No need for jit libs
3838                 LLVM_CODEGEN_LIBS=
3839         fi
3841         AC_SUBST(LLVM_CODEGEN_LIBS)
3842         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3843         
3844         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3845 fi # ENABLE_LLVM
3847 # AC_DEFINE necessary for correct restore behavior on Linux
3848 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3849 if test "x$internal_llvm" != "xno"; then
3850    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3853 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3854 if test "x$enable_llvm_asserts" != "xno"; then
3855    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3858 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3860 if test "x$enable_loadedllvm" = "xyes"; then
3861    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3863 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3865 if test "x$enable_llvm" = "xyes"; then
3866    enable_llvm_runtime=yes
3868 if test "x$enable_llvm_runtime" = "xyes"; then
3869    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3871 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3873 TARGET="unknown"
3874 ACCESS_UNALIGNED="yes"
3876 LIBC="libc.so.6"
3877 INTL="libc.so.6"
3878 SQLITE="libsqlite.so.0"
3879 SQLITE3="libsqlite3.so.0"
3880 X11="libX11.so"
3881 GDKX11="libgdk-x11-2.0.so.0"
3882 GTKX11="libgtk-x11-2.0.so.0"
3883 XINERAMA="libXinerama.so.1"
3885 sizeof_register="SIZEOF_VOID_P"
3887 jit_wanted=true
3888 boehm_supported=true
3889 BTLS_SUPPORTED=no
3890 BTLS_PLATFORM=
3892 case "$host" in
3893         wasm32*)
3894                 TARGET=WASM
3895                 arch_target=wasm
3896                 BTLS_SUPPORTED=no
3897                 ACCESS_UNALIGNED="no"
3898                 with_tls=pthread
3899                 ;;
3900         mips*)
3901                 TARGET=MIPS;
3902                 arch_target=mips;
3903                 with_tls=pthread;
3904                 ACCESS_UNALIGNED="no"
3906                 AC_MSG_CHECKING(for mips n32)
3907                 AC_TRY_COMPILE([],[
3908                 #if _MIPS_SIM != _ABIN32
3909                 #error Not mips n32
3910                 #endif
3911                 ],[
3912                 AC_MSG_RESULT(yes)
3913                 sizeof_register=8
3914                 ],[
3915                 AC_MSG_RESULT(no)
3916                 ])
3917                 ;;
3918         i*86-*-*)
3919                 TARGET=X86;
3920                 arch_target=x86;
3921                 case $host_os in
3922                   solaris*)
3923                         LIBC="libc.so"
3924                         INTL="libintl.so"
3925                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3926                                 TARGET=AMD64
3927                                 arch_target=amd64
3928                         fi
3930                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3931                         # int astruct __attribute__ ((visibility ("hidden")));
3932                         # void foo ()
3933                         # {
3934                         #       void *p = &astruct;
3935                         # }
3936                         # gcc -fPIC --shared -o libfoo.so foo.c
3937                         # yields:
3938                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3939                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3940                         have_visibility_hidden=no
3941                         ;;
3942                   mingw*|cygwin*)
3943                         have_visibility_hidden=no
3944                         BTLS_SUPPORTED=no
3945                         BTLS_PLATFORM=i386
3946                         ;;
3947                   haiku*)
3948                         LIBC=libroot.so
3949                         ;;
3950                   linux*)
3951                         AOT_SUPPORTED="yes"
3952                         BTLS_SUPPORTED=yes
3953                         BTLS_PLATFORM=i386
3954                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3955                         ;;
3956                   darwin*)
3957                         AOT_SUPPORTED="yes"
3958                         BTLS_SUPPORTED=yes
3959                         BTLS_PLATFORM=i386
3960                         ;;
3961                   openbsd*|freebsd*|kfreebsd-gnu*)
3962                         AOT_SUPPORTED="yes"
3963                         BTLS_SUPPORTED=yes
3964                         BTLS_PLATFORM=i386
3965                         ;;
3966                 esac
3967                 ;;
3968         x86_64-*-* | amd64-*-*)
3969                 TARGET=AMD64;
3970                 arch_target=amd64;
3971                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3972                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
3973                         sizeof_register=8
3974                 fi
3975                 case $host_os in
3976                   linux*)
3977                         AOT_SUPPORTED="yes"
3978                         BTLS_SUPPORTED=yes
3979                         BTLS_PLATFORM=x86_64
3980                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3981                         ;;
3982                   darwin*)
3983                         AOT_SUPPORTED="yes"
3984                         BTLS_SUPPORTED=yes
3985                         BTLS_PLATFORM=x86_64
3986                         boehm_supported=false
3987                         ;;
3988                   openbsd*|freebsd*|kfreebsd-gnu*)
3989                         AOT_SUPPORTED="yes"
3990                         BTLS_SUPPORTED=yes
3991                         BTLS_PLATFORM=x86_64
3992                         ;;
3993                   mingw*|cygwin*)
3994                         BTLS_SUPPORTED=no
3995                         BTLS_PLATFORM=x86_64
3996                         ;;
3997                 esac
3998                 ;;
3999         sparc*-*-*)
4000                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4001                    TARGET=SPARC64
4002                 else
4003                         TARGET=SPARC
4004                 fi
4005                 arch_target=sparc;
4006                 ACCESS_UNALIGNED="no"
4007                 case $host_os in
4008                   linux*) ;;
4009                   *)
4010                         LIBC="libc.so"
4011                         INTL="libintl.so"
4012                 esac
4013                 if test x"$GCC" = xyes; then
4014                         # We don't support v8 cpus
4015                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4016                 fi
4017                 if test x"$AR" = xfalse; then
4018                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4019                 fi
4020                 ;;
4021         *-mingw*|*-*-cygwin*)
4022                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4023                 have_visibility_hidden=no
4024                 INTL="intl"
4025                 ;;
4026         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4027         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4028         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4029                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4030                         TARGET=POWERPC64;
4031                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4032                         if ! (echo $CC | grep -q -- 'clang'); then
4033                                 CFLAGS="$CFLAGS -mminimal-toc"
4034                         fi
4035                 else
4036                         TARGET=POWERPC;
4037                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4038                 fi
4039                 arch_target=ppc;
4040                 case $host_os in
4041                   aix*|os400*)
4042                         BTLS_SUPPORTED=yes
4043                         BTLS_PLATFORM=powerpc
4044                         dnl on AIX/PASE, shared libraries can be inside archives
4045                         dnl if they are, we specify them by lib.a(lib.so)
4046                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4047                         LIBC="libc.a(shr_64.o)"
4048                         INTL="libintl.a(libintl.so.8)"
4049                         ;;
4050                   linux*)
4051                         BTLS_SUPPORTED=yes
4052                         BTLS_PLATFORM=powerpc
4053                         ;;
4054                 esac
4055                 ;;
4056         armv7k-*-darwin*)
4057                 TARGET=ARM;
4058                 TARGET_SYS=WATCHOS
4059                 arch_target=arm;
4060                 arm_fpu=VFP_HARD
4061                 ACCESS_UNALIGNED="no"
4062                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4063                 ;;
4065         arm*-darwin*)
4066                 TARGET=ARM;
4067                 arch_target=arm;
4068                 ACCESS_UNALIGNED="no"
4069                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4070                 ;;
4071         arm*-linux*)
4072                 TARGET=ARM;
4073                 arch_target=arm;
4074                 ACCESS_UNALIGNED="no"
4075                 AOT_SUPPORTED="yes"
4076                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4077                 BTLS_SUPPORTED=yes
4078                 BTLS_PLATFORM=arm
4079                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4080                 case "$target" in
4081                 arm*-linux*-gnueabi)
4082                         BTLS_PLATFORM=armsoft
4083                         ;;
4084                 esac
4085                 ;;
4086         arm*-netbsd*-eabi*)
4087                 TARGET=ARM;
4088                 arch_target=arm;
4089                 ACCESS_UNALIGNED="no"
4090                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4091                 ;;
4092         aarch64-*)
4093                 # https://lkml.org/lkml/2012/7/15/133
4094                 TARGET=ARM64
4095                 arch_target=arm64
4096                 boehm_supported=false
4097                 AOT_SUPPORTED="yes"
4098                 BTLS_SUPPORTED=yes
4099                 BTLS_PLATFORM=aarch64
4100                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4101                 ;;
4102         s390x-*-linux*)
4103                 TARGET=S390X;
4104                 arch_target=s390x;
4105                 ACCESS_UNALIGNED="yes"
4106                 BTLS_SUPPORTED=yes
4107                 BTLS_PLATFORM=s390x
4108                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4109                 ;;
4110         riscv32-*)
4111                 TARGET=RISCV32
4112                 ACCESS_UNALIGNED=no
4113                 AOT_SUPPORTED=no
4114                 BTLS_SUPPORTED=yes
4115                 BTLS_PLATFORM=riscv32
4116                 arch_target=riscv32
4117                 boehm_supported=false
4118                 ;;
4119         riscv64*)
4120                 TARGET=RISCV64
4121                 ACCESS_UNALIGNED=no
4122                 AOT_SUPPORTED=no
4123                 BTLS_SUPPORTED=yes
4124                 BTLS_PLATFORM=riscv64
4125                 arch_target=riscv64
4126                 boehm_supported=false
4127                 ;;
4128 esac
4130 HOST=$TARGET
4132 if test "x$host" != "x$target"; then
4133    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4134    enable_mcs_build=no
4135    enable_support_build=no
4136    BTLS_SUPPORTED=no
4137    # Can't use tls, since it depends on the runtime detection of tls offsets
4138    # in mono-compiler.h
4139    with_tls=pthread
4140    target_mach=no
4141    case "$target" in
4142    wasm32*)
4143                 TARGET=WASM
4144                 arch_target=wasm
4145                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4146                 ;;
4147    arm*-darwin*)
4148                 TARGET=ARM;
4149                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4150                 case "$target" in
4151                 armv7k-*)
4152                         arm_fpu=VFP_HARD
4153                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4154                         ;;
4155                 esac            
4156                 ;;
4157    powerpc64-ps3-linux-gnu)
4158                 TARGET=POWERPC64
4159                 arch_target=powerpc64
4160                 AC_DEFINE(TARGET_PS3, 1, [...])
4161                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4162                 # uses this define
4163                 AC_DEFINE(__mono_ppc64__, 1, [...])
4164                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4165                 sizeof_register=8
4166                 target_byte_order=G_BIG_ENDIAN
4167                 ;;
4168    powerpc64-xbox360-linux-gnu)
4169                 TARGET=POWERPC64
4170                 arch_target=powerpc64
4171                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4172                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4173                 # uses this define
4174                 sizeof_register=8
4175                 target_byte_order=G_BIG_ENDIAN
4176                 ;;
4177    arm*-linux-*)
4178                 TARGET=ARM;
4179                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4180                 ;;
4181    arm*-netbsd*-eabi*)
4182                 TARGET=ARM;
4183                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4184                 ;;
4185    i686*-linux-*)
4186                 TARGET=X86;
4187                 ;;
4188    i*86-apple-*)
4189                 TARGET=X86;
4190                 ;;
4191    x86_64*-linux-*)
4192                 TARGET=AMD64;
4193                 ;;
4194    x86_64-ps4-freebsd)
4195                 TARGET=AMD64;
4196                 AC_DEFINE(TARGET_PS4, 1, [...])
4197                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4198                 CPPFLAGS="$CPPFLAGS"
4199                 target_win32=no
4200                 ;;
4201    aarch64*-linux-*)
4202                 TARGET=ARM64;
4203                 ;;
4204         aarch64-*)
4205                 TARGET=ARM64
4206                 ;;
4207         riscv32*)
4208                 TARGET=RISCV32
4209                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4210                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4211                 arch_target=riscv32
4212                 target_mach=no
4213                 with_tls=pthread
4214                 ;;
4215         riscv64*)
4216                 TARGET=RISCV64
4217                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4218                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4219                 arch_target=riscv64
4220                 target_mach=no
4221                 with_tls=pthread
4222                 ;;
4223         *)
4224                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4225         esac
4227         case "$target" in
4228         *-darwin*)
4229                 target_mach=yes
4230                 ;;
4231         *-linux-android*)
4232                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4233                 ;;
4234         esac
4237 case "$TARGET" in
4238 WASM)
4239         AC_DEFINE(TARGET_WASM, 1, [...])
4240         arch_target=wasm
4241         target_sizeof_void_p=4
4242         ;;
4243 X86)
4244         AC_DEFINE(TARGET_X86, 1, [...])
4245         arch_target=x86
4246         target_sizeof_void_p=4
4247         ;;
4248 AMD64)
4249         AC_DEFINE(TARGET_AMD64, 1, [...])
4250         arch_target=amd64
4251         ;;
4252 ARM)
4253         AC_DEFINE(TARGET_ARM, 1, [...])
4254         arch_target=arm
4255         ACCESS_UNALIGNED="no"
4256         target_sizeof_void_p=4
4257         ;;
4258 ARM64)
4259         AC_DEFINE(TARGET_ARM64, 1, [...])
4260         arch_target=arm64
4261         ;;
4262 POWERPC)
4263         AC_DEFINE(TARGET_POWERPC, 1, [...])
4264         ;;
4265 POWERPC64)
4266         AC_DEFINE(TARGET_POWERPC, 1, [...])
4267         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4268         ;;
4269 S390X)
4270         AC_DEFINE(TARGET_S390X, 1, [...])
4271         ;;
4272 MIPS)
4273         AC_DEFINE(TARGET_MIPS, 1, [...])
4274         ;;
4275 SPARC)
4276         AC_DEFINE(TARGET_SPARC, 1, [...])
4277         ;;
4278 SPARC64)
4279         AC_DEFINE(TARGET_SPARC64, 1, [...])
4280         ;;
4281 RISCV32)
4282         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4283         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4284         ;;
4285 RISCV64)
4286         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4287         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4288         ;;
4289 esac
4291 case "$HOST" in
4292 WASM)
4293         AC_DEFINE(HOST_WASM, 1, [...])
4294         ;;
4295 X86)
4296         AC_DEFINE(HOST_X86, 1, [...])
4297         ;;
4298 AMD64)
4299         AC_DEFINE(HOST_AMD64, 1, [...])
4300         ;;
4301 ARM)
4302         AC_DEFINE(HOST_ARM, 1, [...])
4303         ;;
4304 ARM64)
4305         AC_DEFINE(HOST_ARM64, 1, [...])
4306         ;;
4307 POWERPC)
4308         AC_DEFINE(HOST_POWERPC, 1, [...])
4309         ;;
4310 POWERPC64)
4311         AC_DEFINE(HOST_POWERPC, 1, [...])
4312         AC_DEFINE(HOST_POWERPC64, 1, [...])
4313         ;;
4314 S390X)
4315         AC_DEFINE(HOST_S390X, 1, [...])
4316         ;;
4317 MIPS)
4318         AC_DEFINE(HOST_MIPS, 1, [...])
4319         ;;
4320 SPARC)
4321         AC_DEFINE(HOST_SPARC, 1, [...])
4322         ;;
4323 SPARC64)
4324         AC_DEFINE(HOST_SPARC64, 1, [...])
4325         ;;
4326 RISCV32)
4327         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4328         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4329         ;;
4330 RISCV64)
4331         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4332         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4333         ;;
4334 esac
4336 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4337 case "$HOST" in
4338 X86 | AMD64 | ARM | ARM64)
4339         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4340         ;;
4341 esac
4343 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4344 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4346 dnl *************
4347 dnl *** VTUNE ***
4348 dnl *************
4350 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4351 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4353 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4355 if test "x$enable_vtune" = "xyes"; then
4356         if test "x$with_vtune" = "x"; then
4357                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4358         else
4359                 VTUNE_PATH=$with_vtune
4360         fi
4361         VTUNE_INCLUDE=$VTUNE_PATH/include
4362         case "$TARGET" in
4363         X86)
4364                 VTUNE_LIB=$VTUNE_PATH/lib32
4365                 ;;
4366         AMD64)
4367                 VTUNE_LIB=$VTUNE_PATH/lib64
4368                 ;;
4369         *)
4370                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4371                 ;;
4372         esac
4373         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4374                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4375         fi
4376         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4377                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4378         fi
4380         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4381         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4383         AC_SUBST(VTUNE_LIBS)
4384         AC_SUBST(VTUNE_CFLAGS)
4386 dnl Use GCC atomic ops if they work on the target.
4387 if test x$GCC = "xyes"; then
4388         case $TARGET in
4389         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4390                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4391                 ;;
4392         esac
4395 if test "x$target_mach" = "xyes"; then
4397    if test "x$TARGET_SYS" = "xWATCHOS"; then
4398           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4399           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4400           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4401           BTLS_SUPPORTED=no
4402    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4403           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4404           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4405           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4406           BTLS_SUPPORTED=no
4407           target_ios=yes
4408    else
4409        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4410        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4411        #error fail this for ios
4412        #endif
4413        ], [
4414                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4415           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4416           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4417           target_osx=yes
4418        ], [
4419           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4420           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4421           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4422           BTLS_SUPPORTED=no
4423                   target_ios=yes
4424        ])
4425         fi
4426    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4429 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4431 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4433 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4434    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4435 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4436    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4437 else
4438    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4441 if test "x$target_sizeof_void_p" != "x"; then
4442    AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4443    # This is true for all the current cross-compiling targets
4444    AC_DEFINE(SIZEOF_REGISTER,TARGET_SIZEOF_VOID_P,[size of target machine integer registers])
4445 else
4446    AC_DEFINE(TARGET_SIZEOF_VOID_P,SIZEOF_VOID_P,[wordsize of target])
4447    if test "x$sizeof_register" = "x4"; then
4448       AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4449    elif test "x$sizeof_register" = "x8"; then
4450       AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4451    else
4452       AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of target machine integer registers])
4453    fi
4456 if test "x$have_visibility_hidden" = "xyes"; then
4457    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4460 if test "x$have_deprecated" = "xyes"; then
4461    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4464 dnl 
4465 dnl Simple Generational checks (sgen)
4467 SGEN_DEFINES=
4468 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4469 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4470 if test x$buildsgen = xyes; then
4471    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4472    SGEN_DEFINES="-DHAVE_SGEN_GC"
4474         conc_gc_msg=""
4475    if test x$with_sgen_default_concurrent != xno; then
4476        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4477            conc_gc_msg=" (concurrent by default)"
4478    fi
4480    if test "x$gc_msg" = "x"; then
4481       gc_msg="sgen$conc_gc_msg"
4482    else
4483       gc_msg="sgen$conc_gc_msg and $gc_msg"
4484    fi
4486 AC_SUBST(SGEN_DEFINES)
4487 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4489 jit_status="Building and using the JIT"
4491 libsuffix=".so"
4493 case "$host" in
4494      *-*-darwin*)
4495         libsuffix=".dylib"
4496         LIBC="libc.dylib"
4497         INTL="libintl.dylib"
4498         SQLITE="libsqlite.0.dylib"
4499         SQLITE3="libsqlite3.0.dylib"
4500         X11="libX11.dylib"
4501         GDKX11="libgdk-x11-2.0.dylib"
4502         GTKX11="libgtk-x11-2.0.dylib"
4503         ;;
4504      *-*-*netbsd*)
4505         LIBC="libc.so"
4506         INTL="libintl.so"
4507         SQLITE="libsqlite.so"
4508         SQLITE3="libsqlite3.so"
4509         ;;
4510      *-*-kfreebsd*-gnu)
4511         LIBC="libc.so.0.1"
4512         INTL="libc.so.0.1"
4513         X11="libX11.so.6"
4514         ;;
4515     *-*-*freebsd*)
4516         LIBC="libc.so.7"
4517         INTL="libintl.so"
4518         SQLITE="libsqlite.so"
4519         SQLITE3="libsqlite3.so"
4520         ;;
4521     *-*-*openbsd*)
4522         LIBC="libc.so"
4523         INTL="libintl.so"
4524         SQLITE="libsqlite.so"
4525         SQLITE3="libsqlite3.so"
4526         ;;
4527     *-*-*linux*)
4528         AC_PATH_X
4529         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4530         AC_MSG_CHECKING(for the soname of libX11.so)
4531         for i in $x_libraries $dlsearch_path; do
4532                 for r in 4 5 6; do
4533                         if test -f $i/libX11.so.$r; then
4534                                 X11=libX11.so.$r
4535                                 AC_MSG_RESULT($X11)
4536                         fi
4537                 done
4538         done
4539         
4540         if test "x$X11" = "xlibX11.so"; then
4541                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4542                 X11=libX11.so.6
4543         fi
4544         ;;
4545 esac
4547 AC_SUBST(libsuffix)
4549 ######################################
4550 # EGLIB CHECKS
4551 ######################################
4553 GNUC_PRETTY=
4554 GNUC_UNUSED=
4555 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4556 if test x$GCC = xyes; then
4557    GNUC_UNUSED='__attribute__((__unused__))'
4558    GNUC_NORETURN='__attribute__((__noreturn__))'
4559    case $host_cpu in
4560      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4561    esac
4563 AC_SUBST(GNUC_PRETTY)
4564 AC_SUBST(GNUC_UNUSED)
4565 AC_SUBST(GNUC_NORETURN)
4566 AC_SUBST(BREAKPOINT)
4568 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4570 case $host in
4571 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4572     PATHSEP='\\'
4573     SEARCHSEP=';'
4574     OS="WIN32"
4575     PIDTYPE='void *'
4576     ;;
4578     PATHSEP='/'
4579     SEARCHSEP=':'
4580     OS="UNIX"
4581     PIDTYPE='int'
4582     ;;
4583 esac
4585 case $host in
4586         *-*-solaris*)
4587         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4588         ;;
4589 esac
4591 case $target in
4592 arm*-darwin*|aarch64*-*|riscv*)
4593     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4594     ;;
4595 i*86-*-darwin*)
4596     ORDER=G_LITTLE_ENDIAN
4597     ;;
4598 *-*-haiku*)
4599     LDFLAGS="$LDFLAGS -ltextencoding"
4600     ;;
4601 *-*-openbsd*)
4602     CFLAGS="$CFLAGS -pthread"
4603     LDFLAGS="$LDFLAGS -pthread"
4604     ;;
4605 esac
4607 AC_SUBST(ORDER)
4608 AC_SUBST(CFLAGS)
4609 AC_SUBST(PATHSEP)
4610 AC_SUBST(SEARCHSEP)
4611 AC_SUBST(OS)
4612 AC_SUBST(PIDTYPE)
4614 # Defined for all targets/platforms using classic Windows API support.
4615 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4616 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4618 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4619 AC_CHECK_FUNCS(getrlimit)
4620 AC_CHECK_FUNCS(fork execv execve)
4622 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4624 if test x$with_overridable_allocators = xyes; then
4625         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4626   AC_MSG_NOTICE([Overridable allocator support enabled])
4627 else
4628   AC_MSG_NOTICE([Overridable allocator support disabled])
4632 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4633 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4634 # removed once support for 10.6 is dropped.
4636 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4638 if test x$target_osx = xyes; then
4639 AC_CHECK_FUNCS(getpwuid_r)
4640 elif test x$target_ios = xno; then
4641 AC_CHECK_FUNCS(strndup getpwuid_r)
4644 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4646 AC_SEARCH_LIBS(sqrtf, m)
4648 # nanosleep may not be part of libc, also search it in other libraries
4649 AC_SEARCH_LIBS(nanosleep, rt)
4651 AC_SEARCH_LIBS(dlopen, dl)
4652 old_ldflags="${LDFLAGS}"
4653 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4654 if test $lt_cv_prog_gnu_ld = yes; then
4655         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4656 else
4657         case $host in
4658         *-*-aix*|*-*-os400*)
4659                 ;;
4660         *)
4661                 dnl Try to use export-dynamic anyways
4662                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4663                 ;;
4664         esac
4666 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4667 if test $found_export_dynamic = no; then
4668         LDFLAGS="${old_ldflags}"
4671 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4672 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4673 AC_CHECK_LIB(iconv, iconv_open)
4674 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4675 AC_SUBST(HAVE_ALLOCA_H)
4677 # Get the exact type of size_t, not just its size.
4678 # This is so we can find an exact printf format among u, lu, llu, I64u.
4679 # To avoid warnings about slight mismatches.
4680 # C99 runtime "zu" dependency is being avoided here.
4682 # We have to compile as C++ because C is too lenient
4683 # and lets the wrong thing compile, with warnings.
4685 # Note: "zu" or ifdef <something> have the advantage
4686 # of producing installable "biarch" headers. i.e. one Mac header
4687 # for Mac/x86 and Mac/amd64.
4689 AC_LANG_PUSH(C++)
4691 # Check long before int because it is the overwhelming Unix answer,
4692 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4694 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4696 AC_MSG_CHECKING(if size_t is unsigned long)
4697 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4698         #include <stddef.h>
4699         unsigned long *a = (size_t*)0;
4700 ])], [
4701         AC_MSG_RESULT(yes)
4702         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4703 ], [
4704         AC_MSG_RESULT(no)
4705         AC_MSG_CHECKING(if size_t is unsigned int)
4706         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4707                 #include <stddef.h>
4708                 unsigned *a = (size_t*)0;
4709         ])], [
4710                 AC_MSG_RESULT(yes)
4711                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4712         ], [
4713 # At this point the majority of systems have their answer,
4714 # and we descend into non-standard or new-standard territory.
4716 # Check __int64 first because I64 on some systems predates ll, enabling
4717 # new compiler/old runtime interop, and the types always have the same size.
4718                 AC_MSG_RESULT(no)
4719                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4720                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4721                         #include <stddef.h>
4722                         unsigned __int64 *a = (size_t*)0;
4723                 ])], [
4724                         AC_MSG_RESULT(yes)
4725                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4726                 ], [
4727                         AC_MSG_RESULT(no)
4728                         AC_MSG_CHECKING(if size_t is unsigned long long)
4729                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4730                                 #include <stddef.h>
4731                                 unsigned long long *a = (size_t*)0;
4732                         ])], [
4733                                 AC_MSG_RESULT(yes)
4734                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4735                         ], [
4736                                 AC_MSG_RESULT(no)
4737                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4738                         ] )
4739                 ] )
4740         ] )
4741 ] )
4743 AC_LANG_POP
4745 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4746 # This provides for an exact match with functions that
4747 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4748 # uintptr_t is not necessarily the same.
4750 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4751 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4753 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4754    GSIZE="size_t"
4755    GSSIZE="ptrdiff_t"
4756 else
4757    GSIZE="uintptr_t"
4758    GSSIZE="intptr_t"
4761 AC_SUBST(GSIZE)
4762 AC_SUBST(GSSIZE)
4763 AC_SUBST(GSIZE_FORMAT)
4766 # END OF EGLIB CHECKS
4769 AC_ARG_WITH([libgdiplus],
4770         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4771         [], [with_libgdiplus=installed])
4773 # default install location
4774 libgdiplus_install_loc=libgdiplus${libsuffix}
4775 case "$host" in
4776     *-*-*linux*)
4777     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4778     ;;
4779 esac
4781 case $with_libgdiplus in
4782     no)
4783     libgdiplus_loc=
4784     ;;
4786     installed)
4787     libgdiplus_loc=
4788     if test x$cross_compiling = xno; then
4789         if test x$host_darwin = xyes; then
4790             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4791             if test -x $a; then
4792               libgdiplus_install_loc=$a
4793               libgdiplus_loc=$a
4794             fi
4795         fi
4796     fi
4797     ;;
4799     yes|sibling)
4800     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4801     ;;
4803     /*) # absolute path, assume it is an install location
4804     libgdiplus_loc=$with_libgdiplus
4805     libgdiplus_install_loc=$with_libgdiplus
4806     ;;
4808     *)
4809     libgdiplus_loc=`pwd`/$with_libgdiplus
4810     ;;
4811 esac
4812 AC_SUBST(libgdiplus_loc)
4813 AC_SUBST(libgdiplus_install_loc)
4815 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)
4816 if test "x$icall_symbol_map" = "xyes"; then
4817    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4820 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4821 if test "x$icall_export" = "xyes"; then
4822    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4825 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4826 if test "x$icall_tables" = "xno"; then
4827    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4830 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4832 if test "x$with_tls" = "x__thread"; then
4833         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4834         # Pass the information to libgc
4835         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4836         AC_MSG_CHECKING(if the tls_model attribute is supported)
4837         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4838                 ], [
4839                         AC_MSG_RESULT(yes)
4840                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4841                 ], [
4842                         AC_MSG_RESULT(no)
4843         ])
4846 if test ${TARGET} = ARM; then
4847         dnl ******************************************
4848         dnl *** Check to see what FPU is available ***
4849         dnl ******************************************
4850         AC_MSG_CHECKING(which FPU to use)
4852         #
4853         # This is a bit tricky:
4854         #
4855         # if (__ARM_PCS_VFP) {
4856         #       /* mfloat-abi=hard == VFP with hard ABI */
4857         # } elif (!__SOFTFP__) {
4858         #       /* mfloat-abi=softfp == VFP with soft ABI */
4859         # } else {
4860         #       /* mfloat-abi=soft == no VFP */
4861         # }
4862         #
4863         # The exception is iOS (w/ GCC) where none of the above
4864         # are defined (but iOS always uses the 'softfp' ABI).
4865         #
4866         # No support for FPA.
4867         #
4869         fpu=NONE
4871         # iOS GCC always uses the 'softfp' ABI.
4872         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4873                 fpu=VFP
4874         fi
4876         # Are we using the 'hard' ABI?
4877         if test x$fpu = xNONE; then
4878                 AC_TRY_COMPILE([], [
4879                         #ifndef __ARM_PCS_VFP
4880                         #error "Float ABI is not 'hard'"
4881                         #endif
4882                 ], [
4883                         fpu=VFP_HARD
4884                 ], [
4885                         fpu=NONE
4886                 ])
4887         fi
4889         # No 'hard' ABI. 'soft' or 'softfp'?
4890         if test x$fpu = xNONE; then
4891                 AC_TRY_COMPILE([], [
4892                         #ifdef __SOFTFP__
4893                         #error "Float ABI is not 'softfp'"
4894                         #endif
4895                 ], [
4896                         fpu=VFP
4897                 ], [
4898                         fpu=NONE
4899                 ])
4900         fi
4902         if test x$arm_fpu != x; then
4903            fpu=$arm_fpu
4904         fi
4906         AC_MSG_RESULT($fpu)
4907         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4908         unset fpu
4910         dnl *********************************************
4911         dnl *** Check which ARM version(s) we can use ***
4912         dnl *********************************************
4913         AC_MSG_CHECKING(which ARM version to use)
4915         AC_TRY_COMPILE([], [
4916                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4917                 #error Not on ARM v5.
4918                 #endif
4919         ], [
4920                 arm_v5=yes
4922                 arm_ver=ARMv5
4923         ], [])
4925         AC_TRY_COMPILE([], [
4926                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4927                 #error Not on ARM v6.
4928                 #endif
4929         ], [
4930                 arm_v5=yes
4931                 arm_v6=yes
4933                 arm_ver=ARMv6
4934         ], [])
4936         AC_TRY_COMPILE([], [
4937                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4938                 #error Not on ARM v7.
4939                 #endif
4940         ], [
4941                 arm_v5=yes
4942                 arm_v6=yes
4943                 arm_v7=yes
4945                 arm_ver=ARMv7
4946         ], [])
4948         AC_MSG_RESULT($arm_ver)
4950         if test x$arm_v5 = xyes; then
4951                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4952                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4953         fi
4955         if test x$arm_v6 = xyes; then
4956                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4957                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4958         fi
4960         if test x$arm_v7 = xyes; then
4961                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4962                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4963         fi
4966 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
4967         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
4969         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
4971         if test x$fpabi = xauto; then
4972                 AC_TRY_COMPILE([], [
4973                         #ifdef __riscv_float_abi_double
4974                         #error "double"
4975                         #endif
4976                 ], [
4977                 ], [
4978                         fpabi=double
4979                 ])
4980         fi
4982         if test x$fpabi = xauto; then
4983                 AC_TRY_COMPILE([], [
4984                         #ifdef __riscv_float_abi_single
4985                         #error "single"
4986                         #endif
4987                 ], [
4988                 ], [
4989                         fpabi=single
4990                 ])
4991         fi
4993         if test x$fpabi = xauto; then
4994                 AC_TRY_COMPILE([], [
4995                         #ifdef __riscv_float_abi_soft
4996                         #error "soft"
4997                         #endif
4998                 ], [
4999                 ], [
5000                         fpabi=soft
5001                 ])
5002         fi
5004         case $fpabi in
5005         double)
5006                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5007                 AC_MSG_RESULT([double-precision])
5008                 ;;
5009         single)
5010                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5011                 AC_MSG_ERROR([single-precision, not supported])
5012                 ;;
5013         soft)
5014                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5015                 AC_MSG_RESULT([soft float])
5016                 ;;
5017         auto)
5018                 AC_MSG_ERROR([unknown])
5019                 ;;
5020         *)
5021                 AC_MSG_ERROR([invalid option: $fpabi])
5022                 ;;
5023         esac
5026 if test ${TARGET} = unknown; then
5027         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5028         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5031 if test "x$platform_android" = "xyes"; then
5032         case "x${TARGET}" in
5033         xARM)
5034                 case "x$arm_ver" in
5035                 xARMv5)
5036                         BTLS_SUPPORTED=yes
5037                         BTLS_PLATFORM=android-armv5
5038                         ;;
5039                 xARMv6)
5040                         BTLS_SUPPORTED=yes
5041                         BTLS_PLATFORM=android-armv6
5042                         ;;
5043                 xARMv7)
5044                         BTLS_SUPPORTED=yes
5045                         BTLS_PLATFORM=android-armv7
5046                         ;;
5047                 *)
5048                         BTLS_SUPPORTED=no
5049                         ;;
5050                 esac
5051                 ;;
5052         xARM64)
5053                 BTLS_SUPPORTED=yes
5054                 BTLS_PLATFORM=android-v8a
5055                 ;;
5056         xX86)
5057                 BTLS_SUPPORTED=yes
5058                 BTLS_PLATFORM=android-x86
5059                 ;;
5060         xAMD64)
5061                 BTLS_SUPPORTED=yes
5062                 BTLS_PLATFORM=android-x64
5063                 ;;
5064         *)
5065                 BTLS_SUPPORTED=no
5066                 ;;
5067         esac
5070 if test ${ACCESS_UNALIGNED} = no; then
5071         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5074 if test x$host_darwin = xyes; then
5075         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5076         AS_IF(
5077                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5078                 [AC_MSG_RESULT([no])],
5079                 [
5080                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5081                         AR_FLAGS="Scru"
5082                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5083                         AC_MSG_RESULT([yes])
5084                 ]
5085         )
5088 case "x$libgc" in
5089         xincluded)
5090                 # Pass CPPFLAGS to libgc configure
5091                 # We should use a separate variable for this to avoid passing useless and
5092                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5093                 # This should be executed late so we pick up the final version of CPPFLAGS
5094                 # The problem with this approach, is that during a reconfigure, the main
5095                 # configure scripts gets invoked with these arguments, so we use separate
5096                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5097                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5098                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5099                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5100                 fi
5101                 # Don't pass -finstrument-for-thread-suspension in, 
5102                 # if these are instrumented it will be very bad news 
5103                 # (infinite recursion, undefined parking behavior, etc)
5104                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5105                 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\""
5106                 if test "x$support_boehm" = "xyes"; then
5107                         AC_CONFIG_SUBDIRS(libgc)
5108                 fi
5109                 ;;
5110 esac
5112 MALLOC_MEMPOOLS=no
5113 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5114         if test x$with_malloc_mempools = xyes; then
5115                 MALLOC_MEMPOOLS=yes
5116                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5117         fi
5121 DISABLE_MCS_DOCS=default
5122 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5123         if test x$with_mcs_docs != xyes; then
5124                 DISABLE_MCS_DOCS=yes
5125         fi
5127 if test -n "$INSTALL_4_x_TRUE"; then :
5128         DISABLE_MCS_DOCS=yes
5130 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5131    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5134 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)],[
5135         if test x$with_lazy_gc_thread_creation != xno ; then
5136                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5137         fi
5138 ], [with_lazy_gc_thread_creation=no])
5140 dnl *****************************
5141 dnl *** Thread suspend policy ***
5142 dnl *****************************
5144 dnl Set a default hybrid or cooperative suspend on some platforms
5146 dnl Coop default is set by the bitcode preset.
5148 dnl If coop isn't on by default, maybe hybrid should be?
5149 if test x$enable_cooperative_suspend_default != xyes; then
5150         case $HOST in
5151         X86 | AMD64)
5152                 dnl Some host/target confusion, there's no host_osx (and
5153                 dnl host_darwin would be true on iOS not just macOS).
5154                 if test x$target_osx = xyes; then
5155                         enable_hybrid_suspend_default=yes
5156                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5157                         enable_hybrid_suspend_default=yes
5158                 fi
5159                 ;;
5160         esac
5163 dnl Now check if there were flags overriding the defaults
5165 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])
5166 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5168 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5169         enable_cooperative_suspend=$with_cooperative_gc
5172 if test x$enable_cooperative_suspend = xdefault; then
5173         enable_cooperative_suspend=$enable_cooperative_suspend_default
5176 if test x$enable_cooperative_suspend != xno; then
5177         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5180 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5182 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])
5184 if test x$enable_hybrid_suspend = xdefault; then
5185    enable_hybrid_suspend=$enable_hybrid_suspend_default
5188 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5189         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5192 if test x$enable_hybrid_suspend != xno ; then
5193         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5196 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5198 dnl End of thread suspend policy
5200 dnl ***************************
5201 dnl *** feature experiments ***
5202 dnl ***************************
5204 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5205 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5207         if test x$enable_experiment != x ; then
5208                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5209         fi
5210         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5211                 eval "mono_experiment_test_enable_$feature='yes'"
5212         done
5214         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5215                 eval "mono_experiment_test_enable_null='yes'"
5216                 true
5217         fi
5219         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5220                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5221         fi
5222 ],[])
5224 dnl **********************
5225 dnl *** checked builds ***
5226 dnl **********************
5228 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],[
5230         if test x$enable_checked_build != x ; then
5231                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5232         fi
5233         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5234                 eval "mono_checked_build_test_enable_$feature='yes'"
5235         done
5237         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5238                 eval "mono_checked_build_test_enable_gc='yes'"
5239                 eval "mono_checked_build_test_enable_metadata='yes'"
5240                 eval "mono_checked_build_test_enable_thread='yes'"
5241                 eval "mono_checked_build_test_enable_private_types='yes'"
5242         fi
5244         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5245                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5246         fi
5248         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5249                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5250         fi
5252         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5253                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5254         fi
5256         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5257                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5258         fi
5259 ], [])
5261 dnl End of checked builds
5263 AC_CHECK_HEADER([malloc.h], 
5264                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5265                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5267 if test x"$GCC" = xyes; then
5268         # Implicit function declarations are not 64 bit safe
5269         # Do this late, since this causes lots of configure tests to fail
5270         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5271         # jay has a lot of implicit declarations
5272         JAY_CFLAGS="-Wno-implicit-function-declaration"
5275 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5276 # instead of libmono-static.a
5277 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5278    LIBMONO_LA=libmini-static.la
5279 else
5280    if test x$buildsgen = xyes; then
5281       LIBMONO_LA=libmonosgen-$API_VER.la
5282    else
5283       LIBMONO_LA=libmonoboehm-$API_VER.la
5284    fi
5286 AC_SUBST(LIBMONO_LA)
5288 dnl **************
5289 dnl ***  Btls  ***
5290 dnl **************
5292 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5293 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5294 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5296 if test "x$enable_btls" = "xno"; then
5297    enable_btls_lib=no
5300 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5302 btls_android=no
5303 if test "x$enable_btls" = "xyes"; then
5304         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5305         if test "x$CMAKE" = "xno"; then
5306                 AC_MSG_ERROR("cmake not found")
5307         fi
5309         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5310         AC_SUBST(BTLS_ROOT)
5312         btls_arch=
5313         btls_cflags=
5314         BTLS_CMAKE_ARGS=
5316         if test "x$host_win32" = "xyes"; then
5317                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5318         fi
5320         case "$BTLS_PLATFORM" in
5321         i386)
5322                 btls_arch=i386
5323                 btls_cflags="-m32"
5324                 case $host_os in
5325                         darwin*)
5326                                 btls_cflags="$btls_cflags -arch i386"
5327                                 ;;
5328                         mingw*|cygwin*)
5329                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5330                                 if test "x$HAVE_YASM" != "xyes"; then
5331                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5332                                 fi
5333                                 ;;
5334                 esac
5335                 ;;
5336         x86_64)
5337                 btls_arch=x86_64
5338                 case $host_os in
5339                         mingw*|cygwin*)
5340                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5341                                 if test "x$HAVE_YASM" != "xyes"; then
5342                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5343                                 fi
5344                                 ;;
5345                 esac
5346                 ;;
5347         arm)
5348                 btls_arch=arm
5349                 btls_cflags="-DOPENSSL_NO_ASM=1"
5350                 ;;
5351         armsoft)
5352                 btls_arch=arm
5353                 btls_cflags="-DOPENSSL_NO_ASM=1"
5354                 ;;
5355         aarch64)
5356                 btls_arch=aarch64
5357                 btls_cflags="-march=armv8-a+crypto"
5358                 ;;
5359         s390x)
5360                 btls_arch=s390x
5361                 ;;
5362         powerpc)
5363                 btls_arch=powerpc
5364                 case $host_os in
5365                         aix*|os400*)
5366                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5367                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5368                 esac
5369                 ;;
5370         android-armv5)
5371                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5372                 ;;
5373         android-armv6)
5374                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5375                 ;;
5376         android-armv7)
5377                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5378                 ;;
5379         android-v8a)
5380                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5381                 ;;
5382         android-x86)
5383                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5384                 ;;
5385         android-x64)
5386                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5387                 ;;
5388         riscv32)
5389                 btls_arch=riscv32
5390                 ;;
5391         riscv64)
5392                 btls_arch=riscv64
5393                 ;;
5394         *)
5395                 AC_MSG_ERROR(Invalid BTLS platform)
5396         esac
5398         if test "x$platform_android" = "xyes"; then
5399                 btls_android=yes
5400                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5401                 if test "x$with_btls_android_ndk" != "x"; then
5402                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5403                 else
5404                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5405                 fi
5406         fi
5408         if test "x$btls_arch" != "x"; then
5409                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5410         fi
5412         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5413         AC_SUBST(BTLS_ARCH)
5414         AC_SUBST(BTLS_CFLAGS)
5415         AC_SUBST(BTLS_PLATFORM)
5416         AC_SUBST(BTLS_CMAKE_ARGS)
5418         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5419 else
5420         enable_btls=no
5423 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5425 if test x$DISABLE_MCS_DOCS = xyes; then
5426    docs_dir=""
5427 else
5428    docs_dir=docs
5430 AC_SUBST(docs_dir)
5432 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5433 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5434 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5436 libmono_ldflags="$libmono_ldflags $LIBS"
5438 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5439 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5440 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5441 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5442 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5443 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5444 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5445 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5446 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5447 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5448 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5449 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5450 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5451 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5452 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5453 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5454 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5455 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5456 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5457 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5458 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5459 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5460 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5461 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5463 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5465 AC_SUBST(LIBC)
5466 AC_SUBST(INTL)
5467 AC_SUBST(SQLITE)
5468 AC_SUBST(SQLITE3)
5469 AC_SUBST(X11)
5470 AC_SUBST(GDKX11)
5471 AC_SUBST(GTKX11)
5472 AC_SUBST(XINERAMA)
5473 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5474 AC_SUBST(arch_target)
5475 AC_SUBST(CFLAGS)
5476 AC_SUBST(CPPFLAGS)
5477 AC_SUBST(LDFLAGS)
5479 #This must always be defined when building the runtime
5480 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5482 mono_build_root=`pwd`
5483 AC_SUBST(mono_build_root)
5485 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5486 if test x$host_win32 = xno; then
5487         if test x$enable_msvc = xyes; then
5488                 echo "Error, --enable-msvc only supported for Windows builds."
5489                 exit 1
5490         fi
5492 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5494 if test "x$enable_msvc" = "xyes"; then
5495         if test "x$support_boehm" = "xyes"; then
5496                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5497                 exit 1
5498         fi
5499         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5500         if test "x$host_cpu" = "xi686"; then
5501                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5502                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5503                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5504         else
5505                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5506                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5507                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5508         fi
5509         AC_SUBST(mono_msvc_build_dir)
5510         AC_SUBST(mono_msvc_build_lib_dir)
5511         AC_SUBST(mono_msvc_build_bin_dir)
5512 else
5513         mono_runtime=mono/mini/mono
5516 AC_SUBST(mono_runtime)
5518 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5520 if test $csc_compiler = mcs; then
5521   CSC=$mcs_topdir/class/lib/build/mcs.exe
5522 else
5523   CSC=$CSC_LOCATION
5526 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5528 mono_cfg_root=$mono_build_root/runtime
5529 if test x$host_win32 = xyes; then
5530   if test "x$cross_compiling" = "xno"; then
5531     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5532     CSC=`cygpath -m -a $CSC`
5533     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5534   else
5535     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5536   fi
5537 else
5538   mono_cfg_dir=$mono_cfg_root/etc
5540 AC_SUBST(mono_cfg_dir)
5542 AC_SUBST(CSC)
5544 AC_CONFIG_FILES([po/mcs/Makefile.in])
5546 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5547 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5549 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5550 [   depth=../../../..
5551     case $srcdir in
5552     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5553     .) reldir=$depth ;;
5554     *) reldir=$depth/$srcdir ;;
5555     esac
5556     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5557     cd runtime/etc/mono/1.0
5558     rm -f machine.config
5559     $LN_S $reldir/data/net_1_1/machine.config machine.config
5560     cd $depth
5561 ],[LN_S='$LN_S'])
5563 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5564 [   depth=../../../..
5565     case $srcdir in
5566     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5567     .) reldir=$depth ;;
5568     *) reldir=$depth/$srcdir ;;
5569     esac
5570     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5571     cd runtime/etc/mono/2.0
5572     rm -f machine.config
5573     $LN_S $reldir/data/net_2_0/machine.config machine.config
5574     cd $depth
5575 ],[LN_S='$LN_S'])
5577 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5578 [   depth=../../../..
5579     case $srcdir in
5580     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5581     .) reldir=$depth ;;
5582     *) reldir=$depth/$srcdir ;;
5583     esac
5584     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5585     cd runtime/etc/mono/2.0
5586     rm -f web.config
5587     $LN_S $reldir/data/net_2_0/web.config web.config
5588     cd $depth
5589 ],[LN_S='$LN_S'])
5591 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5592 [   depth=../../..
5593     case $srcdir in
5594     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5595     .) reldir=$depth ;;
5596     *) reldir=$depth/$srcdir ;;
5597     esac
5598     $ac_aux_dir/install-sh -d runtime/etc/mono/
5599     cd runtime/etc/mono/
5600     rm -f browscap.ini
5601     $LN_S $reldir/data/browscap.ini browscap.ini
5602     cd $depth
5603 ],[LN_S='$LN_S'])
5605 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5606 [   depth=../../../../..
5607     case $srcdir in
5608     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5609     .) reldir=$depth ;;
5610     *) reldir=$depth/$srcdir ;;
5611     esac
5612     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5613     cd runtime/etc/mono/2.0/Browsers
5614     rm -f Compat.browser
5615     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5616     cd $depth
5617 ],[LN_S='$LN_S'])
5619 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5620 [   depth=../../../../..
5621     case $srcdir in
5622     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5623     .) reldir=$depth ;;
5624     *) reldir=$depth/$srcdir ;;
5625     esac
5626     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5627     cd runtime/etc/mono/4.0/Browsers
5628     rm -f Compat.browser
5629     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5630     cd $depth
5631 ],[LN_S='$LN_S'])
5633 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5634 [   depth=../../../../..
5635     case $srcdir in
5636     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5637     .) reldir=$depth ;;
5638     *) reldir=$depth/$srcdir ;;
5639     esac
5640     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5641     cd runtime/etc/mono/4.5/Browsers
5642     rm -f Compat.browser
5643     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5644     cd $depth
5645 ],[LN_S='$LN_S'])
5647 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5648 [   depth=../../../..
5649     case $srcdir in
5650     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5651     .) reldir=$depth ;;
5652     *) reldir=$depth/$srcdir ;;
5653     esac
5654     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5655     cd runtime/etc/mono/4.0
5656     rm -f machine.config
5657     $LN_S $reldir/data/net_4_0/machine.config machine.config
5658     cd $depth
5659 ],[LN_S='$LN_S'])
5661 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5662 [   depth=../../../..
5663     case $srcdir in
5664     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5665     .) reldir=$depth ;;
5666     *) reldir=$depth/$srcdir ;;
5667     esac
5668     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5669     cd runtime/etc/mono/4.0
5670     rm -f web.config
5671     $LN_S $reldir/data/net_4_0/web.config web.config
5672     cd $depth
5673 ],[LN_S='$LN_S'])
5675 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5676 [   depth=../../../..
5677     case $srcdir in
5678     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5679     .) reldir=$depth ;;
5680     *) reldir=$depth/$srcdir ;;
5681     esac
5682     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5683     cd runtime/etc/mono/4.5
5684     rm -f machine.config
5685     $LN_S $reldir/data/net_4_5/machine.config machine.config
5686     cd $depth
5687 ],[LN_S='$LN_S'])
5689 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5690 [   depth=../../../..
5691     case $srcdir in
5692     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5693     .) reldir=$depth ;;
5694     *) reldir=$depth/$srcdir ;;
5695     esac
5696     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5697     cd runtime/etc/mono/4.5
5698     rm -f web.config
5699     $LN_S $reldir/data/net_4_5/web.config web.config
5700     cd $depth
5701 ],[LN_S='$LN_S'])
5703 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])
5704 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])
5705 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5707 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5708 if test x"$GCC" = xyes; then
5710         # incompatible-pointer-types requires gcc circa 5.x
5712         ORIG_CFLAGS=$CFLAGS
5713         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5714         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5715         AC_TRY_COMPILE([],[
5716         ], [
5717                 AC_MSG_RESULT(yes)
5718                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5719         ], [
5720                 AC_MSG_RESULT(no)
5721                 CFLAGS=$ORIG_CFLAGS
5722         ])
5726 # Mono.Native Support
5727 # -------------------
5728 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5729 # It is built as a stand-alone shared library and not bundled with the runtime because we
5730 # may need to build two different versions of it.
5732 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5733 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5735 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5736 # implementation accordingly.  We build a single `libmono_native` shared library.
5738 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5740 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5741 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5742 # depending on platform.
5744 # We build two versions of the shared library:
5745 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5746 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5748 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5749 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5750 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5752 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5753 # to verify that it's the correct version of it.
5756 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5757 if test x$target_osx = xyes; then
5758         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5759         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5760         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5761         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5762         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5763         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5764         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5765         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5766         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5768         mono_native=yes
5769         MONO_NATIVE_PLATFORM=macos
5770         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5771         AC_MSG_CHECKING([Mono.Native support])
5772         AC_MSG_RESULT(macos)
5774         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5775                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5777         if test x$mono_native_compat = xyes; then
5778                 mono_native_compat=yes
5779                 mono_native_text="Mac OSX (compat+unified)"
5780                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5781                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5782                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5783                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5784         else
5785                 mono_native_compat=no
5786                 mono_native_text="Mac OSX"
5787         fi
5788 elif test x$mono_native_platform_ios = xyes; then
5789         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5791         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5792                 if test x$mono_native_ios_sim = xyes; then
5793                         mono_native_ios_target=ios-simulator
5794                         mono_native_text="iOS Simulator"
5795                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5796                 else
5797                         mono_native_ios_target=iphoneos
5798                         mono_native_text="iOS Device"
5799                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5800                 fi
5801                 mono_native_unified_version="10.0"
5802                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5803         ], [
5804                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5805                         if test x$mono_native_ios_sim = xyes; then
5806                                 mono_native_ios_target=tvos-simulator
5807                                 mono_native_text="AppleTV Simulator"
5808                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5809                         else
5810                                 mono_native_ios_target=tvos
5811                                 mono_native_text="AppleTV Device"
5812                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5813                         fi
5814                         mono_native_unified_version="10.0"
5815                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5816                 ], [
5817                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5818                                 if test x$mono_native_ios_sim = xyes; then
5819                                         mono_native_ios_target=watchos-simulator
5820                                         mono_native_text="Apple Watch Simulator"
5821                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5822                                 else
5823                                         mono_native_ios_target=watchos
5824                                         mono_native_text="Apple Watch Device"
5825                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5826                                 fi
5827                                 mono_native_unified_version="5.0"
5828                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5829                         ], [
5830                                 AC_MSG_ERROR([Unknown iOS Target])
5831                         ])
5832                 ])
5833         ])
5835         AC_MSG_CHECKING([Mono.Native support])
5836         AC_MSG_RESULT([$mono_native_ios_target])
5838         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5840         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5841         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5843         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5845         if test x$with_bitcode = xyes; then
5846                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5847                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5848         else
5849                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
5850         fi
5852         if test x$enable_gss = xyes; then
5853                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
5854         fi
5856         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5857         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5858         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5859         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5860         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5861         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5863         if test x$mono_native_compat = xyes; then
5864                 mono_native_text="$mono_native_text (compat+unified)"
5865                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5866                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5867                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5868                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5869         fi
5871         mono_native=yes
5872         MONO_NATIVE_PLATFORM=ios
5873 elif test x$host_linux = xyes; then
5874         mono_native_text="Linux"
5875         MONO_NATIVE_CC=$CC
5876         MONO_NATIVE_CXX=$CXX
5877         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5878         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5879         MONO_NATIVE_CFLAGS=$CFLAGS
5880         MONO_NATIVE_LDFLAGS=$LDFLAGS
5882         mono_native=yes
5883         mono_native_compat=no
5884         MONO_NATIVE_PLATFORM=linux
5885         AC_MSG_CHECKING([Mono.Native support])
5886         AC_MSG_RESULT(linux)
5888         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5889 else
5890         mono_native=no
5891         mono_native_text="no"
5892         AC_MSG_CHECKING([Mono.Native support])
5893         AC_MSG_RESULT(no)
5896 if test x$mono_native_compat = xyes; then
5897         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5898 else
5899         MONO_NATIVE_LIBRARY_NAME=libmono-native
5902 AC_SUBST(MONO_NATIVE_PLATFORM)
5903 AC_SUBST(MONO_NATIVE_CC)
5904 AC_SUBST(MONO_NATIVE_CXX)
5905 AC_SUBST(MONO_NATIVE_CPPFLAGS)
5906 AC_SUBST(MONO_NATIVE_CXXFLAGS)
5907 AC_SUBST(MONO_NATIVE_CFLAGS)
5908 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
5909 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
5910 AC_SUBST(MONO_NATIVE_LDFLAGS)
5911 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
5912 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
5913 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
5914 AC_SUBST(MONO_NATIVE_LIBADD)
5916 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
5917 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
5918 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
5919 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
5920 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
5922 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
5923 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
5924 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
5925 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
5926 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
5928 # Update all submodules recursively to ensure everything is checked out
5929 (cd $srcdir && scripts/update_submodules.sh)
5931 AC_OUTPUT([
5932 Makefile
5933 mono-uninstalled.pc
5934 acceptance-tests/Makefile
5935 llvm/Makefile
5936 scripts/mono-find-provides
5937 scripts/mono-find-requires
5938 mk/Makefile
5939 mono/Makefile
5940 mono/btls/Makefile
5941 mono/native/Makefile
5942 mono/utils/Makefile
5943 mono/utils/jemalloc/Makefile
5944 mono/metadata/Makefile
5945 mono/dis/Makefile
5946 mono/cil/Makefile
5947 mono/arch/Makefile
5948 mono/arch/x86/Makefile
5949 mono/arch/amd64/Makefile
5950 mono/arch/ppc/Makefile
5951 mono/arch/sparc/Makefile
5952 mono/arch/s390x/Makefile
5953 mono/arch/arm/Makefile
5954 mono/arch/arm64/Makefile
5955 mono/arch/mips/Makefile
5956 mono/arch/riscv/Makefile
5957 mono/sgen/Makefile
5958 mono/native/platform-type.c
5959 mono/native/platform-type-compat.c
5960 mono/native/platform-type-unified.c
5961 mono/tests/Makefile
5962 mono/tests/assembly-load-reference/Makefile
5963 mono/tests/tests-config
5964 mono/tests/gc-descriptors/Makefile
5965 mono/tests/testing_gac/Makefile
5966 mono/unit-tests/Makefile
5967 mono/benchmark/Makefile
5968 mono/mini/Makefile
5969 mono/profiler/Makefile
5970 mono/eglib/Makefile
5971 mono/eglib/eglib-config.h
5972 mono/eglib/test/Makefile
5973 m4/Makefile
5974 ikvm-native/Makefile
5975 scripts/Makefile
5976 man/Makefile
5977 docs/Makefile
5978 data/Makefile
5979 data/net_2_0/Makefile
5980 data/net_4_0/Makefile
5981 data/net_4_5/Makefile
5982 data/net_2_0/Browsers/Makefile
5983 data/net_4_0/Browsers/Makefile
5984 data/net_4_5/Browsers/Makefile
5985 data/mint.pc
5986 data/mono-2.pc
5987 data/monosgen-2.pc
5988 data/mono.pc
5989 data/mono-cairo.pc
5990 data/mono-nunit.pc
5991 data/mono-options.pc
5992 data/mono-lineeditor.pc
5993 data/monodoc.pc
5994 data/dotnet.pc
5995 data/dotnet35.pc
5996 data/wcf.pc
5997 data/cecil.pc
5998 data/system.web.extensions_1.0.pc
5999 data/system.web.extensions.design_1.0.pc
6000 data/system.web.mvc.pc
6001 data/system.web.mvc2.pc
6002 data/system.web.mvc3.pc
6003 data/aspnetwebstack.pc
6004 data/reactive.pc
6005 samples/Makefile
6006 support/Makefile
6007 data/config
6008 tools/Makefile
6009 tools/locale-builder/Makefile
6010 tools/sgen/Makefile
6011 tools/monograph/Makefile
6012 tools/pedump/Makefile
6013 runtime/Makefile
6014 msvc/Makefile
6015 po/Makefile
6018 if test x$host_win32 = xyes; then
6019    # Get rid of 'cyg' prefixes in library names
6020    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6021    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6022    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6023    # executable doesn't work...
6024    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6027 if test x$host_darwin = xyes; then
6028    # This doesn't seem to be required and it slows down parallel builds
6029    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6033   case $prefix in
6034   NONE) prefix=$ac_default_prefix ;;
6035   esac
6036   case $exec_prefix in
6037   NONE) exec_prefix='${prefix}' ;;
6038   esac
6040   #
6041   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6042   # any existing config.make.  This allows people to share the same source tree
6043   # with different build directories, one native and one cross
6044   #
6045   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6047     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6049     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6050     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6051     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6052     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6053     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6054     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6055     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6056     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6057     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6059     case $INSTALL in
6060     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6061     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6062     esac
6064     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6066     export VERSION
6067     [myver=$($AWK 'BEGIN {
6068       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6069       if(length(vsplit [1]) > 4) {
6070         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6071       }
6072       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6073     }')]
6075     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6076     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6078     if test x$host_darwin = xyes; then
6079       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6080       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6081       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6082     elif test x$host_win32 = xyes; then
6083       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6084       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6085       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6086     elif test x$host_linux = xyes; then
6087       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6088       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6089       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6090     else
6091       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6092       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6093       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6094     fi
6096     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6097       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6098     fi
6100         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6101            enable_system_aot=yes
6102         fi
6104     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6105       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6106     fi
6108     if test x$DISABLE_MCS_DOCS = xyes; then
6109       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6110     fi
6112     if test x$has_extension_module != xno; then
6113         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6114     fi
6115     
6116     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6117     
6118     if test "x$test_bcl_opt" = "xyes"; then    
6119       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6120     fi
6122     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6124     if test $csc_compiler = mcs; then
6125       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6126     fi
6128     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6129       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6130       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6131       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6132     fi
6134     if test "x$AOT_MODE" != "x" ; then
6135       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6136     fi
6138     if test "x$enable_btls" = "xyes"; then
6139       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6140     fi
6142     if test "x$mono_native" = "xyes"; then
6143       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6144     else
6145       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6146     fi
6148     if test x$mono_native_compat = xyes; then
6149       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6150     else
6151       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6152     fi
6154     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6155     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6157   fi
6161 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6163 btls_platform_string=
6164 if test x$enable_btls = xyes; then
6165         if test x$btls_android = xyes; then
6166                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6167         else
6168                 btls_platform_string=" ($BTLS_PLATFORM)"
6169         fi
6172 thread_suspend_msg=
6173 if test x$buildsgen = xyes; then
6174         if test x$enable_cooperative_suspend != xno; then
6175                 thread_suspend_msg="Suspend:       Cooperative"
6176         elif test x$enable_hybrid_suspend != xno; then
6177                 thread_suspend_msg="Suspend:       Hybrid"
6178         else
6179                 thread_suspend_msg="Suspend:       Preemptive"
6180         fi
6182         
6183 echo "
6184         mcs source:    $mcsdir
6185         C# Compiler:   $csc_compiler
6187    Engine:
6188         Host:          $host
6189         Target:        $target
6190         GC:            $gc_msg 
6191         $thread_suspend_msg
6192         TLS:           $with_tls
6193         SIGALTSTACK:   $with_sigaltstack
6194         Engine:        $jit_status
6195         BigArrays:     $enable_big_arrays
6196         DTrace:        $enable_dtrace
6197         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
6198         Spectre:       $spectre_mitigation_status
6199         Mono.Native:   $mono_native_text
6201    Libraries:
6202         .NET 4.x:        $with_profile4_x
6203         Xamarin.Android: $with_monodroid
6204         Xamarin.iOS:     $with_monotouch
6205         Xamarin.WatchOS: $with_monotouch_watch
6206         Xamarin.TVOS:    $with_monotouch_tv
6207         Xamarin.Mac:     $with_xammac
6208         Windows AOT:     $with_winaot
6209         Orbis:           $with_orbis
6210         Unreal:          $with_unreal
6211         WebAssembly:     $with_wasm
6212         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6213         JNI support:     $jdk_headers_found
6214         libgdiplus:      $libgdiplus_msg
6215         zlib:            $zlib_msg
6216         BTLS:            $enable_btls$btls_platform_string
6217         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6218         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6219         $disabled
6221 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6222    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)