[interp] Small fixes (#11667)
[mono-project.git] / configure.ac
blobb414af3bac3b35a33e93b626c682a2c8ed8290cd
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 AC_SUBST(CXXFLAGS_COMMON)
1027 if test "x$enable_cxx" = "xyes"; then
1029         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1031         # -std=gnu99 -xc++ is not allowed and errors.
1032         CXX_REMOVE_CFLAGS=-std=gnu99
1033         # These give warnings and should be removed. They are C-only.
1034         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1035         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1036         # Likewise with CentOS 6 gcc 4.4.
1037         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1039         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1040         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1041         # generates a warning every time we run gcc which is very unsightly.
1042         # The warning is for e.g. sprintf(foo, "") which can just be
1043         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1044         # and completely legal and valid.
1045         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1046         # Alternatively, just run $CXX -xc++ -c /dev/null.
1047         AC_LANG_PUSH(C++)
1048         ORIG_CXXFLAGS=$CXXFLAGS
1049         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1050         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1051         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1052                                  [ AC_MSG_RESULT(no)
1053                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1054         CXXFLAGS=$ORIG_CXXFLAGS
1055         AC_LANG_POP(C++)
1057 AC_SUBST(CXX_ADD_CFLAGS)
1058 AC_SUBST(CXX_REMOVE_CFLAGS)
1061 # Set the build profiles and options before things which use them
1064 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])
1065 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1066 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1067 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])
1068 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])
1069 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1070 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1071 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])
1072 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])
1073 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])
1074 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1075 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1076 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1077 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1080 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])
1081 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])
1082 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])
1083 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])
1086 dnl Spectre compiler mitigation flag checks
1088 if test "x$with_spectre_mitigation" = "xyes"; then
1089    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1090    SPECTRE_CFLAGS=
1091    SPECTRE_INDIRECT_BRANCH_KIND=
1092    case "x$with_spectre_indirect_branch_choice" in
1093        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1094        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1095        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1096        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1097        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1098    esac
1100    SPECTRE_FUNCTION_RETURN_KIND=""
1101    case "x$with_spectre_function_return_choice" in
1102        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1103        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1104        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1105        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1106        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1107    esac
1109    AX_CHECK_COMPILE_FLAG(
1110         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1111         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1112    )
1114    AX_CHECK_COMPILE_FLAG(
1115         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1116         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1117    )
1119    if test "x$SPECTRE_CFLAGS" != "x" ; then
1120         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1121         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1122         spectre_mitigation_status="mitigation enabled"
1123    fi
1124 else
1125         spectre_mitigation_status="no mitigation"
1129 dnl Profile defaults
1131 TEST_PROFILE=default
1132 enable_llvm_default=no
1134 with_profile4_x_default=no
1135 with_monodroid_default=no
1136 with_monotouch_default=no
1137 with_monotouch_watch_default=no
1138 with_monotouch_tv_default=no
1139 with_xammac_default=no
1140 with_testing_aot_full_interp_default=no
1141 with_testing_aot_hybrid_default=no
1142 with_testing_aot_full_default=no
1143 with_winaot_default=no
1144 with_orbis_default=no
1145 with_unreal_default=no
1146 with_wasm_default=no
1148 with_bitcode_default=no
1149 enable_cooperative_suspend_default=no
1150 enable_hybrid_suspend_default=no
1152 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1154 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1156 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1157    DISABLE_MCS_DOCS_default=yes
1158 elif test x$with_runtime_preset = xnet_4_x; then
1159    with_profile4_x_default=yes
1160 elif test x$with_runtime_preset = xall; then
1161    with_profile4_x_default=yes
1162    with_monodroid_default=yes
1163    with_monotouch_default=yes
1164    with_monotouch_watch_default=yes
1165    with_monotouch_tv_default=yes
1166    with_xammac_default=yes
1167    with_winaot_default=yes
1168    with_orbis_default=yes
1169    with_unreal_default=yes
1170    with_wasm_default=yes
1171    with_testing_aot_full_interp_default=yes
1172    with_testing_aot_hybrid_default=yes
1173    with_testing_aot_full_default=yes
1174 elif test x$with_runtime_preset = xbitcode; then
1175    DISABLE_MCS_DOCS_default=yes
1176    with_testing_aot_full_default=yes
1177    with_bitcode_default=yes
1178    enable_cooperative_suspend_default=yes
1179    TEST_PROFILE=testing_aot_full
1180    enable_llvm_default=yes
1182    mono_feature_disable_com='yes'
1183    mono_feature_disable_remoting='yes'
1184    mono_feature_disable_reflection_emit_save='yes'
1185    mono_feature_disable_reflection_emit='yes'
1186    mono_feature_disable_appdomains='yes'
1188    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1189    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1190    AOT_MODE="llvmonly"
1191 elif test x$with_runtime_preset = xfullaot; then
1192    DISABLE_MCS_DOCS_default=yes
1193    with_testing_aot_full_default=yes
1194    TEST_PROFILE=testing_aot_full
1196    mono_feature_disable_com='yes'
1197    mono_feature_disable_remoting='yes'
1198    mono_feature_disable_reflection_emit_save='yes'
1199    mono_feature_disable_reflection_emit='yes'
1200    mono_feature_disable_appdomains='yes'
1202    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1203    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1204    AOT_MODE="full"
1205 elif test x$with_runtime_preset = xfullaot_llvm; then
1206    DISABLE_MCS_DOCS_default=yes
1207    with_testing_aot_full_default=yes
1208    TEST_PROFILE=testing_aot_full
1210    mono_feature_disable_com='yes'
1211    mono_feature_disable_remoting='yes'
1212    mono_feature_disable_reflection_emit_save='yes'
1213    mono_feature_disable_reflection_emit='yes'
1214    mono_feature_disable_appdomains='yes'
1216    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1217    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1218    AOT_MODE="full"
1219 elif test x$with_runtime_preset = xhybridaot; then
1220    DISABLE_MCS_DOCS_default=yes
1221    with_testing_aot_hybrid_default=yes
1222    TEST_PROFILE=testing_aot_hybrid 
1224    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1225    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1226 elif test x$with_runtime_preset = xhybridaot_llvm; 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 --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1232    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1233 elif test x$with_runtime_preset = xfullaotinterp; then
1234    with_testing_aot_full_interp_default=yes
1235    TEST_PROFILE=testing_aot_full_interp
1237    # mscorlib.dll aot compilation crashes
1238    mono_feature_disable_com='yes'
1240    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1241    AOT_RUN_FLAGS="--full-aot-interp"
1242 elif test x$with_runtime_preset = xaot; then
1243    with_profile4_x_default=yes
1245    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1246    AOT_RUN_FLAGS=""
1248    DISABLE_MCS_DOCS_default=yes
1249 elif test x$with_runtime_preset = xaot_llvm; then
1250    with_profile4_x_default=yes
1252    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1253    AOT_RUN_FLAGS=""
1255    DISABLE_MCS_DOCS_default=yes
1256 elif test x$with_runtime_preset = xwinaot; then
1257    DISABLE_MCS_DOCS_default=yes
1258    with_winaot_default=yes
1259    TEST_PROFILE=winaot
1261    mono_feature_disable_com='yes'
1262    mono_feature_disable_remoting='yes'
1263    mono_feature_disable_reflection_emit_save='yes'
1264    mono_feature_disable_reflection_emit='yes'
1265    mono_feature_disable_appdomains='yes'
1267    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1268    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1269    AOT_MODE="llvmonly"
1270 elif test x$with_runtime_preset = xorbis; then
1271    DISABLE_MCS_DOCS_default=yes
1272    with_orbis_default=yes
1273    TEST_PROFILE=orbis
1275    mono_feature_disable_com='yes'
1276    mono_feature_disable_remoting='yes'
1277    mono_feature_disable_reflection_emit_save='yes'
1278    mono_feature_disable_reflection_emit='yes'
1279    mono_feature_disable_appdomains='yes'
1281    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1282    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1283    AOT_MODE="full"
1284 elif test x$with_runtime_preset = xunreal; then
1285    DISABLE_MCS_DOCS_default=yes
1286    with_unreal_default=yes
1287    TEST_PROFILE=unreal
1289    mono_feature_disable_com='yes'
1290    mono_feature_disable_remoting='yes'
1291    mono_feature_disable_appdomains='no'
1293    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1294    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1295 elif test x$with_runtime_preset = xwasm; then
1296    DISABLE_MCS_DOCS_default=yes
1297    with_wasm_default=yes
1298    TEST_PROFILE=wasm
1300    mono_feature_disable_com='yes'
1301    mono_feature_disable_remoting='yes'
1302    mono_feature_disable_reflection_emit_save='yes'
1303    mono_feature_disable_reflection_emit='yes'
1304    mono_feature_disable_appdomains='yes'
1306    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1307    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1308 else
1309    with_profile4_x_default=yes
1312 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1313    AC_SUBST(AOT_BUILD_FLAGS)
1314    AC_SUBST(AOT_RUN_FLAGS)
1315    # For llvmonlycheck + fullaotcheck
1316    AC_SUBST(INVARIANT_AOT_OPTIONS)
1319 AC_SUBST(TEST_PROFILE)
1321 if test "x$with_profile4_x" = "xdefault"; then
1322    with_profile4_x=$with_profile4_x_default
1324 if test "x$with_monodroid" = "xdefault"; then
1325    with_monodroid=$with_monodroid_default
1327 if test "x$with_monotouch" = "xdefault"; then
1328    with_monotouch=$with_monotouch_default
1330 if test "x$with_monotouch_watch" = "xdefault"; then
1331    with_monotouch_watch=$with_monotouch_watch_default
1333 if test "x$with_monotouch_tv" = "xdefault"; then
1334    with_monotouch_tv=$with_monotouch_tv_default
1336 if test "x$with_bitcode" = "xdefault"; then
1337    with_bitcode=$with_bitcode_default
1339 if test "x$with_xammac" = "xdefault"; then
1340    with_xammac=$with_xammac_default
1342 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1343    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1345 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1346    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1348 if test "x$with_testing_aot_full" = "xdefault"; then
1349    with_testing_aot_full=$with_testing_aot_full_default
1351 if test "x$with_winaot" = "xdefault"; then
1352    with_winaot=$with_winaot_default
1354 if test "x$with_orbis" = "xdefault"; then
1355    with_orbis=$with_orbis_default
1357 if test "x$with_unreal" = "xdefault"; then
1358    with_unreal=$with_unreal_default
1360 if test "x$with_wasm" = "xdefault"; then
1361    with_wasm=$with_wasm_default
1365 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1366 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1367 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1368 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1369 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1370 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1371 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1372 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1373 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1374 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1375 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1376 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1377 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1378 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1379 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"])
1380 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1381 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1383 default_profile=net_4_x
1384 if test -z "$INSTALL_MONODROID_TRUE"; then :
1385    default_profile=monodroid
1387 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1388    default_profile=monotouch
1390 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1391    default_profile=xammac
1393 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1394    default_profile=testing_aot_full_interp
1396 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1397    default_profile=testing_aot_hybrid
1399 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1400    default_profile=testing_aot_full
1402 if test -z "$INSTALL_WINAOT_TRUE"; then :
1403    default_profile=winaot
1405 if test -z "$INSTALL_ORBIS_TRUE"; then :
1406    default_profile=orbis
1408 if test -z "$INSTALL_UNREAL_TRUE"; then :
1409    default_profile=unreal
1411 if test -z "$INSTALL_WASM_TRUE"; then :
1412    default_profile=wasm
1414 if test -z "$INSTALL_4_x_TRUE"; then :
1415    default_profile=net_4_x
1417 DEFAULT_PROFILE=$default_profile
1418 AC_SUBST(DEFAULT_PROFILE)
1421 # End build profile configuration
1424 if test x$USE_NLS = xprofile_default; then
1426         AC_MSG_CHECKING([NLS used])
1428         # We make the default value for USE_NLS
1429         # "no" on OSX because it isn't available on most
1430         # default OSX installs. The most common configurations will
1431         # all disable it, so this saves us typing.
1432         if test x$host_darwin = xyes; then
1433                 USE_NLS=no;
1434         else
1435                 USE_NLS=yes;
1436         fi
1438         AC_SUBST([USE_NLS])
1439         AC_MSG_RESULT([$USE_NLS])
1442 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1443      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1444      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1445          security, lldb, mdb, assert_messages, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1447         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1448                 eval "mono_feature_disable_$feature='yes'"
1449         done
1450         DISABLED_FEATURES=$enable_minimal
1451         disabled="Disabled:      $enable_minimal"
1452 ],[])
1454 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1456 if test "x$mono_feature_disable_aot" = "xyes"; then
1457         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1458         enable_system_aot=no
1459         AC_MSG_NOTICE([Disabled AOT compiler])
1462 if test "x$mono_feature_disable_profiler" = "xyes"; then
1463         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1464         AC_MSG_NOTICE([Disabled support for the profiler])
1466 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1468 if test "x$mono_feature_disable_decimal" = "xyes"; then
1469         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1470         AC_MSG_NOTICE([Disabled support for decimal])
1473 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1474         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1475         AC_MSG_NOTICE([Disabled support for P/Invoke])
1478 if test "x$mono_feature_disable_debug" = "xyes"; then
1479         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1480         AC_MSG_NOTICE([Disabled support for runtime debugging])
1483 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1484         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1485         mono_feature_disable_reflection_emit_save=yes
1486         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1489 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1490         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1491         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1494 if test "x$mono_feature_disable_large_code" = "xyes"; then
1495         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1496         AC_MSG_NOTICE([Disabled support for large assemblies])
1499 if test "x$mono_feature_disable_logging" = "xyes"; then
1500         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1501         AC_MSG_NOTICE([Disabled support for logging])
1504 if test "x$mono_feature_disable_com" = "xyes"; then
1505         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1506         AC_MSG_NOTICE([Disabled COM support])
1509 if test "x$mono_feature_disable_ssa" = "xyes"; then
1510         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1511         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1514 if test "x$mono_feature_disable_generics" = "xyes"; then
1515         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1516         AC_MSG_NOTICE([Disabled Generics Support])
1519 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1520         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1521         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1524 if test "x$mono_feature_disable_portability" = "xyes"; then
1525         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1526         AC_MSG_NOTICE([Disabled IO Portability layer])
1529 if test "x$mono_feature_disable_attach" = "xyes"; then
1530         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1531         AC_MSG_NOTICE([Disabled agent attach])
1534 if test "x$mono_feature_disable_verifier" = "xyes"; then
1535         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1536         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1539 if test "x$mono_feature_disable_jit" = "xyes"; then
1540         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1541         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1544 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1546 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1547         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1548         AC_MSG_NOTICE([Disabled the interpreter])
1551 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1553 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1554         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1557 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1559 if test "x$mono_feature_disable_simd" = "xyes"; then
1560         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1561         AC_MSG_NOTICE([Disabled SIMD support])
1564 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1565         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1566         AC_MSG_NOTICE([Disabled Soft Debugger.])
1569 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1571 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1572         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1573         AC_MSG_NOTICE([Disabled Performance Counters.])
1575 if test "x$mono_feature_disable_normalization" = "xyes"; then
1576         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1577         AC_MSG_NOTICE([Disabled String normalization support.])
1580 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1581 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1582         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1583         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1586 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1587         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1588         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1591 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1592         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1593         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1596 if test "x$mono_feature_disable_remoting" = "xyes"; then
1597         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1598         AC_MSG_NOTICE([Disabled remoting])
1601 if test "x$mono_feature_disable_security" = "xyes"; then
1602         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1603         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1606 if test "x$mono_feature_disable_lldb" = "xyes"; then
1607         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1608         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1611 if test "x$mono_feature_disable_mdb" = "xyes"; then
1612         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1613         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1616 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1617         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1618         AC_MSG_NOTICE([Disabled assertion messages.])
1621 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1622         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1623         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1627 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1628         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1629         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1632 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1633         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1634         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1637 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1638         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1639         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1642 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1643 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1645 has_extension_module=no
1646 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1648         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1649                 if test x$extension = xdefault ; then
1650                         has_extension_module=yes;
1651                 fi
1652         done
1653         if test x$enable_extension_module = xyes; then
1654                 has_extension_module=yes;
1655         fi
1656 ], [])
1658 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1660 if test x$has_extension_module != xno ; then
1661         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1662         AC_MSG_NOTICE([Enabling mono extension module.])
1665 # Deprecated
1666 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1668 AC_MSG_CHECKING(for visibility __attribute__)
1669 AC_COMPILE_IFELSE([
1670         AC_LANG_SOURCE([[
1671                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1672                 int main () { doit (); return 0; }
1673         ]])
1674 ], [
1675    have_visibility_hidden=yes
1676    AC_MSG_RESULT(yes)
1677 ], [
1678    have_visibility_hidden=no
1679    AC_MSG_RESULT(no)
1683 dnl Boehm GC configuration
1686 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1688 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1689 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1691 if test "x$support_boehm" = "xyes"; then
1693         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1694         if test x$enable_parallel_mark = xyes; then
1695                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1696         fi
1698         gc_msg=""
1699         LIBGC_CPPFLAGS=
1700         LIBGC_LIBS=
1701         LIBGC_STATIC_LIBS=
1702         libgc_dir=
1703         case "x$libgc" in
1704                 xincluded)
1705                         if test "x$support_boehm" = "xyes"; then
1706                                 libgc_dir=libgc
1707                         fi
1709                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1710                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1711                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1713                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1715                         if test x$target_win32 = xyes; then
1716                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1717                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1718                         fi
1720                         gc_msg="Included Boehm GC with typed GC"
1721                         if test x$enable_parallel_mark = xyes; then
1722                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1723                                 gc_msg="$gc_msg and parallel mark"
1724                         else
1725                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1726                         fi
1727                         ;;
1729                 xboehm|xbohem|xyes)
1730                         AC_MSG_WARN("External Boehm is no longer supported")
1731                         ;;
1733                 xsgen)
1734                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1735                         ;;
1737                 xnone)
1738                         AC_MSG_WARN("Compiling mono without GC.")
1739                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1740                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1741                         gc_msg="none"
1742                         ;;
1743                 *)
1744                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1745                         ;;
1746         esac
1748         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])
1749         if test "x$large_heap" = "xyes"; then
1750            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1751         fi
1753         AC_SUBST(LIBGC_CPPFLAGS)
1754         AC_SUBST(LIBGC_LIBS)
1755         AC_SUBST(LIBGC_STATIC_LIBS)
1756         AC_SUBST(libgc_dir)
1757         AC_SUBST(BOEHM_DEFINES)
1760 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1763 dnl End of Boehm GC Configuration
1766 dnl *************************************
1767 dnl *** Checks for zero length arrays ***
1768 dnl *************************************
1769 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1770 AC_TRY_COMPILE([
1771         struct s {
1772                 int  length;
1773                 char data [0];
1774         };
1775 ], [], [
1776         AC_MSG_RESULT(yes)
1777         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1778 ], [
1779         AC_MSG_RESULT(no)
1780         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1783 dnl ***********************************
1784 dnl *** Checks for signals
1785 dnl ***********************************
1786 AC_CHECK_HEADERS(signal.h)
1787 AC_CHECK_FUNCS(sigaction)
1788 AC_CHECK_FUNCS(kill)
1789 AC_CHECK_FUNCS(signal)
1791 # signal() is declared inline in Android headers
1792 # so we need to workaround it by overriding the check.
1793 if test x$platform_android = xyes; then
1794         AC_DEFINE(HAVE_SIGNAL,1)
1797 dnl ***********************************
1798 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1799 dnl ***********************************
1800 enable_gss=no;
1801 AC_MSG_CHECKING(for GSS/GSS.h)
1802 AC_TRY_COMPILE([
1803     #include <GSS/GSS.h>
1804 ], [
1806     AC_MSG_RESULT(yes)
1807     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1808     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1809     enable_gss=yes
1810 ], [
1811     AC_MSG_RESULT(no)
1814 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1815 AC_TRY_COMPILE([
1816     #include <gssapi/gssapi_ext.h>
1817 ], [
1819     AC_MSG_RESULT(yes)
1820     enable_gss=yes
1821 ], [
1822     AC_MSG_RESULT(no)
1825 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1826 AC_TRY_COMPILE([
1827     #include <gssapi/gssapi_ext.h>
1828     #include <gssapi/gssapi_krb5.h>
1829     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1830 ], [
1832     AC_MSG_RESULT(yes)
1833     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1834 ], [
1835     AC_MSG_RESULT(no)
1838 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1840 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1841 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1843 if test x$host_win32 = xno; then
1844         dnl *************************************
1845         dnl *** Checks for time capabilities ***
1846         dnl *************************************
1848         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1849         AC_TRY_COMPILE([#include <time.h>], [
1850                 const int foo = CLOCK_MONOTONIC;
1851         ],[
1852                 AC_MSG_RESULT(yes)
1853                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1854         ], [
1855                 AC_MSG_RESULT(no)
1856         ])
1858         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1859         AC_TRY_COMPILE([#include <time.h>], [
1860                 const int foo = CLOCK_MONOTONIC_COARSE;
1861         ],[
1862                 AC_MSG_RESULT(yes)
1863                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1864         ], [
1865                 AC_MSG_RESULT(no)
1866         ])
1868         AC_MSG_CHECKING(for CLOCK_REALTIME)
1869         AC_TRY_COMPILE([#include <time.h>], [
1870                 const int foo = CLOCK_REALTIME;
1871         ],[
1872                 AC_MSG_RESULT(yes)
1873                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1874         ], [
1875                 AC_MSG_RESULT(no)
1876         ])
1878         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1879         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1880         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1881         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1882         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1883         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1885         dnl hires monotonic clock support
1886         AC_SEARCH_LIBS(clock_gettime, rt)
1887         AC_CHECK_FUNCS(clock_nanosleep)
1889         dnl dynamic loader support
1890         AC_CHECK_FUNC(dlopen, DL_LIB="",
1891                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1892         )
1893         if test x$dl_support = xno; then
1894                 AC_MSG_WARN([No dynamic loading support available])
1895         else
1896                 LIBS="$LIBS $DL_LIB"
1897                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1898                 dnl from glib's configure.ac
1899                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1900                         mono_cv_uscore,[
1901                         AC_TRY_RUN([#include <dlfcn.h>
1902                         int mono_underscore_test (void) { return 42; }
1903                         int main() {
1904                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1905                           handle = dlopen ((void*)0, 0);
1906                           if (handle) {
1907                             f1 = dlsym (handle, "mono_underscore_test");
1908                             f2 = dlsym (handle, "_mono_underscore_test");
1909                           } return (!f2 || f1);
1910                         }],
1911                                 [mono_cv_uscore=yes],
1912                                 [mono_cv_uscore=no],
1913                         [])
1914                 ])
1915                 if test "x$mono_cv_uscore" = "xyes"; then
1916                         MONO_DL_NEED_USCORE=1
1917                 else
1918                         MONO_DL_NEED_USCORE=0
1919                 fi
1920                 AC_SUBST(MONO_DL_NEED_USCORE)
1921                 AC_CHECK_FUNC(dlerror)
1922         fi
1924         dnl ******************************************************************
1925         dnl *** Checks for the IKVM JNI interface library                  ***
1926         dnl ******************************************************************
1927         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])
1929         ikvm_native_dir=
1930         if test x$with_ikvm_native = xyes; then
1931                 ikvm_native_dir=ikvm-native
1932                 jdk_headers_found="IKVM Native"
1933         fi
1935         AC_SUBST(ikvm_native_dir)
1937         AC_CHECK_HEADERS(execinfo.h)
1939         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1941         AC_CHECK_FUNCS(getgrgid_r)
1942         AC_CHECK_FUNCS(getgrnam_r)
1943         AC_CHECK_FUNCS(getresuid)
1944         AC_CHECK_FUNCS(setresuid)
1945         AC_CHECK_FUNCS(kqueue)
1946         AC_CHECK_FUNCS(backtrace_symbols)
1947         AC_CHECK_FUNCS(mkstemp)
1948         AC_CHECK_FUNCS(mmap)
1949         AC_CHECK_FUNCS(madvise)
1950         AC_CHECK_FUNCS(getrusage)
1951         AC_CHECK_FUNCS(getpriority)
1952         AC_CHECK_FUNCS(setpriority)
1953         AC_CHECK_FUNCS(dl_iterate_phdr)
1954         AC_CHECK_FUNCS(dladdr)
1955         AC_CHECK_FUNCS(sysconf)
1956         AC_CHECK_FUNCS(getrlimit)
1957         AC_CHECK_FUNCS(prctl)
1958         AC_CHECK_FUNCS(arc4random)
1959         AC_CHECK_FUNCS(nl_langinfo)
1961         AC_CHECK_FUNCS(sched_getaffinity)
1962         AC_CHECK_FUNCS(sched_setaffinity)
1963         AC_CHECK_FUNCS(sched_getcpu)
1965         if test x$platform_android != xyes; then
1966                 AC_CHECK_FUNCS(getpwnam_r)
1967                 AC_CHECK_FUNCS(getpwuid_r)
1968         fi
1970         AC_FUNC_STRERROR_R()
1972         dnl ****************************************************************
1973         dnl *** Check for sched_setaffinity from glibc versions before   ***
1974         dnl *** 2.3.4. The older versions of the function only take 2    ***
1975         dnl *** parameters, not 3.                                       ***
1976         dnl ***                                                          ***
1977         dnl *** Because the interface change was not made in a minor     ***
1978         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1979         dnl *** won't always indicate the interface sched_affinity has.  ***
1980         dnl ****************************************************************
1981         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1982         AC_TRY_COMPILE([#include <sched.h>], [
1983             int mask = 1; 
1984             sched_setaffinity(0, &mask);
1985         ], [
1986                 # Yes, we have it...
1987                 AC_MSG_RESULT(yes)
1988                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1989         ], [
1990                 # We have the new, three-parameter version
1991                 AC_MSG_RESULT(no)
1992         ])
1993         AC_TRY_COMPILE([#include <sched.h>], [
1994              CPU_COUNT((void *) 0);
1995         ], [
1996                 AC_MSG_RESULT(yes)
1997                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1998         ], [
1999                 # We have the new, three-parameter version
2000                 AC_MSG_RESULT(no)
2001         ])
2003         dnl ******************************************************************
2004         dnl *** Check for large file support                               ***
2005         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2006         dnl ******************************************************************
2007         
2008         # Check that off_t can represent 2**63 - 1 correctly, working around
2009         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2010         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2011         large_offt=no
2012         AC_DEFUN([LARGE_FILES], [
2013                 large_CPPFLAGS=$CPPFLAGS
2014                 CPPFLAGS="$CPPFLAGS $1"
2015                 AC_TRY_COMPILE([
2016                         #include <sys/types.h>
2017                         #include <limits.h>
2018                 ], [
2019                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2020                         #define COMPILE_TIME_ASSERT(pred) \
2021                                 switch(0){case 0:case pred:;}
2022                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2023                 ], [
2024                         AC_MSG_RESULT(ok)
2025                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2026                         large_CPPFLAGS="$large_CPPFLAGS $1"
2027                         large_offt=yes
2028                 ], [
2029                         AC_MSG_RESULT(no)
2030                 ])
2031                 CPPFLAGS=$large_CPPFLAGS
2032         ])
2034         AC_MSG_CHECKING(if off_t is 64 bits wide)
2035         LARGE_FILES("")
2036         if test $large_offt = no; then
2037                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2038                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2039         fi
2040         if test $large_offt = no; then
2041                 AC_MSG_WARN([No 64 bit file size support available])
2042         fi
2043         
2044         dnl *****************************
2045         dnl *** Checks for libsocket  ***
2046         dnl *****************************
2047         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2049         case "$host" in
2050                 *-*-*freebsd*)
2051                         dnl *****************************
2052                         dnl *** Checks for libinotify ***
2053                         dnl *****************************
2054                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2055         esac
2057         dnl *******************************
2058         dnl *** Checks for MSG_NOSIGNAL ***
2059         dnl *******************************
2060         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2061         AC_TRY_COMPILE([#include <sys/socket.h>], [
2062                 int f = MSG_NOSIGNAL;
2063         ], [
2064                 # Yes, we have it...
2065                 AC_MSG_RESULT(yes)
2066                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2067         ], [
2068                 # We'll have to use signals
2069                 AC_MSG_RESULT(no)
2070         ])
2072         dnl *****************************
2073         dnl *** Checks for IPPROTO_IP ***
2074         dnl *****************************
2075         AC_MSG_CHECKING(for IPPROTO_IP)
2076         AC_TRY_COMPILE([#include <netinet/in.h>], [
2077                 int level = IPPROTO_IP;
2078         ], [
2079                 # Yes, we have it...
2080                 AC_MSG_RESULT(yes)
2081                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2082         ], [
2083                 # We'll have to use getprotobyname
2084                 AC_MSG_RESULT(no)
2085         ])
2087         dnl *******************************
2088         dnl *** Checks for IPPROTO_IPV6 ***
2089         dnl *******************************
2090         AC_MSG_CHECKING(for IPPROTO_IPV6)
2091         AC_TRY_COMPILE([#include <netinet/in.h>], [
2092                 int level = IPPROTO_IPV6;
2093         ], [
2094                 # Yes, we have it...
2095                 AC_MSG_RESULT(yes)
2096                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2097         ], [
2098                 # We'll have to use getprotobyname
2099                 AC_MSG_RESULT(no)
2100         ])
2102         dnl ******************************
2103         dnl *** Checks for IPPROTO_TCP ***
2104         dnl ******************************
2105         AC_MSG_CHECKING(for IPPROTO_TCP)
2106         AC_TRY_COMPILE([#include <netinet/in.h>], [
2107                 int level = IPPROTO_TCP;
2108         ], [
2109                 # Yes, we have it...
2110                 AC_MSG_RESULT(yes)
2111                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2112         ], [
2113                 # We'll have to use getprotobyname
2114                 AC_MSG_RESULT(no)
2115         ])
2117         dnl *****************************
2118         dnl *** Checks for SOL_IP     ***
2119         dnl *****************************
2120         AC_MSG_CHECKING(for SOL_IP)
2121         AC_TRY_COMPILE([#include <netdb.h>], [
2122                 int level = SOL_IP;
2123         ], [
2124                 # Yes, we have it...
2125                 AC_MSG_RESULT(yes)
2126                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2127         ], [
2128                 # We'll have to use getprotobyname
2129                 AC_MSG_RESULT(no)
2130         ])
2132         dnl *****************************
2133         dnl *** Checks for SOL_IPV6     ***
2134         dnl *****************************
2135         AC_MSG_CHECKING(for SOL_IPV6)
2136         AC_TRY_COMPILE([#include <netdb.h>], [
2137                 int level = SOL_IPV6;
2138         ], [
2139                 # Yes, we have it...
2140                 AC_MSG_RESULT(yes)
2141                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2142         ], [
2143                 # We'll have to use getprotobyname
2144                 AC_MSG_RESULT(no)
2145         ])
2147         dnl *****************************
2148         dnl *** Checks for SOL_TCP    ***
2149         dnl *****************************
2150         AC_MSG_CHECKING(for SOL_TCP)
2151         AC_TRY_COMPILE([#include <netdb.h>], [
2152                 int level = SOL_TCP;
2153         ], [
2154                 # Yes, we have it...
2155                 AC_MSG_RESULT(yes)
2156                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2157         ], [
2158                 # We'll have to use getprotobyname
2159                 AC_MSG_RESULT(no)
2160         ])
2162         dnl *****************************
2163         dnl *** Checks for IP_PKTINFO ***
2164         dnl *****************************
2165         AC_MSG_CHECKING(for IP_PKTINFO)
2166         AC_TRY_COMPILE([#include <linux/in.h>], [
2167                 int level = IP_PKTINFO;
2168         ], [
2169                 # Yes, we have it...
2170                 AC_MSG_RESULT(yes)
2171                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2172         ], [
2173                 AC_MSG_RESULT(no)
2174         ])
2176         dnl *****************************
2177         dnl *** Checks for IPV6_PKTINFO ***
2178         dnl *****************************
2179         AC_MSG_CHECKING(for IPV6_PKTINFO)
2180         AC_TRY_COMPILE([#include <netdb.h>], [
2181                 int level = IPV6_PKTINFO;
2182         ], [
2183                 # Yes, we have it...
2184                 AC_MSG_RESULT(yes)
2185                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2186         ], [
2187                 AC_MSG_RESULT(no)
2188         ])
2190         dnl **********************************
2191         dnl *** Checks for IP_DONTFRAG     ***
2192         dnl **********************************
2193         AC_MSG_CHECKING(for IP_DONTFRAG)
2194         AC_TRY_COMPILE([#include <netinet/in.h>], [
2195                 int level = IP_DONTFRAG;
2196         ], [
2197                 # Yes, we have it...
2198                 AC_MSG_RESULT(yes)
2199                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2200         ], [
2201                 AC_MSG_RESULT(no)
2202         ])
2204         dnl **********************************
2205         dnl *** Checks for IP_DONTFRAGMENT ***
2206         dnl **********************************
2207         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2208         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2209                 int level = IP_DONTFRAGMENT;
2210         ], [
2211                 # Yes, we have it...
2212                 AC_MSG_RESULT(yes)
2213                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2214         ], [
2215                 AC_MSG_RESULT(no)
2216         ])
2218         dnl **********************************
2219         dnl *** Checks for IP_MTU_DISCOVER ***
2220         dnl **********************************
2221         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2222         AC_TRY_COMPILE([#include <linux/in.h>], [
2223                 int level = IP_MTU_DISCOVER;
2224         ], [
2225                 # Yes, we have it...
2226                 AC_MSG_RESULT(yes)
2227                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2228         ], [
2229                 AC_MSG_RESULT(no)
2230         ])
2232         dnl **********************************
2233         dnl *** Checks for  IP_PMTUDISC_DO ***
2234         dnl **********************************
2235         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2236         AC_TRY_COMPILE([#include <linux/in.h>], [
2237                 int level = IP_PMTUDISC_DO;
2238         ], [
2239                 # Yes, we have it...
2240                 AC_MSG_RESULT(yes)
2241                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2242         ], [
2243                 AC_MSG_RESULT(no)
2244         ])
2246         dnl *********************************
2247         dnl *** Check for struct ip_mreqn ***
2248         dnl *********************************
2249         AC_MSG_CHECKING(for struct ip_mreqn)
2250         AC_TRY_COMPILE([#include <netinet/in.h>], [
2251                 struct ip_mreqn mreq;
2252                 mreq.imr_address.s_addr = 0;
2253         ], [
2254                 # Yes, we have it...
2255                 AC_MSG_RESULT(yes)
2256                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2257         ], [
2258                 # We'll just have to try and use struct ip_mreq
2259                 AC_MSG_RESULT(no)
2260                 AC_MSG_CHECKING(for struct ip_mreq)
2261                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2262                         struct ip_mreq mreq;
2263                         mreq.imr_interface.s_addr = 0;
2264                 ], [
2265                         # Yes, we have it...
2266                         AC_MSG_RESULT(yes)
2267                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2268                 ], [
2269                         # No multicast support
2270                         AC_MSG_RESULT(no)
2271                 ])
2272         ])
2273         
2274         dnl **********************************
2275         dnl *** Check for getaddrinfo ***
2276         dnl **********************************
2277         AC_MSG_CHECKING(for getaddrinfo)
2278                 AC_TRY_LINK([
2279                 #include <stdio.h>
2280                 #include <netdb.h>
2281         ], [
2282                 getaddrinfo(NULL,NULL,NULL,NULL);
2283         ], [
2284                 # Yes, we have it...
2285                 AC_MSG_RESULT(yes)
2286                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2287         ], [
2288                 AC_MSG_RESULT(no)
2289         ])
2291         dnl **********************************
2292         dnl *** Check for gethostbyname2_r ***
2293         dnl **********************************
2294         AC_MSG_CHECKING(for gethostbyname2_r)
2295                 AC_TRY_LINK([
2296                 #include <stdio.h>
2297                 #include <netdb.h>
2298         ], [
2300                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2301         ], [
2302                 # Yes, we have it...
2303                 AC_MSG_RESULT(yes)
2304                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2305         ], [
2306                 AC_MSG_RESULT(no)
2307         ])
2309         dnl **********************************
2310         dnl *** Check for gethostbyname2 ***
2311         dnl **********************************
2312         AC_MSG_CHECKING(for gethostbyname2)
2313                 AC_TRY_LINK([
2314                 #include <stdio.h>
2315                 #include <netdb.h>
2316         ], [
2317                 gethostbyname2(NULL,0);
2318         ], [
2319                 # Yes, we have it...
2320                 AC_MSG_RESULT(yes)
2321                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2322         ], [
2323                 AC_MSG_RESULT(no)
2324         ])
2326         dnl **********************************
2327         dnl *** Check for gethostbyname ***
2328         dnl **********************************
2329         AC_MSG_CHECKING(for gethostbyname)
2330                 AC_TRY_LINK([
2331                 #include <stdio.h>
2332                 #include <netdb.h>
2333         ], [
2334                 gethostbyname(NULL);
2335         ], [
2336                 # Yes, we have it...
2337                 AC_MSG_RESULT(yes)
2338                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2339         ], [
2340                 AC_MSG_RESULT(no)
2341         ])
2343         dnl **********************************
2344         dnl *** Check for getprotobyname ***
2345         dnl **********************************
2346         AC_MSG_CHECKING(for getprotobyname)
2347                 AC_TRY_LINK([
2348                 #include <stdio.h>
2349                 #include <netdb.h>
2350         ], [
2351                 getprotobyname(NULL);
2352         ], [
2353                 # Yes, we have it...
2354                 AC_MSG_RESULT(yes)
2355                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2356         ], [
2357                 AC_MSG_RESULT(no)
2358         ])
2360         dnl **********************************
2361         dnl *** Check for getprotobyname_r ***
2362         dnl **********************************
2363         AC_MSG_CHECKING(for getprotobyname_r)
2364                 AC_TRY_LINK([
2365                 #include <stdio.h>
2366                 #include <netdb.h>
2367         ], [
2368                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2369         ], [
2370                 # Yes, we have it...
2371                 AC_MSG_RESULT(yes)
2372                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2373         ], [
2374                 AC_MSG_RESULT(no)
2375         ])
2377         dnl **********************************
2378         dnl *** Check for getnameinfo ***
2379         dnl **********************************
2380         AC_MSG_CHECKING(for getnameinfo)
2381                 AC_TRY_LINK([
2382                 #include <stdio.h>
2383                 #include <netdb.h>
2384         ], [
2385                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2386         ], [
2387                 # Yes, we have it...
2388                 AC_MSG_RESULT(yes)
2389                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2390         ], [
2391                 AC_MSG_RESULT(no)
2392         ])
2395         dnl **********************************
2396         dnl *** Check for inet_ntop ***
2397         dnl **********************************
2398         AC_MSG_CHECKING(for inet_ntop)
2399                 AC_TRY_LINK([
2400                 #include <stdio.h>
2401                 #include <arpa/inet.h>
2402         ], [
2403                 inet_ntop (0, NULL, NULL, 0);
2404         ], [
2405                 # Yes, we have it...
2406                 AC_MSG_RESULT(yes)
2407                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2408         ], [
2409                 AC_MSG_RESULT(no)
2410         ])
2412         dnl *****************************
2413         dnl *** Checks for libnsl     ***
2414         dnl *****************************
2415         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2417         AC_CHECK_FUNCS(inet_pton inet_aton)
2419         dnl *****************************
2420         dnl *** Checks for libxnet    ***
2421         dnl *****************************
2422         case "${host}" in
2423                 *solaris* )
2424                         AC_MSG_CHECKING(for Solaris XPG4 support)
2425                         if test -f /usr/lib/libxnet.so; then
2426                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2427                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2428                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2429                                 LIBS="$LIBS -lxnet"
2430                                 AC_MSG_RESULT(yes)
2431                         else
2432                                 AC_MSG_RESULT(no)
2433                         fi
2435                         if test "$GCC" = "yes"; then
2436                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2437                         fi
2438                 ;;
2439         esac
2441         dnl *****************************
2442         dnl *** Checks for libpthread ***
2443         dnl *****************************
2444 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2445 # and libpthread does not exist
2447         case "${host}" in
2448                 *-*-*haiku*)
2449                         dnl Haiku has pthread in libroot (libc equiv)
2450                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2451                 ;;
2452                 *-*-*freebsd*)
2453                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2454                 ;;
2455                 *-*-*openbsd*)
2456                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2457                 ;;
2458                 *)
2459                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2460                 ;;
2461         esac
2462         AC_CHECK_HEADERS(pthread.h)
2463         AC_CHECK_HEADERS(pthread_np.h)
2464         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2465         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2466         AC_CHECK_FUNCS(pthread_kill)
2467         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2468         AC_TRY_COMPILE([ #include <pthread.h>], [
2469                 pthread_mutexattr_t attr;
2470                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2471         ], [
2472                 AC_MSG_RESULT(ok)
2473         ], [
2474                 AC_MSG_RESULT(no)
2475                 AC_ERROR(Posix system lacks support for recursive mutexes)
2476         ])
2477         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2478         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2479         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2480         AC_CHECK_FUNCS(mincore mlock munlock)
2482         dnl ***********************************
2483         dnl *** Checks for working __thread ***
2484         dnl ***********************************
2485         AC_MSG_CHECKING(for working __thread)
2486         if test "x$with_tls" != "x__thread"; then
2487                 AC_MSG_RESULT(disabled)
2488         elif test "x$cross_compiling" = "xyes"; then
2489                 AC_MSG_RESULT(cross compiling, assuming yes)
2490         else
2491                 AC_TRY_RUN([
2492                         #if defined(__APPLE__) && defined(__clang__)
2493                         #error "__thread does not currently work with clang on Mac OS X"
2494                         #endif
2495                         
2496                         #include <pthread.h>
2497                         __thread int i;
2498                         static int res1, res2;
2500                         void thread_main (void *arg)
2501                         {
2502                                 i = arg;
2503                                 sleep (1);
2504                                 if (arg == 1)
2505                                         res1 = (i == arg);
2506                                 else
2507                                         res2 = (i == arg);
2508                         }
2510                         int main () {
2511                                 pthread_t t1, t2;
2513                                 i = 5;
2515                                 pthread_create (&t1, NULL, thread_main, 1);
2516                                 pthread_create (&t2, NULL, thread_main, 2);
2518                                 pthread_join (t1, NULL);
2519                                 pthread_join (t2, NULL);
2521                                 return !(res1 + res2 == 2);
2522                         }
2523                 ], [
2524                                 AC_MSG_RESULT(yes)
2525                 ], [
2526                                 AC_MSG_RESULT(no)
2527                                 with_tls=pthread
2528                 ])
2529         fi
2531         dnl **************************************
2532         dnl *** Checks for working sigaltstack ***
2533         dnl **************************************
2534         AC_MSG_CHECKING(for working sigaltstack)
2535         if test "x$with_sigaltstack" != "xyes"; then
2536                 AC_MSG_RESULT(disabled)
2537         elif test "x$cross_compiling" = "xyes"; then
2538                 AC_MSG_RESULT(cross compiling, assuming yes)
2539         else
2540                 AC_TRY_RUN([
2541                         #include <stdio.h>
2542                         #include <stdlib.h>
2543                         #include <unistd.h>
2544                         #include <signal.h>
2545                         #include <pthread.h>
2546                         #include <sys/wait.h>
2547                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2548                         #define SA_STACK SA_ONSTACK
2549                         #endif
2550                         static void
2551                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2552                         {
2553                                 exit (0);
2554                         }
2556                         volatile char*__ptr = NULL;
2557                         static void *
2558                         loop (void *ignored)
2559                         {
2560                                 *__ptr = 0;
2561                                 return NULL;
2562                         }
2564                         static void
2565                         child ()
2566                         {
2567                                 struct sigaction sa;
2568                                 stack_t sas;
2569                                 pthread_t id;
2570                                 pthread_attr_t attr;
2572                                 sa.sa_sigaction = sigsegv_signal_handler;
2573                                 sigemptyset (&sa.sa_mask);
2574                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2575                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2576                                         perror ("sigaction");
2577                                         return;
2578                                 }
2580                                 /* x86 darwin deliver segfaults using SIGBUS */
2581                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2582                                         perror ("sigaction");
2583                                         return;
2584                                 }
2585                                 sas.ss_sp = malloc (SIGSTKSZ);
2586                                 sas.ss_size = SIGSTKSZ;
2587                                 sas.ss_flags = 0;
2588                                 if (sigaltstack (&sas, NULL) == -1) {
2589                                         perror ("sigaltstack");
2590                                         return;
2591                                 }
2593                                 pthread_attr_init (&attr);
2594                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2595                                         printf ("pthread_create\n");
2596                                         return;
2597                                 }
2599                                 sleep (100);
2600                         }
2602                         int
2603                         main ()
2604                         {
2605                                 pid_t son;
2606                                 int status;
2607                                 int i;
2609                                 son = fork ();
2610                                 if (son == -1) {
2611                                         return 1;
2612                                 }
2614                                 if (son == 0) {
2615                                         child ();
2616                                         return 0;
2617                                 }
2619                                 for (i = 0; i < 300; ++i) {
2620                                         waitpid (son, &status, WNOHANG);
2621                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2622                                                 return 0;
2623                                         usleep (10000);
2624                                 }
2626                                 kill (son, SIGKILL);
2627                                 return 1;
2628                         }
2630                 ], [
2631                                 AC_MSG_RESULT(yes)
2632                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2633                 ], [
2634                                 with_sigaltstack=no
2635                                 AC_MSG_RESULT(no)
2636                 ])
2637         fi
2639         dnl ********************************
2640         dnl *** Checks for semaphore lib ***
2641         dnl ********************************
2642         # 'Real Time' functions on Solaris
2643         # posix4 on Solaris 2.6
2644         # pthread (first!) on Linux
2645         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2647         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2648         AC_CHECK_FUNCS(shm_open)
2650         dnl ********************************
2651         dnl *** Checks for timezone stuff **
2652         dnl ********************************
2653         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2654                 AC_TRY_COMPILE([
2655                         #include <time.h>
2656                         ], [
2657                         struct tm tm;
2658                         tm.tm_gmtoff = 1;
2659                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2660         if test $ac_cv_struct_tm_gmtoff = yes; then
2661                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2662         else
2663                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2664                         AC_TRY_COMPILE([
2665                                 #include <time.h>
2666                         ], [
2667                                 timezone = 1;
2668                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2669                 if test $ac_cv_var_timezone = yes; then
2670                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2671                 else
2672                         AC_ERROR(unable to find a way to determine timezone)
2673                 fi
2674         fi
2676         dnl *********************************
2677         dnl *** Checks for math functions ***
2678         dnl *********************************
2679         AC_SEARCH_LIBS(sqrtf, m)
2681         dnl ****************************************************************
2682         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2683         dnl *** have it in the library (duh))                            ***
2684         dnl ****************************************************************
2685         AC_CHECK_FUNCS(poll)
2687         dnl **********************************
2688         dnl *** epoll                      ***
2689         dnl **********************************
2690         AC_CHECK_HEADERS(sys/epoll.h)
2691         haveepoll=no
2692         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2693         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2694                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2695         fi
2697         havekqueue=no
2699         AC_CHECK_HEADERS(sys/event.h)
2700         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2702         dnl **************************************
2703         dnl * Darwin has a race that prevents us from using reliably:
2704         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2705         dnl * Since kqueue is mostly used for scaling large web servers, 
2706         dnl * and very few folks run Mono on large web servers on OSX, falling
2707         dnl * back 
2708         dnl **************************************
2709         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2710                 if test "x$host_darwin" = "xno"; then
2711                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2712                 fi
2713         fi
2715         dnl ******************************
2716         dnl *** Checks for SIOCGIFCONF ***
2717         dnl ******************************
2718         AC_CHECK_HEADERS(sys/ioctl.h)
2719         AC_CHECK_HEADERS(net/if.h, [], [],
2720            [
2721            #ifdef HAVE_SYS_TYPES_H
2722            # include <sys/types.h>
2723            #endif
2724            #ifdef HAVE_SYS_SOCKET_H
2725            # include <sys/socket.h>
2726            #endif
2727            ])
2728         AC_MSG_CHECKING(for ifreq)
2729         AC_TRY_COMPILE([
2730                 #include <stdio.h>
2731                 #include <sys/ioctl.h>
2732                 #include <net/if.h>
2733                 ], [
2734                 struct ifconf ifc;
2735                 struct ifreq *ifr;
2736                 void *x;
2737                 ifc.ifc_len = 0;
2738                 ifc.ifc_buf = NULL;
2739                 x = (void *) &ifr->ifr_addr;
2740                 ],[
2741                         AC_MSG_RESULT(yes)
2742                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2743                 ], [
2744                         AC_MSG_RESULT(no)
2745                 ])
2746         dnl **********************************
2747         dnl ***     Checks for sin_len     ***
2748         dnl **********************************
2749         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2750         AC_TRY_COMPILE([
2751                 #include <netinet/in.h>
2752                 ], [
2753                 struct sockaddr_in saddr;
2754                 saddr.sin_len = sizeof (saddr);
2755                 ],[
2756                         AC_MSG_RESULT(yes)
2757                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2758                 ], [
2759                         AC_MSG_RESULT(no)
2760                 ])      
2761         dnl **********************************
2762         dnl ***    Checks for sin6_len     ***
2763         dnl **********************************
2764         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2765         AC_TRY_COMPILE([
2766                 #include <netinet/in.h>
2767                 ], [
2768                 struct sockaddr_in6 saddr6;
2769                 saddr6.sin6_len = sizeof (saddr6);
2770                 ],[
2771                         AC_MSG_RESULT(yes)
2772                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2773                 ], [
2774                         AC_MSG_RESULT(no)
2775                 ])
2776         dnl **********************************
2777         dnl *** Check for getifaddrs       ***
2778         dnl **********************************
2779         AC_MSG_CHECKING(for getifaddrs)
2780                 AC_TRY_LINK([
2781                 #include <stdio.h>
2782                 #include <sys/types.h>
2783                 #include <sys/socket.h>
2784                 #include <ifaddrs.h>
2785         ], [
2786                 getifaddrs(NULL);
2787         ], [
2788                 # Yes, we have it...
2789                 AC_MSG_RESULT(yes)
2790                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2791         ], [
2792                 AC_MSG_RESULT(no)
2793         ])
2794         dnl **********************************
2795         dnl *** Check for if_nametoindex   ***
2796         dnl **********************************
2797         AC_MSG_CHECKING(for if_nametoindex)
2798                 AC_TRY_LINK([
2799                 #include <stdio.h>
2800                 #include <sys/types.h>
2801                 #include <sys/socket.h>
2802                 #include <net/if.h>
2803         ], [
2804                 if_nametoindex(NULL);
2805         ], [
2806                 # Yes, we have it...
2807                 AC_MSG_RESULT(yes)
2808                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2809         ], [
2810                 AC_MSG_RESULT(no)
2811         ])
2812         dnl **********************************
2813         dnl *** Check for access ***
2814         dnl **********************************
2815         AC_MSG_CHECKING(for access)
2816                 AC_TRY_LINK([
2817                 #include <unistd.h>
2818         ], [
2819                 access(NULL,0);
2820         ], [
2821                 # Yes, we have it...
2822                 AC_MSG_RESULT(yes)
2823                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2824         ], [
2825                 AC_MSG_RESULT(no)
2826         ])
2827                         
2828         dnl **********************************
2829         dnl *** Checks for proclib         ***
2830         dnl **********************************
2831         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.)])
2832         dnl **********************************
2833         dnl *** Checks for MonoPosixHelper ***
2834         dnl **********************************
2835         AC_CHECK_HEADERS(checklist.h)
2836         AC_CHECK_HEADERS(pathconf.h)
2837         AC_CHECK_HEADERS(fstab.h)
2838         AC_CHECK_HEADERS(attr/xattr.h)
2839         AC_CHECK_HEADERS(sys/extattr.h)
2840         AC_CHECK_HEADERS(sys/sendfile.h)
2841         AC_CHECK_HEADERS(sys/statvfs.h)
2842         AC_CHECK_HEADERS(sys/statfs.h)
2843         AC_CHECK_HEADERS(sys/vfstab.h)
2844         AC_CHECK_HEADERS(sys/xattr.h)
2845         AC_CHECK_HEADERS(sys/mman.h)
2846         AC_CHECK_HEADERS(sys/param.h)
2847         AC_CHECK_HEADERS(sys/mount.h, [], [],
2848                 [
2849                 #ifdef HAVE_SYS_PARAM_H
2850                 # include <sys/param.h>
2851                 #endif
2852                 ])
2853         AC_CHECK_HEADERS(sys/mount.h)
2854         AC_CHECK_FUNCS(confstr)
2855         AC_CHECK_FUNCS(seekdir telldir)
2856         AC_CHECK_FUNCS(getdomainname)
2857         AC_CHECK_FUNCS(setdomainname)
2858         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2859         AC_CHECK_FUNCS(setgroups)
2860         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2861         AC_CHECK_FUNCS(getfsstat)
2862         AC_CHECK_FUNCS(lutimes futimes)
2863         AC_CHECK_FUNCS(mremap)
2864         AC_CHECK_FUNCS(remap_file_pages)
2865         AC_CHECK_FUNCS(posix_fadvise)
2866         AC_CHECK_FUNCS(posix_fallocate)
2867         AC_CHECK_FUNCS(posix_madvise)
2868         AC_CHECK_FUNCS(vsnprintf)
2869         AC_CHECK_FUNCS(sendfile)
2870         AC_CHECK_FUNCS(gethostid sethostid)
2871         AC_CHECK_FUNCS(sethostname)
2872         AC_CHECK_FUNCS(statfs)
2873         AC_CHECK_FUNCS(fstatfs)
2874         AC_CHECK_FUNCS(statvfs)
2875         AC_CHECK_FUNCS(fstatvfs)
2876         AC_CHECK_FUNCS(stime)
2877         AC_CHECK_FUNCS(ttyname_r)
2878         AC_CHECK_FUNCS(psignal)
2879         AC_CHECK_FUNCS(getlogin_r)
2880         AC_CHECK_FUNCS(lockf)
2881         AC_CHECK_FUNCS(swab)
2882         AC_CHECK_FUNCS(setusershell endusershell)
2883         AC_CHECK_FUNCS(futimens utimensat)
2884         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2885         AC_CHECK_FUNCS(readv writev preadv pwritev)
2886         AC_CHECK_FUNCS(setpgid)
2887         AC_CHECK_FUNCS(system)
2888         AC_CHECK_FUNCS(fork execv execve)
2889         AC_CHECK_FUNCS(accept4)
2890         AC_CHECK_FUNCS(localtime_r)
2891         AC_CHECK_FUNCS(mkdtemp)
2892         AC_CHECK_SIZEOF(size_t)
2893         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2894                 [#include <sys/types.h>
2895                  #include <sys/stat.h>
2896                  #include <unistd.h>])
2897         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2898                 [#include <sys/types.h>
2899                  #include <sys/stat.h>
2900                  #include <unistd.h>])
2901         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2902                 [#include <sys/time.h>])
2903         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2904                 [#include <sys/socket.h>])
2905         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2906                 [#include <unistd.h>
2907                  #include <fcntl.h>])
2908         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2909                 [#include <sys/uio.h>])
2910         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2911                 [#include <sys/socket.h>])
2912         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2913                 [#include <sys/poll.h>])
2914         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2915                 [#include <sys/socket.h>])
2916         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2917                 [#include <sys/socket.h>])
2918         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2919                 [#include <netinet/in.h>])
2920         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2921                 [#include <netinet/in.h>])
2922         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2923                 [#include <sys/un.h>])
2924         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2925                 [#include <sys/types.h>
2926                  #include <sys/stat.h>
2927                  #include <unistd.h>])
2928         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2929                 [#include <time.h>])
2930         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2931                 [#include <sys/time.h>
2932                  #include <sys/types.h>
2933                  #include <utime.h>])
2934         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2935                 [#include <sys/time.h>])
2936         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2937                 [#include <sys/types.h>
2938                  #include <utime.h>])
2939         AC_CHECK_MEMBERS(
2940                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2941                 [#include <sys/types.h>
2942                  #include <dirent.h>])
2943         AC_CHECK_MEMBERS(
2944                 [struct passwd.pw_gecos],,, 
2945                 [#include <sys/types.h>
2946                  #include <pwd.h>])
2947         AC_CHECK_MEMBERS(
2948                 [struct statfs.f_flags],,, 
2949                 [#include <sys/types.h>
2950                  #include <sys/vfs.h>])
2951         AC_CHECK_MEMBERS(
2952                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2953                 [#include <sys/types.h>
2954                  #include <sys/stat.h>
2955                  #include <unistd.h>])
2957         dnl Favour xattr through glibc, but use libattr if we have to
2958         AC_CHECK_FUNC(lsetxattr, ,
2959                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2960         )
2961         AC_SUBST(XATTR_LIB)
2963         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2964         AC_CHECK_MEMBERS(
2965                 [struct kinfo_proc.kp_proc],,, 
2966                 [#include <sys/types.h>
2967                  #include <sys/param.h>
2968                  #include <sys/sysctl.h>
2969                  #include <sys/proc.h>
2970                  ])
2972         dnl *********************************
2973         dnl *** Checks for Windows compilation ***
2974         dnl *********************************
2975         AC_CHECK_HEADERS(sys/time.h)
2976         AC_CHECK_HEADERS(sys/param.h)
2977         AC_CHECK_HEADERS(dirent.h)
2979         dnl ******************************************
2980         dnl *** Checks for OSX and iOS compilation ***
2981         dnl ******************************************
2982         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2984         dnl *********************************
2985         dnl *** Check for Console 2.0 I/O ***
2986         dnl *********************************
2987         AC_CHECK_HEADERS([curses.h])
2988         AC_CHECK_HEADERS([term.h], [], [],
2989         [#if HAVE_CURSES_H
2990          #include <curses.h>
2991          #endif
2992         ])
2993         AC_CHECK_HEADERS([termios.h])
2995         dnl *********************************
2996         dnl *** Checks for random         ***
2997         dnl *********************************
2998         if test x$host_darwin = xno; then
2999                 AC_CHECK_HEADERS(sys/random.h)
3000                 AC_CHECK_FUNCS(getrandom getentropy)
3001         fi
3003         dnl *********************************
3004         dnl *** Checks for Mono.Native  ***
3005         dnl *********************************
3007         AC_MSG_CHECKING(for linux/in.h)
3008         AC_TRY_COMPILE([
3009                 #include <sys/socket.h>
3010                 #include <linux/in.h>
3011         ], [
3012         ],[
3013                 AC_MSG_RESULT(yes)
3014                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3015         ], [
3016                 AC_MSG_RESULT(no)
3017         ])
3019         AC_MSG_CHECKING(for struct in_pktinfo)
3020         AC_TRY_COMPILE([
3021                 #ifdef HAVE_LINUX_IN_H
3022                 #include <sys/socket.h>
3023                 #include <linux/in.h>
3024                 #else
3025                 #include <netinet/in.h>
3026                 #endif
3027         ], [
3028                 struct in_pktinfo pktinfo;
3029         ],[
3030                 AC_MSG_RESULT(yes)
3031                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3032         ], [
3033                 AC_MSG_RESULT(no)
3034         ])
3036         AC_MSG_CHECKING(for struct ip_mreqn)
3037         AC_TRY_COMPILE([
3038                 #if HAVE_LINUX_IN_H
3039                 #include <sys/socket.h>
3040                 #include <linux/in.h>
3041                 #else
3042                 #include <netinet/in.h>
3043                 #endif
3044         ], [
3045                 struct ip_mreqn mreqn;
3046         ],[
3047                 AC_MSG_RESULT(yes)
3048                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3049         ], [
3050                 AC_MSG_RESULT(no)
3051         ])
3053         if test x$host_darwin = xno; then
3054                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3055         fi
3057         if test x$mono_native_platform_ios = xno; then
3058                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3059                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3060                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3061         fi
3063         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3064         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3065         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3066         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3067         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3068         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3069         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3070         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3071         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3072         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3073         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3074         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3075         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3076         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3077         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3078         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3079         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3080         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3081         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3083         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3084         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3086         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>]])
3087         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>]])
3088         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>]])
3089         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>]])
3090         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3091         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3092         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3094         AC_MSG_CHECKING(for struct statfs)
3095         AC_TRY_COMPILE([
3096                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3097                 #include <sys/mount.h>
3098                 #else
3099                 #include <sys/statfs.h>
3100                 #endif
3101         ], [
3102                 struct statfs;
3103         ],[
3104                 AC_MSG_RESULT(yes)
3105                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3106         ], [
3107                 AC_MSG_RESULT(no)
3108         ])
3110         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3111                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3112         fi
3114         AC_MSG_CHECKING(for readdir_r)
3115         AC_TRY_COMPILE([
3116                 #include <dirent.h>
3117         ], [
3118                 DIR* dir;
3119                 struct dirent* entry;
3120                 struct dirent* result;
3121                 readdir_r(dir, entry, &result);
3122         ],[
3123                 AC_MSG_RESULT(yes)
3124                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3125         ], [
3126                 AC_MSG_RESULT(no)
3127         ])
3129         AC_MSG_CHECKING(for kevent with void *data)
3130         AC_TRY_COMPILE([
3131                 #include <sys/types.h>
3132                 #include <sys/event.h>
3133         ], [
3134                 struct kevent event;
3135                 void* data;
3136                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3137         ],[
3138                 AC_MSG_RESULT(yes)
3139                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3140         ], [
3141                 AC_MSG_RESULT(no)
3142         ])
3144         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3145         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3147         AC_MSG_CHECKING(for sendfile with 4 arguments)
3148         AC_TRY_COMPILE([
3149                 #include <sys/sendfile.h>
3150         ], [
3151                 int result = sendfile(0, 0, 0, 0);
3152         ],[
3153                 AC_MSG_RESULT(yes)
3154                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3155         ], [
3156                 AC_MSG_RESULT(no)
3157         ])
3159         AC_MSG_CHECKING(for sendfile with 6 arguments)
3160         AC_TRY_LINK([
3161                 #include <stdlib.h>
3162                 #include <sys/types.h>
3163                 #include <sys/socket.h>
3164                 #include <sys/uio.h>
3165         ], [
3166                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3167         ],[
3168                 AC_MSG_RESULT(yes)
3169                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3170         ], [
3171                 AC_MSG_RESULT(no)
3172         ])
3174         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3175         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3176         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3177         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3179         ORIG_CFLAGS="$CFLAGS"
3180         CFLAGS="-Werror -Wsign-conversion"
3182         AC_MSG_CHECKING(for getnameinfo with signed flags)
3183         AC_TRY_COMPILE([
3184                 #include <sys/types.h>
3185                 #include <netdb.h>
3186         ], [
3187                 const struct sockaddr *addr;
3188                 socklen_t addrlen;
3189                 char *host;
3190                 socklen_t hostlen;
3191                 char *serv;
3192                 socklen_t servlen;
3193                 int flags;
3194                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3195         ],[
3196                 AC_MSG_RESULT(yes)
3197                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3198         ], [
3199                 AC_MSG_RESULT(no)
3200         ])
3202         CFLAGS="$ORIG_CFLAGS"
3204         if test "x$host_linux" = "xyes"; then
3205                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3206         else
3207                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3208         fi
3210         ORIG_CFLAGS="$CFLAGS"
3211         CFLAGS="-Werror -Wsign-conversion"
3213         AC_MSG_CHECKING(for bind with unsigned addrlen)
3214         AC_TRY_COMPILE([
3215                 #include <sys/socket.h>
3216         ], [
3217                 int fd;
3218                 struct sockaddr* addr;
3219                 socklen_t addrLen;
3220                 bind(fd, addr, addrLen);
3221         ],[
3222                 AC_MSG_RESULT(yes)
3223                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3224         ], [
3225                 AC_MSG_RESULT(no)
3226         ])
3228         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3229         AC_TRY_COMPILE([
3230                 #include <netinet/in.h>
3231                 #include <netinet/tcp.h>
3232         ], [
3233                 struct ipv6_mreq opt;
3234                 unsigned int index = 0;
3235                 opt.ipv6mr_interface = index;
3236         ],[
3237                 AC_MSG_RESULT(yes)
3238                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3239         ], [
3240                 AC_MSG_RESULT(no)
3241         ])
3243         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3244         AC_TRY_COMPILE([
3245                 #include <sys/inotify.h>
3246         ], [
3247                 intptr_t fd;
3248                 uint32_t wd;
3249                 int result = inotify_rm_watch(fd, wd);
3250         ],[
3251                 AC_MSG_RESULT(yes)
3252                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3253         ], [
3254                 AC_MSG_RESULT(no)
3255         ])
3257         CFLAGS="$ORIG_CFLAGS"
3259         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3260         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3261                 AC_MSG_RESULT(no)
3262         else
3263                 AC_TRY_RUN([
3264                         #include <sys/mman.h>
3265                         #include <fcntl.h>
3266                         #include <unistd.h>
3268                         int main ()
3269                         {
3270                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3271                                 if (fd == -1)
3272                                         return -1;
3274                                 shm_unlink("/mono_configure_shm_open");
3276                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3277                                 //       on at least the current version of Mac OS X
3279                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3280                                         return -1;
3282                                 return 0;
3283                         }
3284                 ],[
3285                         AC_MSG_RESULT(yes)
3286                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3287                 ], [
3288                         AC_MSG_RESULT(no)
3289                 ])
3290         fi
3292         AC_MSG_CHECKING(for getpriority with int who)
3293         AC_TRY_COMPILE([
3294                 #include <sys/resource.h>
3295         ], [
3296                 int which;
3297                 int who;
3298                 int result = getpriority(which, who);
3299         ],[
3300                 AC_MSG_RESULT(yes)
3301                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3302         ], [
3303                 AC_MSG_RESULT(no)
3304         ])
3306         AC_MSG_CHECKING(for kevent with int parameters)
3307         AC_TRY_COMPILE([
3308                 #include <sys/types.h>
3309                 #include <sys/event.h>
3310         ], [
3311                 int kg;
3312                 const struct kevent* chagelist;
3313                 int nchanges;
3314                 struct kevent* eventlist;
3315                 int nevents;
3316                 const struct timespec* timeout;
3317                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3318         ],[
3319                 AC_MSG_RESULT(yes)
3320                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3321         ], [
3322                 AC_MSG_RESULT(no)
3323         ])
3325         ORIG_CFLAGS="$CFLAGS"
3326         CFLAGS="-Werror -Wimplicit-function-declaration"
3328         AC_MSG_CHECKING(for mkstemps)
3329         AC_TRY_COMPILE([
3330                 #include <stdlib.h>
3331                 #include <unistd.h>
3332                 #include <string.h>
3333         ], [
3334                 char *template;
3335                 int suffixlen;
3336                 int result = mkstemps(template, suffixlen);
3337         ],[
3338                 AC_MSG_RESULT(yes)
3339                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3340                 have_mkstemps=yes
3341         ], [
3342                 AC_MSG_RESULT(no)
3343         ])
3345         CFLAGS="$ORIG_CFLAGS"
3347         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3348                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3349         fi
3351         AC_MSG_CHECKING(for tcp/var.h)
3352         AC_TRY_COMPILE([
3353                 #include <sys/types.h>
3354                 #include <sys/socketvar.h>
3355                 #include <netinet/ip.h>
3356                 #include <netinet/tcp.h>
3357                 #include <netinet/tcp_var.h>
3358         ], [
3359         ],[
3360                 AC_MSG_RESULT(yes)
3361                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3362         ], [
3363                 AC_MSG_RESULT(no)
3364         ])
3366         AC_CHECK_HEADERS([sys/cdefs.h])
3368         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3369         AC_TRY_COMPILE([
3370                 #ifdef HAVE_SYS_CDEFS_H
3371                 #include <sys/cdefs.h>
3372                 #endif
3373                 #include <netinet/tcp.h>
3374         ], [
3375                 int result = TCP_ESTABLISHED;
3376         ],[
3377                 AC_MSG_RESULT(yes)
3378                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3379         ], [
3380                 AC_MSG_RESULT(no)
3381         ])
3383         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3385         AC_MSG_CHECKING(for struct rt_msghdr)
3386         AC_TRY_COMPILE([
3387                 #include <sys/types.h>
3388                 #include <net/route.h>
3389         ], [
3390                 struct rt_msghdr;
3391         ],[
3392                 AC_MSG_RESULT(yes)
3393                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3394         ], [
3395                 AC_MSG_RESULT(no)
3396         ])
3398         AC_CHECK_HEADERS([sys/sysctl.h])
3399         AC_CHECK_HEADERS([linux/rtnetlink.h])
3401         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3402         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3403         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3405         ORIG_CFLAGS="$CFLAGS"
3406         CFLAGS="-Werror -Weverything"
3408         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3409         AC_TRY_COMPILE([
3410                 #include <unistd.h>
3411         ], [
3412                 size_t namelen = 20;
3413                 char name[20];
3414                 int result = getdomainname(name, namelen);
3415         ],[
3416                 AC_MSG_RESULT(yes)
3417                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3418         ], [
3419                 AC_MSG_RESULT(no)
3420         ])
3422         CFLAGS="$ORIG_CFLAGS"
3424         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3425         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3426         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3428         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
3429                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3430         elif test "x$host_linux" = "xyes"; then
3431                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3432         fi
3434         AC_CHECK_HEADERS([crt_externs.h])
3436         AC_MSG_CHECKING(for _NSGetEnviron)
3437         AC_TRY_COMPILE([
3438                 #include <crt_externs.h>
3439         ], [
3440                 char **result = *(_NSGetEnviron());
3441         ],[
3442                 AC_MSG_RESULT(yes)
3443                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3444         ], [
3445                 AC_MSG_RESULT(no)
3446         ])
3448         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3450 else
3451         dnl *********************************
3452         dnl *** Checks for Windows compilation ***
3453         dnl *********************************
3454         AC_CHECK_HEADERS(winternl.h)
3456         jdk_headers_found=no
3457         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3458         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3459         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3460         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3461         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3462         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3463         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3465         dnl *********************************
3466         dnl *** Check for struct ip_mreqn ***
3467         dnl *********************************
3468         AC_MSG_CHECKING(for struct ip_mreqn)
3469         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3470                 struct ip_mreqn mreq;
3471                 mreq.imr_address.s_addr = 0;
3472         ], [
3473                 # Yes, we have it...
3474                 AC_MSG_RESULT(yes)
3475                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3476         ], [
3477                 # We'll just have to try and use struct ip_mreq
3478                 AC_MSG_RESULT(no)
3479                 AC_MSG_CHECKING(for struct ip_mreq)
3480                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3481                         struct ip_mreq mreq;
3482                         mreq.imr_interface.s_addr = 0;
3483                 ], [
3484                         # Yes, we have it...
3485                         AC_MSG_RESULT(yes)
3486                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3487                 ], [
3488                         # No multicast support
3489                         AC_MSG_RESULT(no)
3490                 ])
3491         ])
3493         dnl **********************************
3494         dnl *** Check for getaddrinfo ***
3495         dnl **********************************
3496         AC_MSG_CHECKING(for getaddrinfo)
3497                 AC_TRY_LINK([
3498                 #include <stdio.h>
3499                 #include <winsock2.h>
3500                 #include <ws2tcpip.h>
3501         ], [
3502                 getaddrinfo(NULL,NULL,NULL,NULL);
3503         ], [
3504                 # Yes, we have it...
3505                 AC_MSG_RESULT(yes)
3506                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3507         ], [
3508                 AC_MSG_RESULT(no)
3509         ])
3511         dnl **********************************
3512         dnl *** Check for gethostbyname ***
3513         dnl **********************************
3514         AC_MSG_CHECKING(for gethostbyname)
3515                 AC_TRY_LINK([
3516                 #include <stdio.h>
3517                 #include <winsock2.h>
3518                 #include <ws2tcpip.h>
3519         ], [
3520                 gethostbyname(NULL);
3521         ], [
3522                 # Yes, we have it...
3523                 AC_MSG_RESULT(yes)
3524                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3525         ], [
3526                 AC_MSG_RESULT(no)
3527         ])
3529         dnl **********************************
3530         dnl *** Check for getprotobyname ***
3531         dnl **********************************
3532         AC_MSG_CHECKING(for getprotobyname)
3533                 AC_TRY_LINK([
3534                 #include <stdio.h>
3535                 #include <winsock2.h>
3536                 #include <ws2tcpip.h>
3537         ], [
3538                 getprotobyname(NULL);
3539         ], [
3540                 # Yes, we have it...
3541                 AC_MSG_RESULT(yes)
3542                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3543         ], [
3544                 AC_MSG_RESULT(no)
3545         ])
3547         dnl **********************************
3548         dnl *** Check for getnameinfo ***
3549         dnl **********************************
3550         AC_MSG_CHECKING(for getnameinfo)
3551                 AC_TRY_LINK([
3552                 #include <stdio.h>
3553                 #include <winsock2.h>
3554                 #include <ws2tcpip.h>
3555         ], [
3556                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3557         ], [
3558                 # Yes, we have it...
3559                 AC_MSG_RESULT(yes)
3560                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3561         ], [
3562                 AC_MSG_RESULT(no)
3563         ])
3565         dnl **********************************
3566         dnl *** Check for inet_ntop ***
3567         dnl **********************************
3568         AC_MSG_CHECKING(for inet_ntop)
3569                 AC_TRY_LINK([
3570                 #include <stdio.h>
3571                 #include <winsock2.h>
3572                 #include <ws2tcpip.h>
3573         ], [
3574                 inet_ntop (0, NULL, NULL, 0);
3575         ], [
3576                 # Yes, we have it...
3577                 AC_MSG_RESULT(yes)
3578                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3579         ], [
3580                 AC_MSG_RESULT(no)
3581         ])
3583         dnl **********************************
3584         dnl *** Check for inet_pton ***
3585         dnl **********************************
3586         AC_MSG_CHECKING(for inet_pton)
3587                 AC_TRY_LINK([
3588                 #include <stdio.h>
3589                 #include <winsock2.h>
3590                 #include <ws2tcpip.h>
3591         ], [
3592                 #ifndef inet_pton
3593                 (void) inet_pton;
3594                 #endif
3595                 inet_pton (0, NULL, NULL);
3596         ], [
3597                 # Yes, we have it...
3598                 AC_MSG_RESULT(yes)
3599                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3600         ], [
3601                 AC_MSG_RESULT(no)
3602         ])
3604         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3605         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3606         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3607         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3608         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3609         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3610         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3613 dnl socklen_t check
3614 AC_MSG_CHECKING(for socklen_t)
3615 AC_TRY_COMPILE([
3616 #include <sys/types.h>
3617 #include <sys/socket.h>
3619   socklen_t foo;
3621 ac_cv_c_socklen_t=yes
3622         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3623         AC_MSG_RESULT(yes)
3625         AC_MSG_RESULT(no)
3628 AC_CHECK_FUNCS(execvp)
3630 dnl ****************************
3631 dnl *** Look for /dev/random ***
3632 dnl ****************************
3634 AC_MSG_CHECKING([if usage of random device is requested])
3635 AC_ARG_ENABLE(dev-random,
3636 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3637 try_dev_random=$enableval, try_dev_random=yes)
3639 AC_MSG_RESULT($try_dev_random)
3641 case "{$build}" in
3643 dnl IBM i does not have /dev/random, use unblocking only
3645     *-*-os400*)
3646     NAME_DEV_RANDOM="/dev/urandom"
3647     ;;
3649 dnl Win32 does not have /dev/random, they have their own method...
3651     *-mingw*|*-*-cygwin*)
3652     ac_cv_have_dev_random=no
3653     ;;
3655 dnl Everywhere else, it's /dev/random
3657     *)
3658     NAME_DEV_RANDOM="/dev/random"
3659     ;;
3660 esac
3662 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3664 dnl Now check if the device actually exists
3666 if test "x$try_dev_random" = "xyes"; then
3667     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3668     [if test -r "$NAME_DEV_RANDOM" ; then
3669         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3670     if test "x$ac_cv_have_dev_random" = "xyes"; then
3671         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3672     fi
3673 else
3674     AC_MSG_CHECKING(for random device)
3675     ac_cv_have_dev_random=no
3676     AC_MSG_RESULT(has been disabled)
3679 if test "x$host_win32" = "xyes"; then
3680     AC_DEFINE(HAVE_CRYPT_RNG)
3683 if test "x$ac_cv_have_dev_random" = "xno" \
3684     && test "x$host_win32" = "xno"; then
3685     AC_MSG_WARN([[
3687 *** A system-provided entropy source was not found on this system.
3688 *** Because of this, the System.Security.Cryptography random number generator
3689 *** will throw a NotImplemented exception.
3691 *** If you are seeing this message, and you know your system DOES have an
3692 *** entropy collection in place, please report an issue on GitHub and
3693 *** provide information about the system and how to access the random device.
3695 *** Otherwise you can install either egd or prngd and set the environment
3696 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3697 ***]])
3700 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)
3702 AC_MSG_CHECKING([if big-arrays are to be enabled])
3703 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)
3704 if test "x$enable_big_arrays" = "xyes" ; then
3705     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3706         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3707     else
3708         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3709     fi
3711 AC_MSG_RESULT($enable_big_arrays)
3713 dnl **************
3714 dnl *** DTRACE ***
3715 dnl **************
3717 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3719 if test "x$enable_dtrace" = "xyes"; then
3720    if test "x$has_dtrace" = "xno"; then
3721           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3722    fi
3723    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3724    if test "x$DTRACE" = "xno"; then
3725           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3726           enable_dtrace=no
3727    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3728           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3729           enable_dtrace=no
3730    fi
3733 dtrace_g=no
3734 if test "x$enable_dtrace" = "xyes"; then
3735         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3736         DTRACEFLAGS=
3737         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3738                 case "$host" in
3739                         powerpc-*-darwin*)
3740                         DTRACEFLAGS="-arch ppc64"
3741                         ;;
3742                         i*86-*-darwin*)
3743                         DTRACEFLAGS="-arch x86_64"
3744                         ;;
3745                         *)
3746                         DTRACEFLAGS=-64
3747                         ;;
3748                 esac
3749         else
3750                 case "$host" in
3751                         powerpc-*-darwin*)
3752                         DTRACEFLAGS="-arch ppc"
3753                         ;;
3754                         i*86-*-darwin*)
3755                         DTRACEFLAGS="-arch i386"
3756                         ;;
3757                         *)
3758                         DTRACEFLAGS=-32
3759                         ;;
3760                 esac
3761         fi
3762         AC_SUBST(DTRACEFLAGS)
3763         case "$host" in
3764                 *-*-solaris*)
3765                 dtrace_g=yes
3766                 ;;
3767         esac
3768         AC_CHECK_HEADERS([sys/sdt.h])
3770 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3771 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3773 dnl **************************
3774 dnl *** AOT cross offsets  ***
3775 dnl **************************
3777 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3778     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3780 dnl **************
3781 dnl ***  LLVM  ***
3782 dnl **************
3784 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3785 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3786 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)
3787 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3788 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3790 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3792 if test "x$enable_llvm" = "xdefault"; then
3793    enable_llvm=$enable_llvm_default
3796 internal_llvm="no"
3797 if test "x$enable_llvm" = "xyes"; then
3798         if test "x$with_llvm" != "x"; then
3799                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3800                 if test x$host_win32 = xyes; then
3801                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3802                 fi
3803                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3804                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3805                 fi
3806         else
3807                 if test x$host_win32 = xyes; then
3808                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3809                 else
3810                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3811                 fi
3812                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3813                         internal_llvm=yes
3814                 fi
3815         fi
3817         LLVM_CODEGEN_LIBS="x86codegen"
3818         case "$target" in
3819         arm*)
3820                 LLVM_CODEGEN_LIBS="armcodegen"
3821                 ;;
3822         aarch64*)
3823                 LLVM_CODEGEN_LIBS="aarch64codegen"
3824                 ;;
3825         powerpc*)
3826                 LLVM_CODEGEN_LIBS="powerpccodegen"
3827                 ;;
3828         esac
3829         if test "x$host" != "x$target"; then
3830                 # No need for jit libs
3831                 LLVM_CODEGEN_LIBS=
3832         fi
3834         AC_SUBST(LLVM_CODEGEN_LIBS)
3835         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3836         
3837         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3838 fi # ENABLE_LLVM
3840 # AC_DEFINE necessary for correct restore behavior on Linux
3841 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3842 if test "x$internal_llvm" != "xno"; then
3843    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3846 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3847 if test "x$enable_llvm_asserts" != "xno"; then
3848    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3851 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3853 if test "x$enable_loadedllvm" = "xyes"; then
3854    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3856 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3858 if test "x$enable_llvm" = "xyes"; then
3859    enable_llvm_runtime=yes
3861 if test "x$enable_llvm_runtime" = "xyes"; then
3862    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3864 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3866 TARGET="unknown"
3867 ACCESS_UNALIGNED="yes"
3869 LIBC="libc.so.6"
3870 INTL="libc.so.6"
3871 SQLITE="libsqlite.so.0"
3872 SQLITE3="libsqlite3.so.0"
3873 X11="libX11.so"
3874 GDKX11="libgdk-x11-2.0.so.0"
3875 GTKX11="libgtk-x11-2.0.so.0"
3876 XINERAMA="libXinerama.so.1"
3878 sizeof_register="SIZEOF_VOID_P"
3880 jit_wanted=true
3881 boehm_supported=true
3882 BTLS_SUPPORTED=no
3883 BTLS_PLATFORM=
3885 case "$host" in
3886         wasm32*)
3887                 TARGET=WASM
3888                 arch_target=wasm
3889                 BTLS_SUPPORTED=no
3890                 ACCESS_UNALIGNED="no"
3891                 with_tls=pthread
3892                 ;;
3893         mips*)
3894                 TARGET=MIPS;
3895                 arch_target=mips;
3896                 with_tls=pthread;
3897                 ACCESS_UNALIGNED="no"
3899                 AC_MSG_CHECKING(for mips n32)
3900                 AC_TRY_COMPILE([],[
3901                 #if _MIPS_SIM != _ABIN32
3902                 #error Not mips n32
3903                 #endif
3904                 ],[
3905                 AC_MSG_RESULT(yes)
3906                 sizeof_register=8
3907                 ],[
3908                 AC_MSG_RESULT(no)
3909                 ])
3910                 ;;
3911         i*86-*-*)
3912                 TARGET=X86;
3913                 arch_target=x86;
3914                 case $host_os in
3915                   solaris*)
3916                         LIBC="libc.so"
3917                         INTL="libintl.so"
3918                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3919                                 TARGET=AMD64
3920                                 arch_target=amd64
3921                         fi
3923                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3924                         # int astruct __attribute__ ((visibility ("hidden")));
3925                         # void foo ()
3926                         # {
3927                         #       void *p = &astruct;
3928                         # }
3929                         # gcc -fPIC --shared -o libfoo.so foo.c
3930                         # yields:
3931                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3932                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3933                         have_visibility_hidden=no
3934                         ;;
3935                   mingw*|cygwin*)
3936                         have_visibility_hidden=no
3937                         BTLS_SUPPORTED=no
3938                         BTLS_PLATFORM=i386
3939                         ;;
3940                   haiku*)
3941                         LIBC=libroot.so
3942                         ;;
3943                   linux*)
3944                         AOT_SUPPORTED="yes"
3945                         BTLS_SUPPORTED=yes
3946                         BTLS_PLATFORM=i386
3947                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3948                         ;;
3949                   darwin*)
3950                         AOT_SUPPORTED="yes"
3951                         BTLS_SUPPORTED=yes
3952                         BTLS_PLATFORM=i386
3953                         ;;
3954                   openbsd*|freebsd*|kfreebsd-gnu*)
3955                         AOT_SUPPORTED="yes"
3956                         BTLS_SUPPORTED=yes
3957                         BTLS_PLATFORM=i386
3958                         ;;
3959                 esac
3960                 ;;
3961         x86_64-*-* | amd64-*-*)
3962                 TARGET=AMD64;
3963                 arch_target=amd64;
3964                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3965                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
3966                         sizeof_register=8
3967                 fi
3968                 case $host_os in
3969                   linux*)
3970                         AOT_SUPPORTED="yes"
3971                         BTLS_SUPPORTED=yes
3972                         BTLS_PLATFORM=x86_64
3973                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3974                         ;;
3975                   darwin*)
3976                         AOT_SUPPORTED="yes"
3977                         BTLS_SUPPORTED=yes
3978                         BTLS_PLATFORM=x86_64
3979                         boehm_supported=false
3980                         ;;
3981                   openbsd*|freebsd*|kfreebsd-gnu*)
3982                         AOT_SUPPORTED="yes"
3983                         BTLS_SUPPORTED=yes
3984                         BTLS_PLATFORM=x86_64
3985                         ;;
3986                   mingw*|cygwin*)
3987                         BTLS_SUPPORTED=no
3988                         BTLS_PLATFORM=x86_64
3989                         ;;
3990                 esac
3991                 ;;
3992         sparc*-*-*)
3993                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3994                    TARGET=SPARC64
3995                 else
3996                         TARGET=SPARC
3997                 fi
3998                 arch_target=sparc;
3999                 ACCESS_UNALIGNED="no"
4000                 case $host_os in
4001                   linux*) ;;
4002                   *)
4003                         LIBC="libc.so"
4004                         INTL="libintl.so"
4005                 esac
4006                 if test x"$GCC" = xyes; then
4007                         # We don't support v8 cpus
4008                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4009                 fi
4010                 if test x"$AR" = xfalse; then
4011                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4012                 fi
4013                 ;;
4014         *-mingw*|*-*-cygwin*)
4015                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4016                 have_visibility_hidden=no
4017                 INTL="intl"
4018                 ;;
4019         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4020         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4021         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4022                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4023                         TARGET=POWERPC64;
4024                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4025                         if ! (echo $CC | grep -q -- 'clang'); then
4026                                 CFLAGS="$CFLAGS -mminimal-toc"
4027                         fi
4028                 else
4029                         TARGET=POWERPC;
4030                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4031                 fi
4032                 arch_target=ppc;
4033                 case $host_os in
4034                   aix*|os400*)
4035                         BTLS_SUPPORTED=yes
4036                         BTLS_PLATFORM=powerpc
4037                         dnl on AIX/PASE, shared libraries can be inside archives
4038                         dnl if they are, we specify them by lib.a(lib.so)
4039                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4040                         LIBC="libc.a(shr_64.o)"
4041                         INTL="libintl.a(libintl.so.8)"
4042                         ;;
4043                   linux*)
4044                         BTLS_SUPPORTED=yes
4045                         BTLS_PLATFORM=powerpc
4046                         ;;
4047                 esac
4048                 ;;
4049         armv7k-*-darwin*)
4050                 TARGET=ARM;
4051                 TARGET_SYS=WATCHOS
4052                 arch_target=arm;
4053                 arm_fpu=VFP_HARD
4054                 ACCESS_UNALIGNED="no"
4055                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4056                 ;;
4058         arm*-darwin*)
4059                 TARGET=ARM;
4060                 arch_target=arm;
4061                 ACCESS_UNALIGNED="no"
4062                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4063                 ;;
4064         arm*-linux*)
4065                 TARGET=ARM;
4066                 arch_target=arm;
4067                 ACCESS_UNALIGNED="no"
4068                 AOT_SUPPORTED="yes"
4069                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4070                 BTLS_SUPPORTED=yes
4071                 BTLS_PLATFORM=arm
4072                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4073                 case "$target" in
4074                 arm*-linux*-gnueabi)
4075                         BTLS_PLATFORM=armsoft
4076                         ;;
4077                 esac
4078                 ;;
4079         arm*-netbsd*-eabi*)
4080                 TARGET=ARM;
4081                 arch_target=arm;
4082                 ACCESS_UNALIGNED="no"
4083                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4084                 ;;
4085         aarch64-*)
4086                 # https://lkml.org/lkml/2012/7/15/133
4087                 TARGET=ARM64
4088                 arch_target=arm64
4089                 boehm_supported=false
4090                 AOT_SUPPORTED="yes"
4091                 BTLS_SUPPORTED=yes
4092                 BTLS_PLATFORM=aarch64
4093                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4094                 ;;
4095         s390x-*-linux*)
4096                 TARGET=S390X;
4097                 arch_target=s390x;
4098                 ACCESS_UNALIGNED="yes"
4099                 BTLS_SUPPORTED=yes
4100                 BTLS_PLATFORM=s390x
4101                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4102                 ;;
4103         riscv32-*)
4104                 TARGET=RISCV32
4105                 ACCESS_UNALIGNED=no
4106                 AOT_SUPPORTED=no
4107                 BTLS_SUPPORTED=yes
4108                 BTLS_PLATFORM=riscv32
4109                 arch_target=riscv32
4110                 boehm_supported=false
4111                 ;;
4112         riscv64*)
4113                 TARGET=RISCV64
4114                 ACCESS_UNALIGNED=no
4115                 AOT_SUPPORTED=no
4116                 BTLS_SUPPORTED=yes
4117                 BTLS_PLATFORM=riscv64
4118                 arch_target=riscv64
4119                 boehm_supported=false
4120                 ;;
4121 esac
4123 HOST=$TARGET
4125 if test "x$host" != "x$target"; then
4126    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4127    enable_mcs_build=no
4128    enable_support_build=no
4129    BTLS_SUPPORTED=no
4130    # Can't use tls, since it depends on the runtime detection of tls offsets
4131    # in mono-compiler.h
4132    with_tls=pthread
4133    target_mach=no
4134    case "$target" in
4135    wasm32*)
4136                 TARGET=WASM
4137                 arch_target=wasm
4138                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4139                 ;;
4140    arm*-darwin*)
4141                 TARGET=ARM;
4142                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4143                 case "$target" in
4144                 armv7k-*)
4145                         arm_fpu=VFP_HARD
4146                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4147                         ;;
4148                 esac            
4149                 ;;
4150    powerpc64-ps3-linux-gnu)
4151                 TARGET=POWERPC64
4152                 arch_target=powerpc64
4153                 AC_DEFINE(TARGET_PS3, 1, [...])
4154                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4155                 # uses this define
4156                 AC_DEFINE(__mono_ppc64__, 1, [...])
4157                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4158                 sizeof_register=8
4159                 target_byte_order=G_BIG_ENDIAN
4160                 ;;
4161    powerpc64-xbox360-linux-gnu)
4162                 TARGET=POWERPC64
4163                 arch_target=powerpc64
4164                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4165                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4166                 # uses this define
4167                 sizeof_register=8
4168                 target_byte_order=G_BIG_ENDIAN
4169                 ;;
4170    arm*-linux-*)
4171                 TARGET=ARM;
4172                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4173                 ;;
4174    arm*-netbsd*-eabi*)
4175                 TARGET=ARM;
4176                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4177                 ;;
4178    i686*-linux-*)
4179                 TARGET=X86;
4180                 ;;
4181    i*86-apple-*)
4182                 TARGET=X86;
4183                 ;;
4184    x86_64*-linux-*)
4185                 TARGET=AMD64;
4186                 ;;
4187    x86_64-ps4-freebsd)
4188                 TARGET=AMD64;
4189                 AC_DEFINE(TARGET_PS4, 1, [...])
4190                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4191                 CPPFLAGS="$CPPFLAGS"
4192                 target_win32=no
4193                 ;;
4194    aarch64*-linux-*)
4195                 TARGET=ARM64;
4196                 ;;
4197         aarch64-*)
4198                 TARGET=ARM64
4199                 ;;
4200         riscv32*)
4201                 TARGET=RISCV32
4202                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4203                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4204                 arch_target=riscv32
4205                 target_mach=no
4206                 with_tls=pthread
4207                 ;;
4208         riscv64*)
4209                 TARGET=RISCV64
4210                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4211                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4212                 arch_target=riscv64
4213                 target_mach=no
4214                 with_tls=pthread
4215                 ;;
4216         *)
4217                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4218         esac
4220         case "$target" in
4221         *-darwin*)
4222                 target_mach=yes
4223                 ;;
4224         *-linux-android*)
4225                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4226                 ;;
4227         esac
4230 case "$TARGET" in
4231 WASM)
4232         AC_DEFINE(TARGET_WASM, 1, [...])
4233         arch_target=wasm
4234         target_sizeof_void_p=4
4235         ;;
4236 X86)
4237         AC_DEFINE(TARGET_X86, 1, [...])
4238         arch_target=x86
4239         target_sizeof_void_p=4
4240         ;;
4241 AMD64)
4242         AC_DEFINE(TARGET_AMD64, 1, [...])
4243         arch_target=amd64
4244         ;;
4245 ARM)
4246         AC_DEFINE(TARGET_ARM, 1, [...])
4247         arch_target=arm
4248         ACCESS_UNALIGNED="no"
4249         target_sizeof_void_p=4
4250         ;;
4251 ARM64)
4252         AC_DEFINE(TARGET_ARM64, 1, [...])
4253         arch_target=arm64
4254         ;;
4255 POWERPC)
4256         AC_DEFINE(TARGET_POWERPC, 1, [...])
4257         ;;
4258 POWERPC64)
4259         AC_DEFINE(TARGET_POWERPC, 1, [...])
4260         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4261         ;;
4262 S390X)
4263         AC_DEFINE(TARGET_S390X, 1, [...])
4264         ;;
4265 MIPS)
4266         AC_DEFINE(TARGET_MIPS, 1, [...])
4267         ;;
4268 SPARC)
4269         AC_DEFINE(TARGET_SPARC, 1, [...])
4270         ;;
4271 SPARC64)
4272         AC_DEFINE(TARGET_SPARC64, 1, [...])
4273         ;;
4274 RISCV32)
4275         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4276         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4277         ;;
4278 RISCV64)
4279         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4280         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4281         ;;
4282 esac
4284 case "$HOST" in
4285 WASM)
4286         AC_DEFINE(HOST_WASM, 1, [...])
4287         ;;
4288 X86)
4289         AC_DEFINE(HOST_X86, 1, [...])
4290         ;;
4291 AMD64)
4292         AC_DEFINE(HOST_AMD64, 1, [...])
4293         ;;
4294 ARM)
4295         AC_DEFINE(HOST_ARM, 1, [...])
4296         ;;
4297 ARM64)
4298         AC_DEFINE(HOST_ARM64, 1, [...])
4299         ;;
4300 POWERPC)
4301         AC_DEFINE(HOST_POWERPC, 1, [...])
4302         ;;
4303 POWERPC64)
4304         AC_DEFINE(HOST_POWERPC, 1, [...])
4305         AC_DEFINE(HOST_POWERPC64, 1, [...])
4306         ;;
4307 S390X)
4308         AC_DEFINE(HOST_S390X, 1, [...])
4309         ;;
4310 MIPS)
4311         AC_DEFINE(HOST_MIPS, 1, [...])
4312         ;;
4313 SPARC)
4314         AC_DEFINE(HOST_SPARC, 1, [...])
4315         ;;
4316 SPARC64)
4317         AC_DEFINE(HOST_SPARC64, 1, [...])
4318         ;;
4319 RISCV32)
4320         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4321         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4322         ;;
4323 RISCV64)
4324         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4325         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4326         ;;
4327 esac
4329 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4330 case "$HOST" in
4331 X86 | AMD64 | ARM | ARM64)
4332         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4333         ;;
4334 esac
4336 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4337 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4339 dnl *************
4340 dnl *** VTUNE ***
4341 dnl *************
4343 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4344 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4346 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4348 if test "x$enable_vtune" = "xyes"; then
4349         if test "x$with_vtune" = "x"; then
4350                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4351         else
4352                 VTUNE_PATH=$with_vtune
4353         fi
4354         VTUNE_INCLUDE=$VTUNE_PATH/include
4355         case "$TARGET" in
4356         X86)
4357                 VTUNE_LIB=$VTUNE_PATH/lib32
4358                 ;;
4359         AMD64)
4360                 VTUNE_LIB=$VTUNE_PATH/lib64
4361                 ;;
4362         *)
4363                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4364                 ;;
4365         esac
4366         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4367                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4368         fi
4369         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4370                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4371         fi
4373         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4374         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4376         AC_SUBST(VTUNE_LIBS)
4377         AC_SUBST(VTUNE_CFLAGS)
4379 dnl Use GCC atomic ops if they work on the target.
4380 if test x$GCC = "xyes"; then
4381         case $TARGET in
4382         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4383                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4384                 ;;
4385         esac
4388 if test "x$target_mach" = "xyes"; then
4390    if test "x$TARGET_SYS" = "xWATCHOS"; then
4391           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4392           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4393           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4394           BTLS_SUPPORTED=no
4395    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4396           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4397           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4398           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4399           BTLS_SUPPORTED=no
4400           target_ios=yes
4401    else
4402        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4403        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4404        #error fail this for ios
4405        #endif
4406        ], [
4407                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4408           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4409           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4410           target_osx=yes
4411        ], [
4412           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4413           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4414           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4415           BTLS_SUPPORTED=no
4416                   target_ios=yes
4417        ])
4418         fi
4419    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4422 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4424 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4426 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4427    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4428 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4429    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4430 else
4431    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4434 if test "x$target_sizeof_void_p" != "x"; then
4435    AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4436    # This is true for all the current cross-compiling targets
4437    AC_DEFINE(SIZEOF_REGISTER,TARGET_SIZEOF_VOID_P,[size of target machine integer registers])
4438 else
4439    AC_DEFINE(TARGET_SIZEOF_VOID_P,SIZEOF_VOID_P,[wordsize of target])
4440    if test "x$sizeof_register" = "x4"; then
4441       AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4442    elif test "x$sizeof_register" = "x8"; then
4443       AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4444    else
4445       AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of target machine integer registers])
4446    fi
4449 if test "x$have_visibility_hidden" = "xyes"; then
4450    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4453 if test "x$have_deprecated" = "xyes"; then
4454    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4457 dnl 
4458 dnl Simple Generational checks (sgen)
4460 SGEN_DEFINES=
4461 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4462 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4463 if test x$buildsgen = xyes; then
4464    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4465    SGEN_DEFINES="-DHAVE_SGEN_GC"
4467         conc_gc_msg=""
4468    if test x$with_sgen_default_concurrent != xno; then
4469        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4470            conc_gc_msg=" (concurrent by default)"
4471    fi
4473    if test "x$gc_msg" = "x"; then
4474       gc_msg="sgen$conc_gc_msg"
4475    else
4476       gc_msg="sgen$conc_gc_msg and $gc_msg"
4477    fi
4479 AC_SUBST(SGEN_DEFINES)
4480 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4482 jit_status="Building and using the JIT"
4484 libsuffix=".so"
4486 case "$host" in
4487      *-*-darwin*)
4488         libsuffix=".dylib"
4489         LIBC="libc.dylib"
4490         INTL="libintl.dylib"
4491         SQLITE="libsqlite.0.dylib"
4492         SQLITE3="libsqlite3.0.dylib"
4493         X11="libX11.dylib"
4494         GDKX11="libgdk-x11-2.0.dylib"
4495         GTKX11="libgtk-x11-2.0.dylib"
4496         ;;
4497      *-*-*netbsd*)
4498         LIBC="libc.so"
4499         INTL="libintl.so"
4500         SQLITE="libsqlite.so"
4501         SQLITE3="libsqlite3.so"
4502         ;;
4503      *-*-kfreebsd*-gnu)
4504         LIBC="libc.so.0.1"
4505         INTL="libc.so.0.1"
4506         X11="libX11.so.6"
4507         ;;
4508     *-*-*freebsd*)
4509         LIBC="libc.so.7"
4510         INTL="libintl.so"
4511         SQLITE="libsqlite.so"
4512         SQLITE3="libsqlite3.so"
4513         ;;
4514     *-*-*openbsd*)
4515         LIBC="libc.so"
4516         INTL="libintl.so"
4517         SQLITE="libsqlite.so"
4518         SQLITE3="libsqlite3.so"
4519         ;;
4520     *-*-*linux*)
4521         AC_PATH_X
4522         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4523         AC_MSG_CHECKING(for the soname of libX11.so)
4524         for i in $x_libraries $dlsearch_path; do
4525                 for r in 4 5 6; do
4526                         if test -f $i/libX11.so.$r; then
4527                                 X11=libX11.so.$r
4528                                 AC_MSG_RESULT($X11)
4529                         fi
4530                 done
4531         done
4532         
4533         if test "x$X11" = "xlibX11.so"; then
4534                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4535                 X11=libX11.so.6
4536         fi
4537         ;;
4538 esac
4540 AC_SUBST(libsuffix)
4542 ######################################
4543 # EGLIB CHECKS
4544 ######################################
4546 GNUC_PRETTY=
4547 GNUC_UNUSED=
4548 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4549 if test x$GCC = xyes; then
4550    GNUC_UNUSED='__attribute__((__unused__))'
4551    GNUC_NORETURN='__attribute__((__noreturn__))'
4552    case $host_cpu in
4553      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4554    esac
4556 AC_SUBST(GNUC_PRETTY)
4557 AC_SUBST(GNUC_UNUSED)
4558 AC_SUBST(GNUC_NORETURN)
4559 AC_SUBST(BREAKPOINT)
4561 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4563 case $host in
4564 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4565     PATHSEP='\\'
4566     SEARCHSEP=';'
4567     OS="WIN32"
4568     PIDTYPE='void *'
4569     ;;
4571     PATHSEP='/'
4572     SEARCHSEP=':'
4573     OS="UNIX"
4574     PIDTYPE='int'
4575     ;;
4576 esac
4578 case $host in
4579         *-*-solaris*)
4580         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4581         ;;
4582 esac
4584 case $target in
4585 arm*-darwin*|aarch64*-*|riscv*)
4586     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4587     ;;
4588 i*86-*-darwin*)
4589     ORDER=G_LITTLE_ENDIAN
4590     ;;
4591 *-*-haiku*)
4592     LDFLAGS="$LDFLAGS -ltextencoding"
4593     ;;
4594 *-*-openbsd*)
4595     CFLAGS="$CFLAGS -pthread"
4596     LDFLAGS="$LDFLAGS -pthread"
4597     ;;
4598 esac
4600 AC_SUBST(ORDER)
4601 AC_SUBST(CFLAGS)
4602 AC_SUBST(PATHSEP)
4603 AC_SUBST(SEARCHSEP)
4604 AC_SUBST(OS)
4605 AC_SUBST(PIDTYPE)
4607 # Defined for all targets/platforms using classic Windows API support.
4608 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4609 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4611 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4612 AC_CHECK_FUNCS(getrlimit)
4613 AC_CHECK_FUNCS(fork execv execve)
4615 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4617 if test x$with_overridable_allocators = xyes; then
4618         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4619   AC_MSG_NOTICE([Overridable allocator support enabled])
4620 else
4621   AC_MSG_NOTICE([Overridable allocator support disabled])
4625 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4626 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4627 # removed once support for 10.6 is dropped.
4629 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4631 if test x$target_osx = xyes; then
4632 AC_CHECK_FUNCS(getpwuid_r)
4633 elif test x$target_ios = xno; then
4634 AC_CHECK_FUNCS(strndup getpwuid_r)
4637 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4639 AC_SEARCH_LIBS(sqrtf, m)
4641 # nanosleep may not be part of libc, also search it in other libraries
4642 AC_SEARCH_LIBS(nanosleep, rt)
4644 AC_SEARCH_LIBS(dlopen, dl)
4645 old_ldflags="${LDFLAGS}"
4646 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4647 if test $lt_cv_prog_gnu_ld = yes; then
4648         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4649 else
4650         case $host in
4651         *-*-aix*|*-*-os400*)
4652                 ;;
4653         *)
4654                 dnl Try to use export-dynamic anyways
4655                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4656                 ;;
4657         esac
4659 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4660 if test $found_export_dynamic = no; then
4661         LDFLAGS="${old_ldflags}"
4664 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4665 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4666 AC_CHECK_LIB(iconv, iconv_open)
4667 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4668 AC_SUBST(HAVE_ALLOCA_H)
4670 # Get the exact type of size_t, not just its size.
4671 # This is so we can find an exact printf format among u, lu, llu, I64u.
4672 # To avoid warnings about slight mismatches.
4673 # C99 runtime "zu" dependency is being avoided here.
4675 # We have to compile as C++ because C is too lenient
4676 # and lets the wrong thing compile, with warnings.
4678 # Note: "zu" or ifdef <something> have the advantage
4679 # of producing installable "biarch" headers. i.e. one Mac header
4680 # for Mac/x86 and Mac/amd64.
4682 AC_LANG_PUSH(C++)
4684 # Check long before int because it is the overwhelming Unix answer,
4685 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4687 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4689 AC_MSG_CHECKING(if size_t is unsigned long)
4690 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4691         #include <stddef.h>
4692         unsigned long *a = (size_t*)0;
4693 ])], [
4694         AC_MSG_RESULT(yes)
4695         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4696 ], [
4697         AC_MSG_RESULT(no)
4698         AC_MSG_CHECKING(if size_t is unsigned int)
4699         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4700                 #include <stddef.h>
4701                 unsigned *a = (size_t*)0;
4702         ])], [
4703                 AC_MSG_RESULT(yes)
4704                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4705         ], [
4706 # At this point the majority of systems have their answer,
4707 # and we descend into non-standard or new-standard territory.
4709 # Check __int64 first because I64 on some systems predates ll, enabling
4710 # new compiler/old runtime interop, and the types always have the same size.
4711                 AC_MSG_RESULT(no)
4712                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4713                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4714                         #include <stddef.h>
4715                         unsigned __int64 *a = (size_t*)0;
4716                 ])], [
4717                         AC_MSG_RESULT(yes)
4718                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4719                 ], [
4720                         AC_MSG_RESULT(no)
4721                         AC_MSG_CHECKING(if size_t is unsigned long long)
4722                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4723                                 #include <stddef.h>
4724                                 unsigned long long *a = (size_t*)0;
4725                         ])], [
4726                                 AC_MSG_RESULT(yes)
4727                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4728                         ], [
4729                                 AC_MSG_RESULT(no)
4730                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4731                         ] )
4732                 ] )
4733         ] )
4734 ] )
4736 AC_LANG_POP
4738 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4739 # This provides for an exact match with functions that
4740 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4741 # uintptr_t is not necessarily the same.
4743 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4744 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4746 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4747    GSIZE="size_t"
4748    GSSIZE="ptrdiff_t"
4749 else
4750    GSIZE="uintptr_t"
4751    GSSIZE="intptr_t"
4754 AC_SUBST(GSIZE)
4755 AC_SUBST(GSSIZE)
4756 AC_SUBST(GSIZE_FORMAT)
4759 # END OF EGLIB CHECKS
4762 AC_ARG_WITH([libgdiplus],
4763         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4764         [], [with_libgdiplus=installed])
4766 # default install location
4767 libgdiplus_install_loc=libgdiplus${libsuffix}
4768 case "$host" in
4769     *-*-*linux*)
4770     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4771     ;;
4772 esac
4774 case $with_libgdiplus in
4775     no)
4776     libgdiplus_loc=
4777     ;;
4779     installed)
4780     libgdiplus_loc=
4781     if test x$cross_compiling = xno; then
4782         if test x$host_darwin = xyes; then
4783             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4784             if test -x $a; then
4785               libgdiplus_install_loc=$a
4786               libgdiplus_loc=$a
4787             fi
4788         fi
4789     fi
4790     ;;
4792     yes|sibling)
4793     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4794     ;;
4796     /*) # absolute path, assume it is an install location
4797     libgdiplus_loc=$with_libgdiplus
4798     libgdiplus_install_loc=$with_libgdiplus
4799     ;;
4801     *)
4802     libgdiplus_loc=`pwd`/$with_libgdiplus
4803     ;;
4804 esac
4805 AC_SUBST(libgdiplus_loc)
4806 AC_SUBST(libgdiplus_install_loc)
4808 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)
4809 if test "x$icall_symbol_map" = "xyes"; then
4810    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4813 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4814 if test "x$icall_export" = "xyes"; then
4815    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4818 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4819 if test "x$icall_tables" = "xno"; then
4820    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4823 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4825 if test "x$with_tls" = "x__thread"; then
4826         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4827         # Pass the information to libgc
4828         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4829         AC_MSG_CHECKING(if the tls_model attribute is supported)
4830         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4831                 ], [
4832                         AC_MSG_RESULT(yes)
4833                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4834                 ], [
4835                         AC_MSG_RESULT(no)
4836         ])
4839 if test ${TARGET} = ARM; then
4840         dnl ******************************************
4841         dnl *** Check to see what FPU is available ***
4842         dnl ******************************************
4843         AC_MSG_CHECKING(which FPU to use)
4845         #
4846         # This is a bit tricky:
4847         #
4848         # if (__ARM_PCS_VFP) {
4849         #       /* mfloat-abi=hard == VFP with hard ABI */
4850         # } elif (!__SOFTFP__) {
4851         #       /* mfloat-abi=softfp == VFP with soft ABI */
4852         # } else {
4853         #       /* mfloat-abi=soft == no VFP */
4854         # }
4855         #
4856         # The exception is iOS (w/ GCC) where none of the above
4857         # are defined (but iOS always uses the 'softfp' ABI).
4858         #
4859         # No support for FPA.
4860         #
4862         fpu=NONE
4864         # iOS GCC always uses the 'softfp' ABI.
4865         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4866                 fpu=VFP
4867         fi
4869         # Are we using the 'hard' ABI?
4870         if test x$fpu = xNONE; then
4871                 AC_TRY_COMPILE([], [
4872                         #ifndef __ARM_PCS_VFP
4873                         #error "Float ABI is not 'hard'"
4874                         #endif
4875                 ], [
4876                         fpu=VFP_HARD
4877                 ], [
4878                         fpu=NONE
4879                 ])
4880         fi
4882         # No 'hard' ABI. 'soft' or 'softfp'?
4883         if test x$fpu = xNONE; then
4884                 AC_TRY_COMPILE([], [
4885                         #ifdef __SOFTFP__
4886                         #error "Float ABI is not 'softfp'"
4887                         #endif
4888                 ], [
4889                         fpu=VFP
4890                 ], [
4891                         fpu=NONE
4892                 ])
4893         fi
4895         if test x$arm_fpu != x; then
4896            fpu=$arm_fpu
4897         fi
4899         AC_MSG_RESULT($fpu)
4900         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4901         unset fpu
4903         dnl *********************************************
4904         dnl *** Check which ARM version(s) we can use ***
4905         dnl *********************************************
4906         AC_MSG_CHECKING(which ARM version to use)
4908         AC_TRY_COMPILE([], [
4909                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4910                 #error Not on ARM v5.
4911                 #endif
4912         ], [
4913                 arm_v5=yes
4915                 arm_ver=ARMv5
4916         ], [])
4918         AC_TRY_COMPILE([], [
4919                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4920                 #error Not on ARM v6.
4921                 #endif
4922         ], [
4923                 arm_v5=yes
4924                 arm_v6=yes
4926                 arm_ver=ARMv6
4927         ], [])
4929         AC_TRY_COMPILE([], [
4930                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4931                 #error Not on ARM v7.
4932                 #endif
4933         ], [
4934                 arm_v5=yes
4935                 arm_v6=yes
4936                 arm_v7=yes
4938                 arm_ver=ARMv7
4939         ], [])
4941         AC_MSG_RESULT($arm_ver)
4943         if test x$arm_v5 = xyes; then
4944                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4945                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4946         fi
4948         if test x$arm_v6 = xyes; then
4949                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4950                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4951         fi
4953         if test x$arm_v7 = xyes; then
4954                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4955                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4956         fi
4959 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
4960         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
4962         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
4964         if test x$fpabi = xauto; then
4965                 AC_TRY_COMPILE([], [
4966                         #ifdef __riscv_float_abi_double
4967                         #error "double"
4968                         #endif
4969                 ], [
4970                 ], [
4971                         fpabi=double
4972                 ])
4973         fi
4975         if test x$fpabi = xauto; then
4976                 AC_TRY_COMPILE([], [
4977                         #ifdef __riscv_float_abi_single
4978                         #error "single"
4979                         #endif
4980                 ], [
4981                 ], [
4982                         fpabi=single
4983                 ])
4984         fi
4986         if test x$fpabi = xauto; then
4987                 AC_TRY_COMPILE([], [
4988                         #ifdef __riscv_float_abi_soft
4989                         #error "soft"
4990                         #endif
4991                 ], [
4992                 ], [
4993                         fpabi=soft
4994                 ])
4995         fi
4997         case $fpabi in
4998         double)
4999                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5000                 AC_MSG_RESULT([double-precision])
5001                 ;;
5002         single)
5003                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5004                 AC_MSG_ERROR([single-precision, not supported])
5005                 ;;
5006         soft)
5007                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5008                 AC_MSG_RESULT([soft float])
5009                 ;;
5010         auto)
5011                 AC_MSG_ERROR([unknown])
5012                 ;;
5013         *)
5014                 AC_MSG_ERROR([invalid option: $fpabi])
5015                 ;;
5016         esac
5019 if test ${TARGET} = unknown; then
5020         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5021         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5024 if test "x$platform_android" = "xyes"; then
5025         case "x${TARGET}" in
5026         xARM)
5027                 case "x$arm_ver" in
5028                 xARMv5)
5029                         BTLS_SUPPORTED=yes
5030                         BTLS_PLATFORM=android-armv5
5031                         ;;
5032                 xARMv6)
5033                         BTLS_SUPPORTED=yes
5034                         BTLS_PLATFORM=android-armv6
5035                         ;;
5036                 xARMv7)
5037                         BTLS_SUPPORTED=yes
5038                         BTLS_PLATFORM=android-armv7
5039                         ;;
5040                 *)
5041                         BTLS_SUPPORTED=no
5042                         ;;
5043                 esac
5044                 ;;
5045         xARM64)
5046                 BTLS_SUPPORTED=yes
5047                 BTLS_PLATFORM=android-v8a
5048                 ;;
5049         xX86)
5050                 BTLS_SUPPORTED=yes
5051                 BTLS_PLATFORM=android-x86
5052                 ;;
5053         xAMD64)
5054                 BTLS_SUPPORTED=yes
5055                 BTLS_PLATFORM=android-x64
5056                 ;;
5057         *)
5058                 BTLS_SUPPORTED=no
5059                 ;;
5060         esac
5063 if test ${ACCESS_UNALIGNED} = no; then
5064         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5067 if test x$host_darwin = xyes; then
5068         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5069         AS_IF(
5070                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5071                 [AC_MSG_RESULT([no])],
5072                 [
5073                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5074                         AR_FLAGS="Scru"
5075                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5076                         AC_MSG_RESULT([yes])
5077                 ]
5078         )
5081 case "x$libgc" in
5082         xincluded)
5083                 # Pass CPPFLAGS to libgc configure
5084                 # We should use a separate variable for this to avoid passing useless and
5085                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5086                 # This should be executed late so we pick up the final version of CPPFLAGS
5087                 # The problem with this approach, is that during a reconfigure, the main
5088                 # configure scripts gets invoked with these arguments, so we use separate
5089                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5090                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5091                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5092                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5093                 fi
5094                 # Don't pass -finstrument-for-thread-suspension in, 
5095                 # if these are instrumented it will be very bad news 
5096                 # (infinite recursion, undefined parking behavior, etc)
5097                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5098                 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\""
5099                 if test "x$support_boehm" = "xyes"; then
5100                         AC_CONFIG_SUBDIRS(libgc)
5101                 fi
5102                 ;;
5103 esac
5105 MALLOC_MEMPOOLS=no
5106 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5107         if test x$with_malloc_mempools = xyes; then
5108                 MALLOC_MEMPOOLS=yes
5109                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5110         fi
5114 DISABLE_MCS_DOCS=default
5115 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5116         if test x$with_mcs_docs != xyes; then
5117                 DISABLE_MCS_DOCS=yes
5118         fi
5120 if test -n "$INSTALL_4_x_TRUE"; then :
5121         DISABLE_MCS_DOCS=yes
5123 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5124    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5127 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)],[
5128         if test x$with_lazy_gc_thread_creation != xno ; then
5129                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5130         fi
5131 ], [with_lazy_gc_thread_creation=no])
5133 dnl *****************************
5134 dnl *** Thread suspend policy ***
5135 dnl *****************************
5137 dnl Set a default hybrid or cooperative suspend on some platforms
5139 dnl Coop default is set by the bitcode preset.
5141 dnl If coop isn't on by default, maybe hybrid should be?
5142 if test x$enable_cooperative_suspend_default != xyes; then
5143         case $HOST in
5144         X86 | AMD64)
5145                 dnl Some host/target confusion, there's no host_osx (and
5146                 dnl host_darwin would be true on iOS not just macOS).
5147                 if test x$target_osx = xyes; then
5148                         enable_hybrid_suspend_default=yes
5149                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5150                         enable_hybrid_suspend_default=yes
5151                 fi
5152                 ;;
5153         esac
5156 dnl Now check if there were flags overriding the defaults
5158 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])
5159 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5161 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5162         enable_cooperative_suspend=$with_cooperative_gc
5165 if test x$enable_cooperative_suspend = xdefault; then
5166         enable_cooperative_suspend=$enable_cooperative_suspend_default
5169 if test x$enable_cooperative_suspend != xno; then
5170         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5173 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5175 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])
5177 if test x$enable_hybrid_suspend = xdefault; then
5178    enable_hybrid_suspend=$enable_hybrid_suspend_default
5181 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5182         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5185 if test x$enable_hybrid_suspend != xno ; then
5186         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5189 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5191 dnl End of thread suspend policy
5193 dnl ***************************
5194 dnl *** feature experiments ***
5195 dnl ***************************
5197 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5198 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5200         if test x$enable_experiment != x ; then
5201                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5202         fi
5203         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5204                 eval "mono_experiment_test_enable_$feature='yes'"
5205         done
5207         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5208                 eval "mono_experiment_test_enable_null='yes'"
5209                 true
5210         fi
5212         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5213                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5214         fi
5215 ],[])
5217 dnl **********************
5218 dnl *** checked builds ***
5219 dnl **********************
5221 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],[
5223         if test x$enable_checked_build != x ; then
5224                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5225         fi
5226         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5227                 eval "mono_checked_build_test_enable_$feature='yes'"
5228         done
5230         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5231                 eval "mono_checked_build_test_enable_gc='yes'"
5232                 eval "mono_checked_build_test_enable_metadata='yes'"
5233                 eval "mono_checked_build_test_enable_thread='yes'"
5234                 eval "mono_checked_build_test_enable_private_types='yes'"
5235         fi
5237         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5238                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5239         fi
5241         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5242                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5243         fi
5245         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5246                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5247         fi
5249         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5250                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5251         fi
5252 ], [])
5254 dnl End of checked builds
5256 AC_CHECK_HEADER([malloc.h], 
5257                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5258                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5260 if test x"$GCC" = xyes; then
5261         # Implicit function declarations are not 64 bit safe
5262         # Do this late, since this causes lots of configure tests to fail
5263         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5264         # jay has a lot of implicit declarations
5265         JAY_CFLAGS="-Wno-implicit-function-declaration"
5268 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5269 # instead of libmono-static.a
5270 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5271    LIBMONO_LA=libmini-static.la
5272 else
5273    if test x$buildsgen = xyes; then
5274       LIBMONO_LA=libmonosgen-$API_VER.la
5275    else
5276       LIBMONO_LA=libmonoboehm-$API_VER.la
5277    fi
5279 AC_SUBST(LIBMONO_LA)
5281 dnl **************
5282 dnl ***  Btls  ***
5283 dnl **************
5285 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5286 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5287 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5289 if test "x$enable_btls" = "xno"; then
5290    enable_btls_lib=no
5293 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5295 btls_android=no
5296 if test "x$enable_btls" = "xyes"; then
5297         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5298         if test "x$CMAKE" = "xno"; then
5299                 AC_MSG_ERROR("cmake not found")
5300         fi
5302         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5303         AC_SUBST(BTLS_ROOT)
5305         btls_arch=
5306         btls_cflags=
5307         BTLS_CMAKE_ARGS=
5309         if test "x$host_win32" = "xyes"; then
5310                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5311         fi
5313         case "$BTLS_PLATFORM" in
5314         i386)
5315                 btls_arch=i386
5316                 btls_cflags="-m32"
5317                 case $host_os in
5318                         darwin*)
5319                                 btls_cflags="$btls_cflags -arch i386"
5320                                 ;;
5321                         mingw*|cygwin*)
5322                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5323                                 if test "x$HAVE_YASM" != "xyes"; then
5324                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5325                                 fi
5326                                 ;;
5327                 esac
5328                 ;;
5329         x86_64)
5330                 btls_arch=x86_64
5331                 case $host_os in
5332                         mingw*|cygwin*)
5333                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5334                                 if test "x$HAVE_YASM" != "xyes"; then
5335                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5336                                 fi
5337                                 ;;
5338                 esac
5339                 ;;
5340         arm)
5341                 btls_arch=arm
5342                 btls_cflags="-DOPENSSL_NO_ASM=1"
5343                 ;;
5344         armsoft)
5345                 btls_arch=arm
5346                 btls_cflags="-DOPENSSL_NO_ASM=1"
5347                 ;;
5348         aarch64)
5349                 btls_arch=aarch64
5350                 btls_cflags="-march=armv8-a+crypto"
5351                 ;;
5352         s390x)
5353                 btls_arch=s390x
5354                 ;;
5355         powerpc)
5356                 btls_arch=powerpc
5357                 case $host_os in
5358                         aix*|os400*)
5359                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5360                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5361                 esac
5362                 ;;
5363         android-armv5)
5364                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5365                 ;;
5366         android-armv6)
5367                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5368                 ;;
5369         android-armv7)
5370                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5371                 ;;
5372         android-v8a)
5373                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5374                 ;;
5375         android-x86)
5376                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5377                 ;;
5378         android-x64)
5379                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5380                 ;;
5381         riscv32)
5382                 btls_arch=riscv32
5383                 ;;
5384         riscv64)
5385                 btls_arch=riscv64
5386                 ;;
5387         *)
5388                 AC_MSG_ERROR(Invalid BTLS platform)
5389         esac
5391         if test "x$platform_android" = "xyes"; then
5392                 btls_android=yes
5393                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5394                 if test "x$with_btls_android_ndk" != "x"; then
5395                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5396                 else
5397                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5398                 fi
5399         fi
5401         if test "x$btls_arch" != "x"; then
5402                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5403         fi
5405         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5406         AC_SUBST(BTLS_ARCH)
5407         AC_SUBST(BTLS_CFLAGS)
5408         AC_SUBST(BTLS_PLATFORM)
5409         AC_SUBST(BTLS_CMAKE_ARGS)
5411         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5412 else
5413         enable_btls=no
5416 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5418 if test x$DISABLE_MCS_DOCS = xyes; then
5419    docs_dir=""
5420 else
5421    docs_dir=docs
5423 AC_SUBST(docs_dir)
5425 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5426 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5427 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5429 libmono_ldflags="$libmono_ldflags $LIBS"
5431 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5432 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5433 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5434 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5435 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5436 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5437 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5438 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5439 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5440 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5441 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5442 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5443 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5444 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5445 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5446 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5447 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5448 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5449 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5450 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5451 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5452 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5453 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5454 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5456 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5458 AC_SUBST(LIBC)
5459 AC_SUBST(INTL)
5460 AC_SUBST(SQLITE)
5461 AC_SUBST(SQLITE3)
5462 AC_SUBST(X11)
5463 AC_SUBST(GDKX11)
5464 AC_SUBST(GTKX11)
5465 AC_SUBST(XINERAMA)
5466 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5467 AC_SUBST(arch_target)
5468 AC_SUBST(CFLAGS)
5469 AC_SUBST(CPPFLAGS)
5470 AC_SUBST(LDFLAGS)
5472 #This must always be defined when building the runtime
5473 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5475 mono_build_root=`pwd`
5476 AC_SUBST(mono_build_root)
5478 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5479 if test x$host_win32 = xno; then
5480         if test x$enable_msvc = xyes; then
5481                 echo "Error, --enable-msvc only supported for Windows builds."
5482                 exit 1
5483         fi
5485 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5487 if test "x$enable_msvc" = "xyes"; then
5488         if test "x$support_boehm" = "xyes"; then
5489                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5490                 exit 1
5491         fi
5492         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5493         if test "x$host_cpu" = "xi686"; then
5494                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5495                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5496                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5497         else
5498                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5499                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5500                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5501         fi
5502         AC_SUBST(mono_msvc_build_dir)
5503         AC_SUBST(mono_msvc_build_lib_dir)
5504         AC_SUBST(mono_msvc_build_bin_dir)
5505 else
5506         mono_runtime=mono/mini/mono
5509 AC_SUBST(mono_runtime)
5511 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5513 if test $csc_compiler = mcs; then
5514   CSC=$mcs_topdir/class/lib/build/mcs.exe
5515 else
5516   CSC=$CSC_LOCATION
5519 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5521 mono_cfg_root=$mono_build_root/runtime
5522 if test x$host_win32 = xyes; then
5523   if test "x$cross_compiling" = "xno"; then
5524     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5525     CSC=`cygpath -m -a $CSC`
5526     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5527   else
5528     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5529   fi
5530 else
5531   mono_cfg_dir=$mono_cfg_root/etc
5533 AC_SUBST(mono_cfg_dir)
5535 AC_SUBST(CSC)
5537 AC_CONFIG_FILES([po/mcs/Makefile.in])
5539 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5540 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5542 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5543 [   depth=../../../..
5544     case $srcdir in
5545     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5546     .) reldir=$depth ;;
5547     *) reldir=$depth/$srcdir ;;
5548     esac
5549     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5550     cd runtime/etc/mono/1.0
5551     rm -f machine.config
5552     $LN_S $reldir/data/net_1_1/machine.config machine.config
5553     cd $depth
5554 ],[LN_S='$LN_S'])
5556 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5557 [   depth=../../../..
5558     case $srcdir in
5559     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5560     .) reldir=$depth ;;
5561     *) reldir=$depth/$srcdir ;;
5562     esac
5563     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5564     cd runtime/etc/mono/2.0
5565     rm -f machine.config
5566     $LN_S $reldir/data/net_2_0/machine.config machine.config
5567     cd $depth
5568 ],[LN_S='$LN_S'])
5570 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5571 [   depth=../../../..
5572     case $srcdir in
5573     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5574     .) reldir=$depth ;;
5575     *) reldir=$depth/$srcdir ;;
5576     esac
5577     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5578     cd runtime/etc/mono/2.0
5579     rm -f web.config
5580     $LN_S $reldir/data/net_2_0/web.config web.config
5581     cd $depth
5582 ],[LN_S='$LN_S'])
5584 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5585 [   depth=../../..
5586     case $srcdir in
5587     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5588     .) reldir=$depth ;;
5589     *) reldir=$depth/$srcdir ;;
5590     esac
5591     $ac_aux_dir/install-sh -d runtime/etc/mono/
5592     cd runtime/etc/mono/
5593     rm -f browscap.ini
5594     $LN_S $reldir/data/browscap.ini browscap.ini
5595     cd $depth
5596 ],[LN_S='$LN_S'])
5598 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5599 [   depth=../../../../..
5600     case $srcdir in
5601     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5602     .) reldir=$depth ;;
5603     *) reldir=$depth/$srcdir ;;
5604     esac
5605     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5606     cd runtime/etc/mono/2.0/Browsers
5607     rm -f Compat.browser
5608     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5609     cd $depth
5610 ],[LN_S='$LN_S'])
5612 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5613 [   depth=../../../../..
5614     case $srcdir in
5615     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5616     .) reldir=$depth ;;
5617     *) reldir=$depth/$srcdir ;;
5618     esac
5619     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5620     cd runtime/etc/mono/4.0/Browsers
5621     rm -f Compat.browser
5622     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5623     cd $depth
5624 ],[LN_S='$LN_S'])
5626 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5627 [   depth=../../../../..
5628     case $srcdir in
5629     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5630     .) reldir=$depth ;;
5631     *) reldir=$depth/$srcdir ;;
5632     esac
5633     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5634     cd runtime/etc/mono/4.5/Browsers
5635     rm -f Compat.browser
5636     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5637     cd $depth
5638 ],[LN_S='$LN_S'])
5640 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5641 [   depth=../../../..
5642     case $srcdir in
5643     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5644     .) reldir=$depth ;;
5645     *) reldir=$depth/$srcdir ;;
5646     esac
5647     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5648     cd runtime/etc/mono/4.0
5649     rm -f machine.config
5650     $LN_S $reldir/data/net_4_0/machine.config machine.config
5651     cd $depth
5652 ],[LN_S='$LN_S'])
5654 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5655 [   depth=../../../..
5656     case $srcdir in
5657     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5658     .) reldir=$depth ;;
5659     *) reldir=$depth/$srcdir ;;
5660     esac
5661     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5662     cd runtime/etc/mono/4.0
5663     rm -f web.config
5664     $LN_S $reldir/data/net_4_0/web.config web.config
5665     cd $depth
5666 ],[LN_S='$LN_S'])
5668 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5669 [   depth=../../../..
5670     case $srcdir in
5671     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5672     .) reldir=$depth ;;
5673     *) reldir=$depth/$srcdir ;;
5674     esac
5675     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5676     cd runtime/etc/mono/4.5
5677     rm -f machine.config
5678     $LN_S $reldir/data/net_4_5/machine.config machine.config
5679     cd $depth
5680 ],[LN_S='$LN_S'])
5682 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5683 [   depth=../../../..
5684     case $srcdir in
5685     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5686     .) reldir=$depth ;;
5687     *) reldir=$depth/$srcdir ;;
5688     esac
5689     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5690     cd runtime/etc/mono/4.5
5691     rm -f web.config
5692     $LN_S $reldir/data/net_4_5/web.config web.config
5693     cd $depth
5694 ],[LN_S='$LN_S'])
5696 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])
5697 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])
5698 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5700 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5701 if test x"$GCC" = xyes; then
5703         # incompatible-pointer-types requires gcc circa 5.x
5705         ORIG_CFLAGS=$CFLAGS
5706         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5707         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5708         AC_TRY_COMPILE([],[
5709         ], [
5710                 AC_MSG_RESULT(yes)
5711                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5712         ], [
5713                 AC_MSG_RESULT(no)
5714                 CFLAGS=$ORIG_CFLAGS
5715         ])
5719 # Mono.Native Support
5720 # -------------------
5721 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5722 # It is built as a stand-alone shared library and not bundled with the runtime because we
5723 # may need to build two different versions of it.
5725 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5726 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5728 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5729 # implementation accordingly.  We build a single `libmono_native` shared library.
5731 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5733 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5734 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5735 # depending on platform.
5737 # We build two versions of the shared library:
5738 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5739 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5741 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5742 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5743 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5745 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5746 # to verify that it's the correct version of it.
5749 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5750 if test x$target_osx = xyes; then
5751         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5752         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5753         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5754         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5755         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5756         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5757         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5758         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5759         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5761         mono_native=yes
5762         MONO_NATIVE_PLATFORM=macos
5763         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5764         AC_MSG_CHECKING([Mono.Native support])
5765         AC_MSG_RESULT(macos)
5767         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5768                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5770         if test x$mono_native_compat = xyes; then
5771                 mono_native_compat=yes
5772                 mono_native_text="Mac OSX (compat+unified)"
5773                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5774                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5775                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5776                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5777         else
5778                 mono_native_compat=no
5779                 mono_native_text="Mac OSX"
5780         fi
5781 elif test x$mono_native_platform_ios = xyes; then
5782         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5784         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5785                 if test x$mono_native_ios_sim = xyes; then
5786                         mono_native_ios_target=ios-simulator
5787                         mono_native_text="iOS Simulator"
5788                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5789                 else
5790                         mono_native_ios_target=iphoneos
5791                         mono_native_text="iOS Device"
5792                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5793                 fi
5794                 mono_native_unified_version="10.0"
5795                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5796         ], [
5797                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5798                         if test x$mono_native_ios_sim = xyes; then
5799                                 mono_native_ios_target=tvos-simulator
5800                                 mono_native_text="AppleTV Simulator"
5801                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5802                         else
5803                                 mono_native_ios_target=tvos
5804                                 mono_native_text="AppleTV Device"
5805                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5806                         fi
5807                         mono_native_unified_version="10.0"
5808                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5809                 ], [
5810                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5811                                 if test x$mono_native_ios_sim = xyes; then
5812                                         mono_native_ios_target=watchos-simulator
5813                                         mono_native_text="Apple Watch Simulator"
5814                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5815                                 else
5816                                         mono_native_ios_target=watchos
5817                                         mono_native_text="Apple Watch Device"
5818                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5819                                 fi
5820                                 mono_native_unified_version="5.0"
5821                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5822                         ], [
5823                                 AC_MSG_ERROR([Unknown iOS Target])
5824                         ])
5825                 ])
5826         ])
5828         AC_MSG_CHECKING([Mono.Native support])
5829         AC_MSG_RESULT([$mono_native_ios_target])
5831         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5833         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5834         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5836         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5838         if test x$with_bitcode = xyes; then
5839                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5840                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5841         else
5842                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
5843         fi
5845         if test x$enable_gss = xyes; then
5846                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
5847         fi
5849         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5850         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5851         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5852         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5853         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5854         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5856         if test x$mono_native_compat = xyes; then
5857                 mono_native_text="$mono_native_text (compat+unified)"
5858                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5859                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5860                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5861                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5862         fi
5864         mono_native=yes
5865         MONO_NATIVE_PLATFORM=ios
5866 elif test x$host_linux = xyes; then
5867         mono_native_text="Linux"
5868         MONO_NATIVE_CC=$CC
5869         MONO_NATIVE_CXX=$CXX
5870         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5871         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5872         MONO_NATIVE_CFLAGS=$CFLAGS
5873         MONO_NATIVE_LDFLAGS=$LDFLAGS
5875         mono_native=yes
5876         mono_native_compat=no
5877         MONO_NATIVE_PLATFORM=linux
5878         AC_MSG_CHECKING([Mono.Native support])
5879         AC_MSG_RESULT(linux)
5881         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5882 else
5883         mono_native=no
5884         mono_native_text="no"
5885         AC_MSG_CHECKING([Mono.Native support])
5886         AC_MSG_RESULT(no)
5889 if test x$mono_native_compat = xyes; then
5890         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5891 else
5892         MONO_NATIVE_LIBRARY_NAME=libmono-native
5895 AC_SUBST(MONO_NATIVE_PLATFORM)
5896 AC_SUBST(MONO_NATIVE_CC)
5897 AC_SUBST(MONO_NATIVE_CXX)
5898 AC_SUBST(MONO_NATIVE_CPPFLAGS)
5899 AC_SUBST(MONO_NATIVE_CXXFLAGS)
5900 AC_SUBST(MONO_NATIVE_CFLAGS)
5901 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
5902 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
5903 AC_SUBST(MONO_NATIVE_LDFLAGS)
5904 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
5905 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
5906 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
5907 AC_SUBST(MONO_NATIVE_LIBADD)
5909 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
5910 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
5911 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
5912 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
5913 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
5915 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
5916 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
5917 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
5918 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
5919 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
5921 # Update all submodules recursively to ensure everything is checked out
5922 (cd $srcdir && scripts/update_submodules.sh)
5924 AC_OUTPUT([
5925 Makefile
5926 mono-uninstalled.pc
5927 acceptance-tests/Makefile
5928 llvm/Makefile
5929 scripts/mono-find-provides
5930 scripts/mono-find-requires
5931 mk/Makefile
5932 mono/Makefile
5933 mono/btls/Makefile
5934 mono/native/Makefile
5935 mono/utils/Makefile
5936 mono/utils/jemalloc/Makefile
5937 mono/metadata/Makefile
5938 mono/dis/Makefile
5939 mono/cil/Makefile
5940 mono/arch/Makefile
5941 mono/arch/x86/Makefile
5942 mono/arch/amd64/Makefile
5943 mono/arch/ppc/Makefile
5944 mono/arch/sparc/Makefile
5945 mono/arch/s390x/Makefile
5946 mono/arch/arm/Makefile
5947 mono/arch/arm64/Makefile
5948 mono/arch/mips/Makefile
5949 mono/arch/riscv/Makefile
5950 mono/sgen/Makefile
5951 mono/native/platform-type.c
5952 mono/native/platform-type-compat.c
5953 mono/native/platform-type-unified.c
5954 mono/tests/Makefile
5955 mono/tests/assembly-load-reference/Makefile
5956 mono/tests/tests-config
5957 mono/tests/gc-descriptors/Makefile
5958 mono/tests/testing_gac/Makefile
5959 mono/unit-tests/Makefile
5960 mono/benchmark/Makefile
5961 mono/mini/Makefile
5962 mono/profiler/Makefile
5963 mono/eglib/Makefile
5964 mono/eglib/eglib-config.h
5965 mono/eglib/test/Makefile
5966 m4/Makefile
5967 ikvm-native/Makefile
5968 scripts/Makefile
5969 man/Makefile
5970 docs/Makefile
5971 data/Makefile
5972 data/net_2_0/Makefile
5973 data/net_4_0/Makefile
5974 data/net_4_5/Makefile
5975 data/net_2_0/Browsers/Makefile
5976 data/net_4_0/Browsers/Makefile
5977 data/net_4_5/Browsers/Makefile
5978 data/mint.pc
5979 data/mono-2.pc
5980 data/monosgen-2.pc
5981 data/mono.pc
5982 data/mono-cairo.pc
5983 data/mono-nunit.pc
5984 data/mono-options.pc
5985 data/mono-lineeditor.pc
5986 data/monodoc.pc
5987 data/dotnet.pc
5988 data/dotnet35.pc
5989 data/wcf.pc
5990 data/cecil.pc
5991 data/system.web.extensions_1.0.pc
5992 data/system.web.extensions.design_1.0.pc
5993 data/system.web.mvc.pc
5994 data/system.web.mvc2.pc
5995 data/system.web.mvc3.pc
5996 data/aspnetwebstack.pc
5997 data/reactive.pc
5998 samples/Makefile
5999 support/Makefile
6000 data/config
6001 tools/Makefile
6002 tools/locale-builder/Makefile
6003 tools/sgen/Makefile
6004 tools/monograph/Makefile
6005 tools/pedump/Makefile
6006 runtime/Makefile
6007 msvc/Makefile
6008 po/Makefile
6011 if test x$host_win32 = xyes; then
6012    # Get rid of 'cyg' prefixes in library names
6013    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6014    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6015    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6016    # executable doesn't work...
6017    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6020 if test x$host_darwin = xyes; then
6021    # This doesn't seem to be required and it slows down parallel builds
6022    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6026   case $prefix in
6027   NONE) prefix=$ac_default_prefix ;;
6028   esac
6029   case $exec_prefix in
6030   NONE) exec_prefix='${prefix}' ;;
6031   esac
6033   #
6034   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6035   # any existing config.make.  This allows people to share the same source tree
6036   # with different build directories, one native and one cross
6037   #
6038   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6040     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6042     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6043     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6044     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6045     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6046     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6047     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6048     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6049     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6050     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6052     case $INSTALL in
6053     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6054     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6055     esac
6057     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6059     export VERSION
6060     [myver=$($AWK 'BEGIN {
6061       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6062       if(length(vsplit [1]) > 4) {
6063         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6064       }
6065       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6066     }')]
6068     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6069     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6071     if test x$host_darwin = xyes; then
6072       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6073       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6074       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6075     elif test x$host_win32 = xyes; then
6076       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6077       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6078       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6079     elif test x$host_linux = xyes; then
6080       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6081       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6082       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6083     else
6084       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6085       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6086       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6087     fi
6089     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6090       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6091     fi
6093         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6094            enable_system_aot=yes
6095         fi
6097     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6098       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6099     fi
6101     if test x$DISABLE_MCS_DOCS = xyes; then
6102       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6103     fi
6105     if test x$has_extension_module != xno; then
6106         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6107     fi
6108     
6109     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6110     
6111     if test "x$test_bcl_opt" = "xyes"; then    
6112       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6113     fi
6115     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6117     if test $csc_compiler = mcs; then
6118       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6119     fi
6121     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6122       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6123       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6124       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6125     fi
6127     if test "x$AOT_MODE" != "x" ; then
6128       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6129     fi
6131     if test "x$enable_btls" = "xyes"; then
6132       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6133     fi
6135     if test "x$mono_native" = "xyes"; then
6136       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6137     else
6138       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6139     fi
6141     if test x$mono_native_compat = xyes; then
6142       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6143     else
6144       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6145     fi
6147     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6148     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6150   fi
6154 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6156 btls_platform_string=
6157 if test x$enable_btls = xyes; then
6158         if test x$btls_android = xyes; then
6159                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6160         else
6161                 btls_platform_string=" ($BTLS_PLATFORM)"
6162         fi
6165 thread_suspend_msg=
6166 if test x$buildsgen = xyes; then
6167         if test x$enable_cooperative_suspend != xno; then
6168                 thread_suspend_msg="Suspend:       Cooperative"
6169         elif test x$enable_hybrid_suspend != xno; then
6170                 thread_suspend_msg="Suspend:       Hybrid"
6171         else
6172                 thread_suspend_msg="Suspend:       Preemptive"
6173         fi
6175         
6176 echo "
6177         mcs source:    $mcsdir
6178         C# Compiler:   $csc_compiler
6180    Engine:
6181         Host:          $host
6182         Target:        $target
6183         GC:            $gc_msg 
6184         $thread_suspend_msg
6185         TLS:           $with_tls
6186         SIGALTSTACK:   $with_sigaltstack
6187         Engine:        $jit_status
6188         BigArrays:     $enable_big_arrays
6189         DTrace:        $enable_dtrace
6190         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
6191         Spectre:       $spectre_mitigation_status
6192         Mono.Native:   $mono_native_text
6194    Libraries:
6195         .NET 4.x:        $with_profile4_x
6196         Xamarin.Android: $with_monodroid
6197         Xamarin.iOS:     $with_monotouch
6198         Xamarin.WatchOS: $with_monotouch_watch
6199         Xamarin.TVOS:    $with_monotouch_tv
6200         Xamarin.Mac:     $with_xammac
6201         Windows AOT:     $with_winaot
6202         Orbis:           $with_orbis
6203         Unreal:          $with_unreal
6204         WebAssembly:     $with_wasm
6205         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6206         JNI support:     $jdk_headers_found
6207         libgdiplus:      $libgdiplus_msg
6208         zlib:            $zlib_msg
6209         BTLS:            $enable_btls$btls_platform_string
6210         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6211         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6212         $disabled
6214 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6215    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)