Add vifffff and viffffff trampolines
[mono-project.git] / configure.ac
blob55048517fb74f071e6dd91c6d5f1acca7d6aa3d4
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 # This line is parsed by tools besides autoconf, such as msvc/mono.winconfig.targets.
5 # It should remain in the format they expect.
7 AC_INIT(mono, [6.3.0],
8         [https://github.com/mono/mono/issues/new])
10 AC_CONFIG_SRCDIR([README.md])
11 AC_CONFIG_MACRO_DIR([m4])
12 AC_CANONICAL_SYSTEM
13 AC_CANONICAL_HOST
15 # Gross hack to enable 'make dist' on automake 1.9+tar 1.14.
16 # The extra brackets are to foil regex-based scans.
17 m4_ifdef([_A][M_PROG_TAR],[_A][M_SET_OPTION([tar-ustar])])
19 AM_INIT_AUTOMAKE([1.9 dist-xz tar-ustar no-dist-gzip foreign subdir-objects]
20                  m4_esyscmd([case `automake --version | head -n 1` in    # parallel-tests is default in automake 1.13+, we need to explicitly enable it
21                              *1.11*|*1.12*) echo parallel-tests;;        # for 1.11 and 1.12 but not below as those versions don't recognize the flag
22                              esac]))                                     # TODO: remove this hack once we require automake 1.11+
24 AC_CONFIG_HEADERS([config.h])
25 AM_MAINTAINER_MODE
26 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test]))
27 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test-bundle]))
29 API_VER=2.0
30 AC_SUBST(API_VER)
32 AC_PROG_LN_S
34 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
36 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
37 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
38 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
41 # This is the version of the corlib-runtime interface. When
42 # making changes to this interface (by changing the layout
43 # of classes the runtime knows about, changing icall signature or
44 # semantics etc), change this variable.
46 # This must be unique relative to corlib interface and semantics.
48 # If you change corlib such that a runtime change is required, or
49 # vice versa, change this string. Examples include removing icalls,
50 # adding icalls, changing icall signatures, and changing type layouts
51 # that both sides know.
53 # It is an arbitrary string and should be parsed as such.
54 # A guid works and is encouraged.
56 # Generate it with uuidgen. For example:
57 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
59 # There is no ordering of corlib versions, no old or new,
60 # an exact match is required between corlib and runtime.
62 # This line is parsed by tools besides autoconf, such as msvc/mono.winconfig.targets.
63 # It should remain in the format they expect.
65 MONO_CORLIB_VERSION=72b17ed6-e833-40ad-bc8b-d021b15b8d6e
68 # Put a quoted #define in config.h.
69 # Substitute @MONO_CORLIB_VERSION@ unquoted.
71 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,"$MONO_CORLIB_VERSION",[Version of the corlib-runtime interface])
72 AC_SUBST(MONO_CORLIB_VERSION)
74 case $host_os in
75 *cygwin* )
76                  echo "Run configure using ./configure --host=i686-w64-mingw32 or --host=x86_64-w64-mingw32"
77                  exit 1
78 esac
80 # In case of cygwin, override LN_S, irrespective of what it determines.
81 # The build uses cygwin, but the actual runtime doesn't.
82 case $host_os in
83 *cygwin* ) LN_S='cp -p';;
84 esac
87 # libgc defaults
89 libgc_configure_args=
91 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
92 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
93 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
94 CFLAGS_FOR_LIBGC=$CFLAGS
95 CPPFLAGS_FOR_BTLS=$CPPFLAGS
96 CFLAGS_FOR_BTLS=$CFLAGS
98 # libgc uses some deprecated APIs
99 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
102 # These are the flags that need to be stored in the mono.pc file for 
103 # compiling code that will embed Mono
105 libmono_cflags=""
106 libmono_ldflags=""
107 AC_SUBST(libmono_cflags)
108 AC_SUBST(libmono_ldflags)
110 # Variable to have relocatable .pc files (lib, or lib64)
111 # realpath isn't always available, and requires that all but the tip of the provided
112 # path exists. Fall back to the old behaviour, but realpath allows depth >1
113 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
114 # too deep for the old method to work
115 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
116 AC_SUBST(reloc_libdir)
118 # Set to yes if Unix sockets cannot be created in an anonymous namespace
119 need_link_unlink=no
121 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
122 extra_runtime_ldflags=""
124 # Thread configuration inspired by sleepycat's db
125 AC_MSG_CHECKING([host platform characteristics])
127 libgc_threads=no
128 has_dtrace=no
129 parallel_mark=yes
130 ikvm_native=yes
132 host_win32=no
133 target_win32=no
134 target_wasm=no
135 platform_android=no
136 platform_tizen=no
137 platform_ios=no
138 host_darwin=no
139 host_linux=no
141 case "$host" in
142         wasm32*)
143                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
144                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
145                 libdl="-ldl"
146                 libgc_threads=pthreads
147                 platform_wasm=yes
148                 ;;
149         *-mingw*|*-*-cygwin*)
150                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
151                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
152                 host_win32=yes
153                 mono_cv_clang=no
154                 if test "x$cross_compiling" = "xno"; then
155                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
156                                 target_win32=yes
157                         fi
158                 else
159                         if test "x$host" = "x$target"; then
160                                 target_win32=yes
161                         fi
162                 fi
163                 HOST_CC="gcc"
164                 RID="win-x86"
165                 CORETARGETS="/p:TargetsWindows=true"
166                 COREARCH="x86"
167                 # Boehm not supported on 64-bit Windows.
168                 case "$host" in
169                 x86_64-*-* | amd64-*-*)
170                         support_boehm=no
171                         with_gc=sgen
172                         RID="win-x64"
173                         COREARCH="x64"
174                         ;;
175                 esac
177                 # Windows 7 or later is required
178                 WIN32_CPPFLAGS="-DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
179                 CPPFLAGS="$CPPFLAGS $WIN32_CPPFLAGS"
180                 WIN32_LDFLAGS="-lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi -static-libgcc"
181                 LDFLAGS="$LDFLAGS $WIN32_LDFLAGS"
182                 libmono_cflags="-mms-bitfields -mwindows"
183                 libmono_ldflags="-mms-bitfields -mwindows"
184                 libdl=
185                 libgc_threads=win32
186                 with_sigaltstack=no
187                 with_tls=pthread
188                 with_sgen_default_concurrent=yes
189                 LN_S=cp
191                 # This forces libgc to use the DllMain based thread registration code on win32
192                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
193                 ;;
194         *-*-*netbsd*)
195                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
196                 libmono_cflags="-D_REENTRANT"
197                 LDFLAGS="$LDFLAGS -pthread"
198                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
199                 libmono_ldflags="-pthread"
200                 need_link_unlink=yes
201                 libdl="-ldl"
202                 libgc_threads=pthreads
203                 with_sigaltstack=no
204                 use_sigposix=yes
205                 with_sgen_default_concurrent=yes
206                 ;;
207         *-*-kfreebsd*-gnu)
208                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
209                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
210                 libmono_ldflags="-lpthread -pthread"
211                 libdl="-ldl"
212                 libgc_threads=pthreads
213                 need_link_unlink=yes
214                 with_sigaltstack=no
215                 use_sigposix=yes
216                 with_sgen_default_concurrent=yes
217                 ;;
218         *-*-*freebsd*)
219                 dnl For close_my_fds
220                 LDFLAGS="$LDFLAGS -lutil"
221                 if test "x$PTHREAD_CFLAGS" = "x"; then
222                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
223                         libmono_cflags=
224                 else
225                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
226                         libmono_cflags="$PTHREAD_CFLAGS"
227                 fi
228                 if test "x$PTHREAD_LIBS" = "x"; then
229                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
230                         libmono_ldflags="-pthread"
231                 else
232                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
233                         libmono_ldflags="$PTHREAD_LIBS"
234                 fi
235                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
236                 need_link_unlink=yes
237                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
238                 libdl=
239                 libgc_threads=pthreads
240                 use_sigposix=yes
241                 has_dtrace=yes
242                 case "$host" in
243                 aarch64-*)
244                         support_boehm=no
245                         with_gc=sgen
246                         ;;
247                 riscv*)
248                         support_boehm=no
249                         with_gc=sgen
250                         ;;
251                 esac
252                 with_sgen_default_concurrent=yes
253                 ;;
254         *-*-*openbsd*)
255                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
256                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
257                 if test "x$disable_munmap" != "xyes"; then
258                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
259                 fi
260                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
261                 LDFLAGS="$LDFLAGS -pthread"
262                 need_link_unlink=yes
263                 AC_DEFINE(PTHREAD_POINTER_ID)
264                 libdl=
265                 libgc_threads=pthreads
266                 with_tls=pthread
267                 with_sigaltstack=no
268                 use_sigposix=yes
269                 with_sgen_default_concurrent=yes
270                 ;;
271         *-*-linux-android*)
272                 platform_android=yes
273                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
274                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
276                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
277                 if test "x$disable_munmap" != "xyes"; then
278                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
279                 fi
280                 libmono_cflags="-D_REENTRANT"
281                 libdl="-ldl"
282                 libgc_threads=pthreads
283                 use_sigposix=yes
285                 with_tls=pthread
286                 with_sigaltstack=no
287                 with_static_mono=no
289                 # Android doesn't support boehm, as it's missing <link.h>
290                 support_boehm=no
291                 with_gc=sgen
293                 # isinf(3) requires -lm
294                 LDFLAGS="$LDFLAGS -lm"
296                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
297                 # PAGE_SIZE; breaks mono/io-layer/collection.c
298                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
299                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
300                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
302                 # to bypass the underscore linker check, can't work when cross-compiling
303                 mono_cv_uscore=yes
304                 mono_cv_clang=no
305                 ;;
306         *-*-linux*)
307                 host_linux=yes
308                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
309                 if test "x$disable_munmap" != "xyes"; then
310                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
311                 fi
312                 libmono_cflags="-D_REENTRANT"
313                 libdl="-ldl"
314                 libgc_threads=pthreads
315                 CORETARGETS="/p:TargetsUnix=true"
316                 use_sigposix=yes
317                 if test "x$cross_compiling" != "xno"; then
318                         # to bypass the underscore linker check, not
319                         # available during cross-compilation
320                         mono_cv_uscore=no
321                 fi
322                 case "$host" in
323                 *-tizen-linux-*)
324                         platform_tizen=yes
325                         ;;
326                 esac
327                 case "$host" in
328                 ppc64-*)
329                         RID="linux-ppc64"
330                         ;;
331                 ppc64le-*)
332                         RID="linux-ppc64el"
333                         ;;
334                 mipsel-*)
335                         RID="linux-mipsel"
336                         ;;
337                 x86-*)
338                         RID="linux-x86"
339                         COREARCH="x86"
340                         ;;
341                 x86_64-*)
342                         RID="linux-x64"
343                         COREARCH="x64"
344                         ;;
345                 arm-*)
346                         # deal with this in the FPU detection section, since
347                         # we cannot determine FPU from triplet and don't want
348                         # to duplicate the logic
349                         ;;
350                 aarch64-*)
351                         support_boehm=no
352                         with_gc=sgen
353                         RID="linux-arm64"
354                         COREARCH="arm64"
355                         ;;
356                 powerpc*-*-linux*)
357                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
358                         disable_munmap=yes
359                         ;;
360                 riscv*)
361                         support_boehm=no
362                         with_gc=sgen
363                         ;;
364                 esac
365                 with_sgen_default_concurrent=yes
366                 ;;
367         *-*-nacl*)
368                 echo "nacl no longer supported."
369                 exit 1
370                 ;;
371         *-*-hpux*)
372                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
373                 # +ESdbgasm only valid on bundled cc on RISC
374                 # silently ignored for ia64
375                 if test $GCC != "yes"; then
376                         CFLAGS="$CFLAGS +ESdbgasm"
377                         # Arrange for run-time dereferencing of null
378                         # pointers to produce a SIGSEGV signal.
379                         LDFLAGS="$LDFLAGS -z"
380                 fi
381                 CFLAGS="$CFLAGS +ESdbgasm"
382                 LDFLAGS="$LDFLAGS -z"
383                 libmono_cflags="-D_REENTRANT"
384                 libmono_ldflags="-lpthread"
385                 libgc_threads=pthreads
386                 need_link_unlink=yes
387                 use_sigposix=yes
388                 ;;
389         *-*-solaris*)
390                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
391                 need_link_unlink=yes
392                 libmono_cflags="-D_REENTRANT"
393                 libgc_threads=pthreads
394                 has_dtrace=yes
395                 use_sigposix=yes
396                 enable_solaris_tar_check=yes
397                 ;;
398         *-*-darwin*)
399                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
400                 host_darwin=yes
401                 target_mach=yes
402                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
403                 libmono_cflags="-D_THREAD_SAFE"
404                 need_link_unlink=yes
405                 AC_DEFINE(PTHREAD_POINTER_ID)
406                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
407                 CORETARGETS="/p:TargetsUnix=true /p:TargetsOSX=true"
408                 libdl=
409                 libgc_threads=pthreads
410                 has_dtrace=yes
411                 if test "x$cross_compiling" = "xyes"; then
412                         has_broken_apple_cpp=yes
413                 fi
414                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
415                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
416                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
417                 case "$host" in
418                         dnl Snow Leopard and newer config.guess reports as this
419                         i*86-*-darwin*)
420                                 BROKEN_DARWIN_FLAGS="-arch i386"
421                                 BROKEN_DARWIN_CPPFLAGS=""
422                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
423                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
424                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
425                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
426                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
427                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
428                                 with_sgen_default_concurrent=yes
429                                 RID="osx-x86"
430                                 COREARCH="x86"
431                                 ;;
432                         x*64-*-darwin*)
433                                 with_sgen_default_concurrent=yes
434                                 RID="osx-x64"
435                                 COREARCH="x64"
436                                 ;;
437                         arm*-darwin*)
438                                 platform_ios=yes
439                                 has_dtrace=no
440                                 ;;
441                         aarch64*-darwin*)
442                                 platform_ios=yes
443                                 ;;
444                 esac
445                 ;;
446         *-*-haiku*)
447                 dnl BSD_SOURCE is for getifaddrs
448                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
449                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
450                 libdl=
451                 LIBS="$LIBS -lnetwork -ltextencoding"
452                 need_link_unlink=yes
453                 AC_DEFINE(PTHREAD_POINTER_ID)
454                 dnl Haiku does not support static TLS with __thread
455                 with_tls=pthread
456                 libgc_threads=pthreads
457                 use_sigposix=yes
458                 with_sigaltstack=no
459                 ;;
460         *-*-fuchsia*)
461                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
462                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
463                 fuchsia=true
464                 with_tls=pthread
465                 with_sigaltstack=yes
466                 with_static_mono=no
467                 support_boehm=no
468                 with_gc=sgen
469                 mono_cv_uscore=yes
470                 mono_cv_clang=no
471                 ;;
472         *-*-aix*|*-*-os400*)
473                 dnl Set up a 64-bit build
474                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
475                 LDFLAGS="-maix64"
476                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
477                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
478                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
479                 dnl specifiy 64-bit mode for tools.
480                 AR="/usr/bin/ar -X64"
481                 NM="/usr/bin/nm -X64"
482                 dnl SGen is the future (changes to Boehm support code would be
483                 dnl required if you wish to re-enable Boehm)
484                 support_boehm=no
485                 with_gc=sgen
486                 need_link_unlink=yes
487                 use_sigposix=yes
488                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
489                 with_sigaltstack=no
490                 dnl use pthread TLS, __thread has issues with the compiler flags we use
491                 with_tls=pthread
492                 dnl ppc Linux is the same? test further
493                 disable_munmap=yes
494                 RID="aix-ppc64"
495                 CORETARGETS="/p:TargetsUnix=true"
496                 ;;
497         *)
498                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
499                 libdl="-ldl"
500                 ;;
501 esac
503 AC_MSG_RESULT(ok)
505 if test x$need_link_unlink = xyes; then
506    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
509 if test x$host_win32 = xyes; then
510    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
513 if test x$target_win32 = xyes; then
514    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
517 if test x$host_darwin = xyes; then
518    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
521 # Defined for all targets/platforms using classic Windows API support.
522 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
523 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
525 AC_SUBST(extra_runtime_ldflags)
526 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
527 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
528 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
529 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
530 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
531 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
532 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
533 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
534 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
536 if test -z "$HOST_DARWIN_TRUE"; then :
537 PLATFORM_AOT_SUFFIX=.dylib
538 PLATFORM_AOT_PREFIX=lib
541 if test -z "$HOST_LINUX_TRUE"; then :
542 PLATFORM_AOT_SUFFIX=.so
543 PLATFORM_AOT_PREFIX=lib
546 if test -z "$HOST_WIN32_TRUE"; then :
547 PLATFORM_AOT_SUFFIX=.dll
548 PLATFORM_AOT_PREFIX=
551 AC_SUBST(PLATFORM_AOT_SUFFIX)
552 AC_SUBST(PLATFORM_AOT_PREFIX)
554 if test -z "$HOST_WASM_TRUE"; then :
555 AC_DEFINE(HAVE_UTIME)
556 AC_DEFINE(HAVE_UTIMES)
559 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
561 AC_CHECK_TOOL(CC, gcc, gcc)
562 AC_PROG_CC
563 AC_CHECK_TOOL(CXX, g++, g++)
564 AC_PROG_CXX
565 AM_PROG_AS
566 AC_PROG_INSTALL
567 AC_PROG_AWK
568 AM_PROG_CC_C_O
569 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
570 : ${CCAS='$(CC)'}
571 # Set ASFLAGS if not already set.
572 : ${CCASFLAGS='$(CFLAGS)'}
573 AC_SUBST(CCAS)
574 AC_SUBST(CCASFLAGS)
576 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
577 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
578 if test "x$CXX" = "xg++"; then
579         if test "x$GXX" != "xyes"; then
580                 # automake/libtool is so broken, it requires g++ even if the c++ sources
581                 # are inside automake conditionals
582                 AC_MSG_ERROR([You need to install g++])
583         fi
586 dnl may require a specific autoconf version
587 dnl AC_PROG_CC_FOR_BUILD
588 dnl CC_FOR_BUILD not automatically detected
589 CC_FOR_BUILD=$CC
590 CFLAGS_FOR_BUILD=$CFLAGS
591 BUILD_EXEEXT=
592 if test "x$cross_compiling" = "xyes"; then
593         CC_FOR_BUILD=cc
594         CFLAGS_FOR_BUILD=
595         BUILD_EXEEXT=""
597 AC_SUBST(CC_FOR_BUILD)
598 AC_SUBST(CFLAGS_FOR_BUILD)
599 AC_SUBST(HOST_CC)
600 AC_SUBST(BUILD_EXEEXT)
602 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
603 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
605 # Set STDC_HEADERS
606 AC_HEADER_STDC
607 AC_LIBTOOL_WIN32_DLL
608 # This causes monodis to not link correctly
609 #AC_DISABLE_FAST_INSTALL
611 #lookup makedev() header
612 AC_HEADER_MAJOR
614 AM_PROG_LIBTOOL
615 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
616 DOLT
618 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
619 AC_SUBST(export_ldflags)
621 # Test whenever ld supports -version-script
622 AC_PROG_LD
623 AC_PROG_LD_GNU
625 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)
626 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)
627 AC_CHECK_HEADER(unistd.h, [HAVE_UNISTD_H=1], [HAVE_UNISTD_H=0])
628 AC_SUBST(HAVE_UNISTD_H)
629 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
630                   [], [], [#include <stddef.h>
631                   #include <sys/socket.h>
632                   #include <linux/socket.h>])
634 AC_CHECK_HEADERS(sys/user.h, [], [],
636 #ifdef HAVE_SYS_PARAM_H
637 # include <sys/param.h>
638 #endif
641 AC_CHECK_HEADERS(linux/serial.h)
643 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
644 if test x$have_zlib = xyes; then
645    AC_TRY_COMPILE([#include <zlib.h>], [
646    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
647    #else
648    #error No good zlib found
649    #endif
650    ],[
651         AC_MSG_RESULT(Using system zlib)
652         zlib_msg="system zlib"
653         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
654    ],[
655         AC_MSG_RESULT(Using embedded zlib)
656         have_zlib=no
657         zlib_msg="bundled zlib"
658    ])
661 AC_ARG_WITH(static-zlib, [  --with-static-zlib=PATH    use the specified static zlib instead of -lz],[STATIC_ZLIB_PATH=$with_static_zlib],[STATIC_ZLIB_PATH=])
662 if test "x$STATIC_ZLIB_PATH" != "x"; then
663         have_static_zlib=yes
664         AC_SUBST(STATIC_ZLIB_PATH)
667 AM_CONDITIONAL(HAVE_STATIC_ZLIB, test x$have_static_zlib = xyes)
668 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
669 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
671 # for mono/metadata/debug-symfile.c
672 AC_CHECK_HEADERS(elf.h)
674 # for support
675 AC_CHECK_HEADERS(poll.h)
676 AC_CHECK_HEADERS(sys/poll.h)
677 AC_CHECK_HEADERS(sys/wait.h)
678 AC_CHECK_HEADERS(grp.h)
679 AC_CHECK_HEADERS(syslog.h)
680 AC_CHECK_FUNCS(vsyslog)
682 # for mono/dis
683 AC_CHECK_HEADERS(wchar.h)
685 # for Linux statfs support
686 AC_CHECK_HEADERS(linux/magic.h)
688 # For Android NDK unified headers
689 if test x$platform_android = xyes; then
690         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
691         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
692         AC_CHECK_HEADERS(android/ndk-version.h)
694         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
695         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
696         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
697         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
698         # doesn't contain the required definitions (NDK 14)
699         if test x$have_android_signal_inlines = xyes; then
700                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
701                 AC_COMPILE_IFELSE([
702                         AC_LANG_PROGRAM([#include <signal.h>
703                                 #include <android/legacy_signal_inlines.h>],[
704                                 int i;
705                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
706                                 }
707                         ])],[
708                                 AC_MSG_RESULT(yes)
709                                 android_sigrtminmax_work=yes
710                         ],[
711                                 AC_MSG_RESULT(no)
712                                 android_sigrtminmax_work=no
713                         ]
714                 )
716                 if test x$android_sigrtminmax_work = xno; then
717                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
718                 fi
719         fi
721         # Attempt to detect whether we're using Android NDK unified headers
722         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
723         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
725         android_unified_headers=no
726         if test x$have_android_api_level = xyes; then
727                 if test x$have_android_versioning = xyes; then
728                         AC_MSG_CHECKING([whether using Android NDK unified headers])
730                         # Both macros are defined only in the NDK unified headers
731                         AC_COMPILE_IFELSE([
732                                 AC_LANG_PROGRAM([
733                                         #include <android/api-level.h>
734                                         #include <android/versioning.h>
735                                 ],[
736                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
737                                         #else
738                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
739                                         #endif
740                                 ])],[
741                                         AC_MSG_RESULT(yes)
742                                         android_unified_headers=yes
743                                 ],[
744                                         AC_MSG_RESULT(no)
745                                         android_unified_headers=no
746                                 ]
747                         )
748                 fi
749         fi
751         if test x$android_unified_headers = xyes; then
752                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
753         fi
754 fi # Android
756 # not 64 bit clean in cross-compile
757 AC_CHECK_SIZEOF(void *)
758 AC_CHECK_SIZEOF(long)
760 AC_CHECK_SIZEOF(int)
761 AC_CHECK_SIZEOF(long long)
763 AC_CACHE_CHECK([for clang],
764         mono_cv_clang,[
765         AC_TRY_COMPILE([], [
766                 #ifdef __clang__
767                 #else
768                 #error "FAILED"
769                 #endif
770         ],
771         [mono_cv_clang=yes],
772         [mono_cv_clang=no],
773         [])
776 AC_ARG_ENABLE(visibility-hidden,
777 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
778    disable_visibility_hidden=yes, disable_visibility_hidden=no)
780 WARN=''
781 if test x"$GCC" = xyes; then
782                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
783                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
785                 # We require C99 with some GNU extensions, e.g. `linux` macro
786                 CFLAGS="$CFLAGS -std=gnu99"
788                 # The runtime code does not respect ANSI C strict aliasing rules
789                 CFLAGS="$CFLAGS -fno-strict-aliasing"
791                 # We rely on signed overflow to behave
792                 CFLAGS="$CFLAGS -fwrapv"
794                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
795                 if test x"$disable_visibility_hidden" = xno; then
796                    # Don't export any symbols by default
797                    SHARED_CFLAGS="-fvisibility=hidden"
798                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
799                 fi
801                 ORIG_CFLAGS=$CFLAGS
802                 # Check for the normal version, since gcc ignores unknown -Wno options
803                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
804                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
805                 AC_TRY_COMPILE([],[
806                 ], [
807                    AC_MSG_RESULT(yes)
808                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
809                 ], [
810                    AC_MSG_RESULT(no)
811                    CFLAGS=$ORIG_CFLAGS
812                 ])
814                 if test "x$mono_cv_clang" = "xyes"; then
815                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
816                    WARN="$WARN -Qunused-arguments"
817                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
818                    # We rely on zero length arrays in structs
819                    WARN="$WARN -Wno-zero-length-array"
820                 fi
821 else
822         # The Sun Forte compiler complains about inline functions that access static variables
823         # so disable all inlining.
824         case "$host" in
825         *-*-solaris*)
826                 CFLAGS="$CFLAGS -Dinline="
827                 ;;
828         esac
830 CFLAGS="$WARN $CFLAGS -g"
831 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
832 CPPFLAGS="$WARN $CPPFLAGS -g"
834 # Where's the 'mcs' source tree?
835 if test -d $srcdir/mcs; then
836   mcsdir=mcs
837 else
838   mcsdir=../mcs
841 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
842         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
843                 mcsdir=$with_mcs_path
844         fi
847 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
849 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
850 if test x$with_core = xonly; then
851     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
852     with_runtime_preset=netcore
854 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
857 # A sanity check to catch cases where the package was unpacked
858 # with an ancient tar program (Solaris)
860 AC_ARG_ENABLE(solaris-tar-check,
861 [  --disable-solaris-tar-check    disable solaris tar check],
862    do_solaris_tar_check=no, do_solaris_tar_check=yes)
864 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
865         AC_MSG_CHECKING(integrity of package)
866         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
867         then
868                 AC_MSG_RESULT(ok)
869         else
870                 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"
871                 AC_MSG_ERROR([$errorm])
872         fi
875 if test "x$with_mcs_path" != "x"; then
876 mcs_topdir=$(cd "$mcsdir" && pwd)
877 mcs_topdir_from_srcdir=$mcs_topdir
878 else
879 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
880 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
883 # Convert mcs_topdir* paths to Windows syntax.
884 if test x$cross_compiling$host_win32 = xnoyes; then
885   mcs_topdir=$(cygpath -m $mcs_topdir)
886   case $mcs_topdir_from_srcdir in
887     /cygdrive/*)
888         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
889         ;;
890   esac
893 AC_SUBST([mcs_topdir])
894 AC_SUBST([mcs_topdir_from_srcdir])
896 # gettext: prepare the translation directories. 
897 # we do not configure the full gettext, as we consume it dynamically from C#
898 AM_PO_SUBDIRS
900 if test "x$USE_NLS" = "xyes"; then
901    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
903    if test "x$HAVE_MSGFMT" = "xno"; then
904           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
905    fi
908 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
910 pkg_config_path=
911 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
912         if test x$with_crosspkgdir = "x"; then
913                 if test -s $PKG_CONFIG_PATH; then
914                         pkg_config_path=$PKG_CONFIG_PATH
915                 fi
916         else
917                 pkg_config_path=$with_crosspkgdir
918                 PKG_CONFIG_PATH=$pkg_config_path
919                 export PKG_CONFIG_PATH
920         fi
923 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
924 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
925 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
927 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
928 if test x$werror_flag = xyes; then
929         WERROR_CFLAGS="-Werror"
931 AC_SUBST([WERROR_CFLAGS])
932 AC_SUBST([SHARED_CFLAGS])
934 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
935   
936 AC_SUBST(GLIB_CFLAGS)
938 # Enable support for fast thread-local storage
939 # Some systems have broken support, so we allow to disable it.
940 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
942 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
943 # This does not work on some platforms (bug #55253)
944 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
946 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
947 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
948 # Same as --with-shared_mono=no
949 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
951 if test "x$enable_static" = "xno"; then
952    with_static_mono=no
955 if test "x$enable_shared" = "xno"; then
956    with_shared_mono=no
959 if test "x$enable_libraries" = "xno"; then
960    with_shared_mono=no
963 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
965 if test "x$host_win32" = "xyes"; then
966    # Boehm GC requires the runtime to be in its own dll
967    with_static_mono=no
970 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
971 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
972 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
973 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
975 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
976 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
977         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
978         ORIG_CFLAGS=$CFLAGS
979         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
980         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
981         AC_TRY_COMPILE([], [
982         ], [
983            AC_MSG_RESULT(yes)
984            # Pass it to libgc as well
985            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
986         ], [
987            AC_MSG_RESULT(no)
988            CFLAGS=$ORIG_CFLAGS
989         ])
992 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
994 if test x$enable_small_config = xyes; then
995         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
996         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
999 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)
1001 DISABLED_FEATURES=none
1002 csc_compiler=default
1003 endian=unknown
1004 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
1005 AC_MSG_CHECKING([CSharp compiler to use])
1006 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
1007    if test x$withval = xmcs; then
1008        csc_compiler=mcs
1009    elif test x$withval = xroslyn; then
1010        csc_compiler=roslyn
1011    elif test x$withval = xdefault; then
1012        :
1013    else
1014        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
1015    fi
1016 ],[csc_compiler=default])
1018 if test $csc_compiler = default; then
1019    if test $endian = big; then
1020       csc_compiler=mcs
1021    elif test $endian = little; then
1022       case "$host" in
1023         powerpc*) csc_compiler=mcs ;;
1024         *) csc_compiler=roslyn ;;
1025       esac
1026    else
1027       csc_compiler=mcs
1028    fi
1030 AC_MSG_RESULT($csc_compiler)
1032 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
1033 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
1034 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])
1037 if test x$target_win32 = xyes; then
1038 with_jemalloc=no
1039 with_jemalloc_assert=no
1040 with_jemalloc_always=no
1043 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
1044 if test "x$with_jemalloc_assert" = "xyes"; then
1045 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
1046 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
1047 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
1050 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
1051 if test "x$with_jemalloc_always" = "xyes"; then
1052 with_jemalloc=yes
1053 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
1054 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
1055 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
1058 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
1059 if test "x$with_jemalloc" = "xyes"; then
1060 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
1061 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
1062 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
1064 if test "x$target_mach" = "xyes"; then
1065         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
1068 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
1069 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
1071 AC_SUBST(JEMALLOC_CFLAGS)
1072 AC_SUBST(JEMALLOC_CPPFLAGS)
1073 AC_SUBST(JEMALLOC_LDFLAGS)
1074 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
1077 # Terminology:
1078 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
1079 # MERP - The MS telemetry profile. Not for general use.
1080 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
1082 # 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.
1084 #--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.
1085 #--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.
1086 #--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.
1087 #--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.
1089 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])
1090 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])
1091 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1093 if test "x$with_crash_privacy" = "xyes"; then
1094 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1097 if test "x$with_structured_crashes" = "xno"; then
1098 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1101 case "$host" in
1102         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1103                 crash_reporting=no
1104                 ;;
1105 esac
1107 if test "x$crash_reporting" != "xyes"; then
1108 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1109 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1112 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1113 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1115 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1116 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1118 if test x$enable_monodroid = xyes; then
1119         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1122 if test x$enable_monotouch = xyes; then
1123         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1126 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1128 # mono/corefx/native has a lot of invalid C++98 in its headers
1129 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1130 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1131 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1132 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1134 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1135 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1136 # and add it whenever we're running clang on Darwin.
1137 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1138         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1141 AC_SUBST(CXXFLAGS_COMMON)
1143 if test "x$enable_cxx" = "xyes"; then
1145         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1147         # -std=gnu99 -xc++ is not allowed and errors.
1148         CXX_REMOVE_CFLAGS=-std=gnu99
1149         # These give warnings and should be removed. They are C-only.
1150         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1151         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1152         # Likewise with CentOS 6 gcc 4.4.
1153         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1155         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1156         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1157         # generates a warning every time we run gcc which is very unsightly.
1158         # The warning is for e.g. sprintf(foo, "") which can just be
1159         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1160         # and completely legal and valid.
1161         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1162         # Alternatively, just run $CXX -xc++ -c /dev/null.
1163         AC_LANG_PUSH(C++)
1164         ORIG_CXXFLAGS=$CXXFLAGS
1165         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1166         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1167         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1168                                  [ AC_MSG_RESULT(no)
1169                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1170         CXXFLAGS=$ORIG_CXXFLAGS
1171         AC_LANG_POP(C++)
1173 AC_SUBST(CXX_ADD_CFLAGS)
1174 AC_SUBST(CXX_REMOVE_CFLAGS)
1177 # Set the build profiles and options before things which use them
1180 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])
1181 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1182 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1183 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])
1184 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])
1185 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1186 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1187 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])
1188 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])
1189 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])
1190 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1191 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1192 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1193 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1196 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,winaot,winaot_llvm,bitcode,bitcodeinterp,unreal,fullaotinterp,fullaotinterp_llvm  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1197 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])
1198 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])
1199 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])
1202 dnl Spectre compiler mitigation flag checks
1204 if test "x$with_spectre_mitigation" = "xyes"; then
1205    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1206    SPECTRE_CFLAGS=
1207    SPECTRE_INDIRECT_BRANCH_KIND=
1208    case "x$with_spectre_indirect_branch_choice" in
1209        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1210        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1211        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1212        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1213        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1214    esac
1216    SPECTRE_FUNCTION_RETURN_KIND=""
1217    case "x$with_spectre_function_return_choice" in
1218        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1219        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1220        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1221        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1222        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1223    esac
1225    AX_CHECK_COMPILE_FLAG(
1226         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1227         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1228    )
1230    AX_CHECK_COMPILE_FLAG(
1231         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1232         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1233    )
1235    if test "x$SPECTRE_CFLAGS" != "x" ; then
1236         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1237         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1238         spectre_mitigation_status="mitigation enabled"
1239    fi
1240 else
1241         spectre_mitigation_status="no mitigation"
1245 dnl Profile defaults
1247 TEST_PROFILE=default
1248 enable_llvm_default=no
1250 with_profile4_x_default=no
1251 with_monodroid_default=no
1252 with_monotouch_default=no
1253 with_monotouch_watch_default=no
1254 with_monotouch_tv_default=no
1255 with_xammac_default=no
1256 with_testing_aot_full_interp_default=no
1257 with_testing_aot_hybrid_default=no
1258 with_testing_aot_full_default=no
1259 with_winaot_default=no
1260 with_orbis_default=no
1261 with_unreal_default=no
1262 with_wasm_default=no
1264 with_bitcode_default=no
1265 enable_cooperative_suspend_default=no
1266 enable_hybrid_suspend_default=no
1268 # For the sake of clearer error messages, these numbers should all be different from each other.
1269 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4400,nftnptr-arg-trampolines=4000
1271 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1273 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1274    DISABLE_MCS_DOCS_default=yes
1275 elif test x$with_runtime_preset = xnetcore; then
1276    DISABLE_MCS_DOCS_default=yes
1278    mono_feature_disable_remoting='yes'
1279    mono_feature_disable_reflection_emit_save='yes'
1280    mono_feature_disable_appdomains='yes'
1281    mono_feature_disable_cleanup='yes'
1282    mono_feature_disable_assembly_remapping='yes'
1283    disable_mono_native=yes
1284    support_boehm=no
1285 elif test x$with_runtime_preset = xnet_4_x; then
1286    with_profile4_x_default=yes
1287    TEST_PROFILE=net_4_x
1288 elif test x$with_runtime_preset = xall; then
1289    with_profile4_x_default=yes
1290    with_monodroid_default=yes
1291    with_monotouch_default=yes
1292    with_monotouch_watch_default=yes
1293    with_monotouch_tv_default=yes
1294    with_xammac_default=yes
1295    with_winaot_default=yes
1296    with_orbis_default=yes
1297    with_unreal_default=yes
1298    with_wasm_default=yes
1299    with_testing_aot_full_interp_default=yes
1300    with_testing_aot_hybrid_default=yes
1301    with_testing_aot_full_default=yes
1302    TEST_PROFILE=net_4_x
1303 elif test x$with_runtime_preset = xbitcode; then
1304    DISABLE_MCS_DOCS_default=yes
1305    with_testing_aot_full_default=yes
1306    with_bitcode_default=yes
1307    enable_cooperative_suspend_default=yes
1308    # FIXME: use TEST_PROFILE=testing_aot_full
1309    TEST_PROFILE=testing_aot_bitcode
1310    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1311    enable_llvm_default=yes
1313    mono_feature_disable_com='yes'
1314    mono_feature_disable_remoting='yes'
1315    mono_feature_disable_reflection_emit_save='yes'
1316    mono_feature_disable_reflection_emit='yes'
1317    mono_feature_disable_appdomains='yes'
1319    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1320    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1321    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1322    AOT_MODE="llvmonly"
1323 elif test x$with_runtime_preset = xbitcodeinterp; then
1324    with_testing_aot_full_interp_default=yes
1325    with_bitcode_default=yes
1326    enable_cooperative_suspend_default=yes
1327    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1328    TEST_PROFILE=testing_aot_bitcode_interp
1329    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1330    enable_llvm_default=yes
1332    # mscorlib.dll aot compilation crashes
1333    mono_feature_disable_com='yes'
1335    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1336    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1337    AOT_RUN_FLAGS="--llvmonly-interp"
1338 elif test x$with_runtime_preset = xfullaot; then
1339    DISABLE_MCS_DOCS_default=yes
1340    with_testing_aot_full_default=yes
1341    TEST_PROFILE=testing_aot_full
1343    mono_feature_disable_com='yes'
1344    mono_feature_disable_remoting='yes'
1345    mono_feature_disable_reflection_emit_save='yes'
1346    mono_feature_disable_reflection_emit='yes'
1347    mono_feature_disable_appdomains='yes'
1349    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1350    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1351    AOT_MODE="full"
1352 elif test x$with_runtime_preset = xfullaot_llvm; then
1353    DISABLE_MCS_DOCS_default=yes
1354    with_testing_aot_full_default=yes
1355    TEST_PROFILE=testing_aot_full
1357    mono_feature_disable_com='yes'
1358    mono_feature_disable_remoting='yes'
1359    mono_feature_disable_reflection_emit_save='yes'
1360    mono_feature_disable_reflection_emit='yes'
1361    mono_feature_disable_appdomains='yes'
1363    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1364    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1365    AOT_MODE="full"
1366 elif test x$with_runtime_preset = xhybridaot; then
1367    DISABLE_MCS_DOCS_default=yes
1368    with_testing_aot_hybrid_default=yes
1369    TEST_PROFILE=testing_aot_hybrid 
1371    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1372    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1373 elif test x$with_runtime_preset = xhybridaot_llvm; then
1374    DISABLE_MCS_DOCS_default=yes
1375    with_testing_aot_hybrid_default=yes
1376    TEST_PROFILE=testing_aot_hybrid
1378    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1379    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1380 elif test x$with_runtime_preset = xfullaotinterp; then
1381    with_testing_aot_full_interp_default=yes
1382    TEST_PROFILE=testing_aot_full_interp
1384    # mscorlib.dll aot compilation crashes
1385    mono_feature_disable_com='yes'
1387    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1388    AOT_RUN_FLAGS="--full-aot-interp"
1389 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1390    with_testing_aot_full_interp_default=yes
1391    TEST_PROFILE=testing_aot_full_interp
1393    # mscorlib.dll aot compilation crashes
1394    mono_feature_disable_com='yes'
1396    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1397    AOT_RUN_FLAGS="--full-aot-interp"
1398 elif test x$with_runtime_preset = xaot; then
1399    with_profile4_x_default=yes
1401    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1402    AOT_RUN_FLAGS=""
1404    DISABLE_MCS_DOCS_default=yes
1405 elif test x$with_runtime_preset = xaot_llvm; then
1406    with_profile4_x_default=yes
1408    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1409    AOT_RUN_FLAGS=""
1411    DISABLE_MCS_DOCS_default=yes
1412 elif test x$with_runtime_preset = xwinaot; then
1413    DISABLE_MCS_DOCS_default=yes
1414    with_winaot_default=yes
1415    TEST_PROFILE=winaot
1417    mono_feature_disable_com='yes'
1418    mono_feature_disable_remoting='yes'
1419    mono_feature_disable_reflection_emit_save='yes'
1420    mono_feature_disable_reflection_emit='yes'
1421    mono_feature_disable_appdomains='yes'
1423    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1424    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1425    AOT_MODE="full"
1426 elif test x$with_runtime_preset = xwinaot_llvm; then
1427    DISABLE_MCS_DOCS_default=yes
1428    with_winaot_default=yes
1429    TEST_PROFILE=winaot
1431    mono_feature_disable_com='yes'
1432    mono_feature_disable_remoting='yes'
1433    mono_feature_disable_reflection_emit_save='yes'
1434    mono_feature_disable_reflection_emit='yes'
1435    mono_feature_disable_appdomains='yes'
1437    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1438    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1439    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1440    AOT_MODE="full"
1441 elif test x$with_runtime_preset = xorbis; then
1442    DISABLE_MCS_DOCS_default=yes
1443    with_orbis_default=yes
1444    TEST_PROFILE=orbis
1446    mono_feature_disable_com='yes'
1447    mono_feature_disable_remoting='yes'
1448    mono_feature_disable_reflection_emit_save='yes'
1449    mono_feature_disable_reflection_emit='yes'
1450    mono_feature_disable_appdomains='yes'
1452    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1453    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1454    AOT_MODE="full"
1455 elif test x$with_runtime_preset = xunreal; then
1456    DISABLE_MCS_DOCS_default=yes
1457    with_unreal_default=yes
1458    TEST_PROFILE=unreal
1460    mono_feature_disable_com='yes'
1461    mono_feature_disable_remoting='yes'
1462    mono_feature_disable_appdomains='no'
1464    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1465    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1466 elif test x$with_runtime_preset = xwasm; then
1467    DISABLE_MCS_DOCS_default=yes
1468    with_wasm_default=yes
1469    TEST_PROFILE=wasm
1471    mono_feature_disable_com='yes'
1472    mono_feature_disable_remoting='yes'
1473    mono_feature_disable_reflection_emit_save='yes'
1474    mono_feature_disable_reflection_emit='yes'
1475    mono_feature_disable_appdomains='yes'
1477    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1478    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1479 else
1480    TEST_PROFILE=net_4_x
1481    with_profile4_x_default=yes
1484 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1485    AC_SUBST(AOT_BUILD_FLAGS)
1486    AC_SUBST(AOT_RUN_FLAGS)
1487    # For llvmonlycheck + fullaotcheck
1488    AC_SUBST(INVARIANT_AOT_OPTIONS)
1491 AC_SUBST(TEST_PROFILE)
1493 if test "x$with_profile4_x" = "xdefault"; then
1494    with_profile4_x=$with_profile4_x_default
1496 if test "x$with_monodroid" = "xdefault"; then
1497    with_monodroid=$with_monodroid_default
1499 if test "x$with_monotouch" = "xdefault"; then
1500    with_monotouch=$with_monotouch_default
1502 if test "x$with_monotouch_watch" = "xdefault"; then
1503    with_monotouch_watch=$with_monotouch_watch_default
1505 if test "x$with_monotouch_tv" = "xdefault"; then
1506    with_monotouch_tv=$with_monotouch_tv_default
1508 if test "x$with_bitcode" = "xdefault"; then
1509    with_bitcode=$with_bitcode_default
1511 if test "x$with_xammac" = "xdefault"; then
1512    with_xammac=$with_xammac_default
1514 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1515    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1517 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1518    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1520 if test "x$with_testing_aot_full" = "xdefault"; then
1521    with_testing_aot_full=$with_testing_aot_full_default
1523 if test "x$with_winaot" = "xdefault"; then
1524    with_winaot=$with_winaot_default
1526 if test "x$with_orbis" = "xdefault"; then
1527    with_orbis=$with_orbis_default
1529 if test "x$with_unreal" = "xdefault"; then
1530    with_unreal=$with_unreal_default
1532 if test "x$with_wasm" = "xdefault"; then
1533    with_wasm=$with_wasm_default
1537 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1538 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1539 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1540 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1541 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1542 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1543 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1544 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1545 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1546 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1547 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1548 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1549 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1550 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1551 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1553 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1554 AM_CONDITIONAL(FULL_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full"] || [test "x$TEST_PROFILE" = "xtesting_aot_bitcode"] || [test "x$TEST_PROFILE" = "xwinaot"] || [test "x$TEST_PROFILE" = "xorbis"] || [test "x$TEST_PROFILE" = "xwasm"])
1555 AM_CONDITIONAL(FULL_AOT_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"] || [test "x$TEST_PROFILE" = "xtesting_aot_bitcode_interp"])
1556 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1558 default_profile=net_4_x
1559 if test -z "$INSTALL_MONODROID_TRUE"; then :
1560    default_profile=monodroid
1562 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1563    default_profile=monotouch
1565 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1566    default_profile=xammac
1568 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1569    default_profile=testing_aot_full_interp
1571 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1572    default_profile=testing_aot_hybrid
1574 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1575    default_profile=testing_aot_full
1577 if test -z "$INSTALL_WINAOT_TRUE"; then :
1578    default_profile=winaot
1580 if test -z "$INSTALL_ORBIS_TRUE"; then :
1581    default_profile=orbis
1583 if test -z "$INSTALL_UNREAL_TRUE"; then :
1584    default_profile=unreal
1586 if test -z "$INSTALL_WASM_TRUE"; then :
1587    default_profile=wasm
1589 if test -z "$INSTALL_4_x_TRUE"; then :
1590    default_profile=net_4_x
1592 DEFAULT_PROFILE=$default_profile
1593 AC_SUBST(DEFAULT_PROFILE)
1596 # End build profile configuration
1599 if test x$USE_NLS = xprofile_default; then
1601         AC_MSG_CHECKING([NLS used])
1603         # We make the default value for USE_NLS
1604         # "no" on OSX because it isn't available on most
1605         # default OSX installs. The most common configurations will
1606         # all disable it, so this saves us typing.
1607         if test x$host_darwin = xyes; then
1608                 USE_NLS=no;
1609         else
1610                 USE_NLS=yes;
1611         fi
1613         AC_SUBST([USE_NLS])
1614         AC_MSG_RESULT([$USE_NLS])
1617 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1618      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1619      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1620          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1622         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1623                 eval "mono_feature_disable_$feature='yes'"
1624         done
1625         DISABLED_FEATURES=$enable_minimal
1626         disabled="Disabled:      $enable_minimal"
1627 ],[])
1629 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1631 if test "x$mono_feature_disable_aot" = "xyes"; then
1632         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1633         enable_system_aot=no
1634         AC_MSG_NOTICE([Disabled AOT compiler])
1637 if test "x$mono_feature_disable_profiler" = "xyes"; then
1638         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1639         AC_MSG_NOTICE([Disabled support for the profiler])
1641 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1643 if test "x$mono_feature_disable_decimal" = "xyes"; then
1644         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1645         AC_MSG_NOTICE([Disabled support for decimal])
1648 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1649         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1650         AC_MSG_NOTICE([Disabled support for P/Invoke])
1653 if test "x$mono_feature_disable_debug" = "xyes"; then
1654         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1655         AC_MSG_NOTICE([Disabled support for runtime debugging])
1658 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1659         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1660         mono_feature_disable_reflection_emit_save=yes
1661         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1664 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1665         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1666         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1669 if test "x$mono_feature_disable_large_code" = "xyes"; then
1670         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1671         AC_MSG_NOTICE([Disabled support for large assemblies])
1674 if test "x$mono_feature_disable_logging" = "xyes"; then
1675         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1676         AC_MSG_NOTICE([Disabled support for logging])
1679 if test "x$mono_feature_disable_com" = "xyes"; then
1680         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1681         AC_MSG_NOTICE([Disabled COM support])
1684 if test "x$mono_feature_disable_ssa" = "xyes"; then
1685         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1686         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1689 if test "x$mono_feature_disable_generics" = "xyes"; then
1690         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1691         AC_MSG_NOTICE([Disabled Generics Support])
1694 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1695         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1696         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1699 if test "x$mono_feature_disable_portability" = "xyes"; then
1700         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1701         AC_MSG_NOTICE([Disabled IO Portability layer])
1704 if test "x$mono_feature_disable_attach" = "xyes"; then
1705         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1706         AC_MSG_NOTICE([Disabled agent attach])
1709 if test "x$mono_feature_disable_verifier" = "xyes"; then
1710         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1711         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1714 if test "x$mono_feature_disable_jit" = "xyes"; then
1715         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1716         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1719 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1721 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1722         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1723         AC_MSG_NOTICE([Disabled the interpreter])
1726 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1728 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1729         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1732 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1734 if test "x$mono_feature_disable_simd" = "xyes"; then
1735         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1736         AC_MSG_NOTICE([Disabled SIMD support])
1739 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1740         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1741         AC_MSG_NOTICE([Disabled Soft Debugger.])
1744 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1746 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1747         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1748         AC_MSG_NOTICE([Disabled Performance Counters.])
1750 if test "x$mono_feature_disable_normalization" = "xyes"; then
1751         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1752         AC_MSG_NOTICE([Disabled String normalization support.])
1755 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1756 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1757         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1758         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1761 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1762         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1763         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1766 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1767         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1768         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1771 if test "x$mono_feature_disable_remoting" = "xyes"; then
1772         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1773         AC_MSG_NOTICE([Disabled remoting])
1776 if test "x$mono_feature_disable_security" = "xyes"; then
1777         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1778         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1781 if test "x$mono_feature_disable_lldb" = "xyes"; then
1782         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1783         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1786 if test "x$mono_feature_disable_mdb" = "xyes"; then
1787         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1788         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1791 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1792         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1793         AC_MSG_NOTICE([Disabled assertion messages.])
1796 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1797         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1798         AC_MSG_NOTICE([Disabled runtime cleanup.])
1801 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1802         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1803         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1807 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1808         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1809         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1812 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1813         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1814         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1817 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1818         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1819         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1822 if test "x$mono_feature_disable_sockets" = "xyes"; then
1823         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1824         AC_MSG_NOTICE([Disabled sockets])
1827 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1828 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1830 has_extension_module=no
1831 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1833         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1834                 if test x$extension = xdefault ; then
1835                         has_extension_module=yes;
1836                 fi
1837         done
1838         if test x$enable_extension_module = xyes; then
1839                 has_extension_module=yes;
1840         fi
1841 ], [])
1843 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1845 if test x$has_extension_module != xno ; then
1846         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1847         AC_MSG_NOTICE([Enabling mono extension module.])
1850 # Deprecated
1851 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1853 AC_MSG_CHECKING(for visibility __attribute__)
1854 AC_COMPILE_IFELSE([
1855         AC_LANG_SOURCE([[
1856                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1857                 int main () { doit (); return 0; }
1858         ]])
1859 ], [
1860    have_visibility_hidden=yes
1861    AC_MSG_RESULT(yes)
1862 ], [
1863    have_visibility_hidden=no
1864    AC_MSG_RESULT(no)
1868 dnl Boehm GC configuration
1871 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1873 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1874 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1876 if test "x$support_boehm" = "xyes"; then
1878         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1879         if test x$enable_parallel_mark = xyes; then
1880                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1881         fi
1883         gc_msg=""
1884         LIBGC_CPPFLAGS=
1885         LIBGC_LIBS=
1886         LIBGC_STATIC_LIBS=
1887         libgc_dir=
1888         case "x$libgc" in
1889                 xincluded)
1890                         if test "x$support_boehm" = "xyes"; then
1891                                 libgc_dir=libgc
1892                         fi
1894                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1895                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1896                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1898                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1900                         if test x$target_win32 = xyes; then
1901                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1902                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1903                         fi
1905                         gc_msg="Included Boehm GC with typed GC"
1906                         if test x$enable_parallel_mark = xyes; then
1907                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1908                                 gc_msg="$gc_msg and parallel mark"
1909                         else
1910                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1911                         fi
1912                         ;;
1914                 xboehm|xbohem|xyes)
1915                         AC_MSG_WARN("External Boehm is no longer supported")
1916                         ;;
1918                 xsgen)
1919                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1920                         ;;
1922                 xnone)
1923                         AC_MSG_WARN("Compiling mono without GC.")
1924                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1925                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1926                         gc_msg="none"
1927                         ;;
1928                 *)
1929                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1930                         ;;
1931         esac
1933         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])
1934         if test "x$large_heap" = "xyes"; then
1935            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1936         fi
1938         AC_SUBST(LIBGC_CPPFLAGS)
1939         AC_SUBST(LIBGC_LIBS)
1940         AC_SUBST(LIBGC_STATIC_LIBS)
1941         AC_SUBST(libgc_dir)
1942         AC_SUBST(BOEHM_DEFINES)
1945 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1948 dnl End of Boehm GC Configuration
1951 dnl *************************************
1952 dnl *** Checks for zero length arrays ***
1953 dnl *************************************
1954 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1955 AC_TRY_COMPILE([
1956         struct s {
1957                 int  length;
1958                 char data [0];
1959         };
1960 ], [], [
1961         AC_MSG_RESULT(yes)
1962         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1963 ], [
1964         AC_MSG_RESULT(no)
1965         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1968 dnl ***********************************
1969 dnl *** Checks for signals
1970 dnl ***********************************
1971 AC_CHECK_HEADERS(signal.h)
1972 AC_CHECK_FUNCS(sigaction)
1973 AC_CHECK_FUNCS(kill)
1974 AC_CHECK_FUNCS(signal)
1976 # signal() is declared inline in Android headers
1977 # so we need to workaround it by overriding the check.
1978 if test x$platform_android = xyes; then
1979         AC_DEFINE(HAVE_SIGNAL,1)
1982 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1983 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1985 if test x$host_win32 = xno; then
1986         dnl *************************************
1987         dnl *** Checks for time capabilities ***
1988         dnl *************************************
1990         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1991         AC_TRY_COMPILE([#include <time.h>], [
1992                 const int foo = CLOCK_MONOTONIC;
1993         ],[
1994                 AC_MSG_RESULT(yes)
1995                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1996         ], [
1997                 AC_MSG_RESULT(no)
1998         ])
2000         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
2001         AC_TRY_COMPILE([#include <time.h>], [
2002                 const int foo = CLOCK_MONOTONIC_COARSE;
2003         ],[
2004                 AC_MSG_RESULT(yes)
2005                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
2006         ], [
2007                 AC_MSG_RESULT(no)
2008         ])
2010         AC_MSG_CHECKING(for CLOCK_REALTIME)
2011         AC_TRY_COMPILE([#include <time.h>], [
2012                 const int foo = CLOCK_REALTIME;
2013         ],[
2014                 AC_MSG_RESULT(yes)
2015                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
2016         ], [
2017                 AC_MSG_RESULT(no)
2018         ])
2020         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
2021         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
2022         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
2023         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
2024         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
2025         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
2027         dnl hires monotonic clock support
2028         AC_SEARCH_LIBS(clock_gettime, rt)
2029         AC_CHECK_FUNCS(clock_nanosleep)
2031         dnl dynamic loader support
2032         AC_CHECK_FUNC(dlopen, DL_LIB="",
2033                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
2034         )
2035         if test x$dl_support = xno; then
2036                 AC_MSG_WARN([No dynamic loading support available])
2037         else
2038                 LIBS="$LIBS $DL_LIB"
2039                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
2040                 dnl from glib's configure.ac
2041                 AC_CACHE_CHECK([for preceeding underscore in symbols],
2042                         mono_cv_uscore,[
2043                         AC_TRY_RUN([#include <dlfcn.h>
2044                         int mono_underscore_test (void) { return 42; }
2045                         int main() {
2046                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
2047                           handle = dlopen ((void*)0, 0);
2048                           if (handle) {
2049                             f1 = dlsym (handle, "mono_underscore_test");
2050                             f2 = dlsym (handle, "_mono_underscore_test");
2051                           } return (!f2 || f1);
2052                         }],
2053                                 [mono_cv_uscore=yes],
2054                                 [mono_cv_uscore=no],
2055                         [])
2056                 ])
2057                 if test "x$mono_cv_uscore" = "xyes"; then
2058                         MONO_DL_NEED_USCORE=1
2059                 else
2060                         MONO_DL_NEED_USCORE=0
2061                 fi
2062                 AC_SUBST(MONO_DL_NEED_USCORE)
2063                 AC_CHECK_FUNC(dlerror)
2064         fi
2066         dnl ******************************************************************
2067         dnl *** Checks for the IKVM JNI interface library                  ***
2068         dnl ******************************************************************
2069         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])
2071         ikvm_native_dir=
2072         if test x$with_ikvm_native = xyes; then
2073                 ikvm_native_dir=ikvm-native
2074                 jdk_headers_found="IKVM Native"
2075         fi
2077         AC_SUBST(ikvm_native_dir)
2079         AC_CHECK_HEADERS(execinfo.h)
2081         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2083         AC_CHECK_FUNCS(getgrgid_r)
2084         AC_CHECK_FUNCS(getgrnam_r)
2085         AC_CHECK_FUNCS(getresuid)
2086         AC_CHECK_FUNCS(setresuid)
2087         AC_CHECK_FUNCS(kqueue)
2088         AC_CHECK_FUNCS(backtrace_symbols)
2089         AC_CHECK_FUNCS(mkstemp)
2090         AC_CHECK_FUNCS(mmap)
2091         AC_CHECK_FUNCS(madvise)
2092         AC_CHECK_FUNCS(getrusage)
2093         AC_CHECK_FUNCS(getpriority)
2094         AC_CHECK_FUNCS(setpriority)
2095         AC_CHECK_FUNCS(dl_iterate_phdr)
2096         AC_CHECK_FUNCS(dladdr)
2097         AC_CHECK_FUNCS(sysconf)
2098         AC_CHECK_FUNCS(getrlimit)
2099         AC_CHECK_FUNCS(prctl)
2100         AC_CHECK_FUNCS(arc4random)
2101         AC_CHECK_FUNCS(nl_langinfo)
2103         AC_CHECK_FUNCS(sched_getaffinity)
2104         AC_CHECK_FUNCS(sched_setaffinity)
2105         AC_CHECK_FUNCS(sched_getcpu)
2107         if test x$platform_android != xyes; then
2108                 AC_CHECK_FUNCS(getpwnam_r)
2109                 AC_CHECK_FUNCS(getpwuid_r)
2110         fi
2112         AC_CHECK_FUNCS(readlink)
2113         AC_CHECK_FUNCS(chmod)
2114         AC_CHECK_FUNCS(lstat)
2115         AC_CHECK_FUNCS(getdtablesize)
2117         AC_CHECK_FUNCS(ftruncate)
2118         AC_CHECK_FUNCS(msync)
2120         AC_CHECK_FUNCS(gethostname getpeername)
2121         AC_CHECK_FUNCS(utime utimes)
2123         AC_CHECK_FUNCS(openlog closelog)
2124         AC_CHECK_FUNCS(atexit)
2126         AC_FUNC_STRERROR_R()
2128         dnl ****************************************************************
2129         dnl *** Check for sched_setaffinity from glibc versions before   ***
2130         dnl *** 2.3.4. The older versions of the function only take 2    ***
2131         dnl *** parameters, not 3.                                       ***
2132         dnl ***                                                          ***
2133         dnl *** Because the interface change was not made in a minor     ***
2134         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2135         dnl *** won't always indicate the interface sched_affinity has.  ***
2136         dnl ****************************************************************
2137         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2138         AC_TRY_COMPILE([#include <sched.h>], [
2139             int mask = 1; 
2140             sched_setaffinity(0, &mask);
2141         ], [
2142                 # Yes, we have it...
2143                 AC_MSG_RESULT(yes)
2144                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2145         ], [
2146                 # We have the new, three-parameter version
2147                 AC_MSG_RESULT(no)
2148         ])
2149         AC_TRY_COMPILE([#include <sched.h>], [
2150              CPU_COUNT((void *) 0);
2151         ], [
2152                 AC_MSG_RESULT(yes)
2153                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2154         ], [
2155                 # We have the new, three-parameter version
2156                 AC_MSG_RESULT(no)
2157         ])
2159         dnl ******************************************************************
2160         dnl *** Check for large file support                               ***
2161         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2162         dnl ******************************************************************
2163         
2164         # Check that off_t can represent 2**63 - 1 correctly, working around
2165         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2166         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2167         large_offt=no
2168         AC_DEFUN([LARGE_FILES], [
2169                 large_CPPFLAGS=$CPPFLAGS
2170                 CPPFLAGS="$CPPFLAGS $1"
2171                 AC_TRY_COMPILE([
2172                         #include <sys/types.h>
2173                         #include <limits.h>
2174                 ], [
2175                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2176                         #define COMPILE_TIME_ASSERT(pred) \
2177                                 switch(0){case 0:case pred:;}
2178                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2179                 ], [
2180                         AC_MSG_RESULT(ok)
2181                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2182                         large_CPPFLAGS="$large_CPPFLAGS $1"
2183                         large_offt=yes
2184                 ], [
2185                         AC_MSG_RESULT(no)
2186                 ])
2187                 CPPFLAGS=$large_CPPFLAGS
2188         ])
2190         AC_MSG_CHECKING(if off_t is 64 bits wide)
2191         LARGE_FILES("")
2192         if test $large_offt = no; then
2193                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2194                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2195         fi
2196         if test $large_offt = no; then
2197                 AC_MSG_WARN([No 64 bit file size support available])
2198         fi
2199         
2200         dnl *****************************
2201         dnl *** Checks for libsocket  ***
2202         dnl *****************************
2203         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2205         case "$host" in
2206                 *-*-*freebsd*)
2207                         dnl *****************************
2208                         dnl *** Checks for libinotify ***
2209                         dnl *****************************
2210                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2211         esac
2213         dnl *******************************
2214         dnl *** Checks for MSG_NOSIGNAL ***
2215         dnl *******************************
2216         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2217         AC_TRY_COMPILE([#include <sys/socket.h>], [
2218                 int f = MSG_NOSIGNAL;
2219         ], [
2220                 # Yes, we have it...
2221                 AC_MSG_RESULT(yes)
2222                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2223         ], [
2224                 # We'll have to use signals
2225                 AC_MSG_RESULT(no)
2226         ])
2228         dnl *****************************
2229         dnl *** Checks for IPPROTO_IP ***
2230         dnl *****************************
2231         AC_MSG_CHECKING(for IPPROTO_IP)
2232         AC_TRY_COMPILE([#include <netinet/in.h>], [
2233                 int level = IPPROTO_IP;
2234         ], [
2235                 # Yes, we have it...
2236                 AC_MSG_RESULT(yes)
2237                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2238         ], [
2239                 # We'll have to use getprotobyname
2240                 AC_MSG_RESULT(no)
2241         ])
2243         dnl *******************************
2244         dnl *** Checks for IPPROTO_IPV6 ***
2245         dnl *******************************
2246         AC_MSG_CHECKING(for IPPROTO_IPV6)
2247         AC_TRY_COMPILE([#include <netinet/in.h>], [
2248                 int level = IPPROTO_IPV6;
2249         ], [
2250                 # Yes, we have it...
2251                 AC_MSG_RESULT(yes)
2252                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2253         ], [
2254                 # We'll have to use getprotobyname
2255                 AC_MSG_RESULT(no)
2256         ])
2258         dnl ******************************
2259         dnl *** Checks for IPPROTO_TCP ***
2260         dnl ******************************
2261         AC_MSG_CHECKING(for IPPROTO_TCP)
2262         AC_TRY_COMPILE([#include <netinet/in.h>], [
2263                 int level = IPPROTO_TCP;
2264         ], [
2265                 # Yes, we have it...
2266                 AC_MSG_RESULT(yes)
2267                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2268         ], [
2269                 # We'll have to use getprotobyname
2270                 AC_MSG_RESULT(no)
2271         ])
2273         dnl *****************************
2274         dnl *** Checks for SOL_IP     ***
2275         dnl *****************************
2276         AC_MSG_CHECKING(for SOL_IP)
2277         AC_TRY_COMPILE([#include <netdb.h>], [
2278                 int level = SOL_IP;
2279         ], [
2280                 # Yes, we have it...
2281                 AC_MSG_RESULT(yes)
2282                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2283         ], [
2284                 # We'll have to use getprotobyname
2285                 AC_MSG_RESULT(no)
2286         ])
2288         dnl *****************************
2289         dnl *** Checks for SOL_IPV6     ***
2290         dnl *****************************
2291         AC_MSG_CHECKING(for SOL_IPV6)
2292         AC_TRY_COMPILE([#include <netdb.h>], [
2293                 int level = SOL_IPV6;
2294         ], [
2295                 # Yes, we have it...
2296                 AC_MSG_RESULT(yes)
2297                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2298         ], [
2299                 # We'll have to use getprotobyname
2300                 AC_MSG_RESULT(no)
2301         ])
2303         dnl *****************************
2304         dnl *** Checks for SOL_TCP    ***
2305         dnl *****************************
2306         AC_MSG_CHECKING(for SOL_TCP)
2307         AC_TRY_COMPILE([#include <netdb.h>], [
2308                 int level = SOL_TCP;
2309         ], [
2310                 # Yes, we have it...
2311                 AC_MSG_RESULT(yes)
2312                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2313         ], [
2314                 # We'll have to use getprotobyname
2315                 AC_MSG_RESULT(no)
2316         ])
2318         dnl *****************************
2319         dnl *** Checks for IP_PKTINFO ***
2320         dnl *****************************
2321         AC_MSG_CHECKING(for IP_PKTINFO)
2322         AC_TRY_COMPILE([#include <linux/in.h>], [
2323                 int level = IP_PKTINFO;
2324         ], [
2325                 # Yes, we have it...
2326                 AC_MSG_RESULT(yes)
2327                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2328         ], [
2329                 AC_MSG_RESULT(no)
2330         ])
2332         dnl *****************************
2333         dnl *** Checks for IPV6_PKTINFO ***
2334         dnl *****************************
2335         AC_MSG_CHECKING(for IPV6_PKTINFO)
2336         AC_TRY_COMPILE([#include <netdb.h>], [
2337                 int level = IPV6_PKTINFO;
2338         ], [
2339                 # Yes, we have it...
2340                 AC_MSG_RESULT(yes)
2341                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2342         ], [
2343                 AC_MSG_RESULT(no)
2344         ])
2346         dnl **********************************
2347         dnl *** Checks for IP_DONTFRAG     ***
2348         dnl **********************************
2349         AC_MSG_CHECKING(for IP_DONTFRAG)
2350         AC_TRY_COMPILE([#include <netinet/in.h>], [
2351                 int level = IP_DONTFRAG;
2352         ], [
2353                 # Yes, we have it...
2354                 AC_MSG_RESULT(yes)
2355                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2356         ], [
2357                 AC_MSG_RESULT(no)
2358         ])
2360         dnl **********************************
2361         dnl *** Checks for IP_DONTFRAGMENT ***
2362         dnl **********************************
2363         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2364         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2365                 int level = IP_DONTFRAGMENT;
2366         ], [
2367                 # Yes, we have it...
2368                 AC_MSG_RESULT(yes)
2369                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2370         ], [
2371                 AC_MSG_RESULT(no)
2372         ])
2374         dnl **********************************
2375         dnl *** Checks for IP_MTU_DISCOVER ***
2376         dnl **********************************
2377         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2378         AC_TRY_COMPILE([#include <linux/in.h>], [
2379                 int level = IP_MTU_DISCOVER;
2380         ], [
2381                 # Yes, we have it...
2382                 AC_MSG_RESULT(yes)
2383                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2384         ], [
2385                 AC_MSG_RESULT(no)
2386         ])
2388         dnl **********************************
2389         dnl *** Checks for  IP_PMTUDISC_DO ***
2390         dnl **********************************
2391         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2392         AC_TRY_COMPILE([#include <linux/in.h>], [
2393                 int level = IP_PMTUDISC_DO;
2394         ], [
2395                 # Yes, we have it...
2396                 AC_MSG_RESULT(yes)
2397                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2398         ], [
2399                 AC_MSG_RESULT(no)
2400         ])
2402         dnl *********************************
2403         dnl *** Check for struct ip_mreqn ***
2404         dnl *********************************
2405         AC_MSG_CHECKING(for struct ip_mreqn)
2406         AC_TRY_COMPILE([#include <netinet/in.h>], [
2407                 struct ip_mreqn mreq;
2408                 mreq.imr_address.s_addr = 0;
2409         ], [
2410                 # Yes, we have it...
2411                 AC_MSG_RESULT(yes)
2412                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2413         ], [
2414                 # We'll just have to try and use struct ip_mreq
2415                 AC_MSG_RESULT(no)
2416                 AC_MSG_CHECKING(for struct ip_mreq)
2417                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2418                         struct ip_mreq mreq;
2419                         mreq.imr_interface.s_addr = 0;
2420                 ], [
2421                         # Yes, we have it...
2422                         AC_MSG_RESULT(yes)
2423                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2424                 ], [
2425                         # No multicast support
2426                         AC_MSG_RESULT(no)
2427                 ])
2428         ])
2429         
2430         dnl **********************************
2431         dnl *** Check for getaddrinfo ***
2432         dnl **********************************
2433         AC_MSG_CHECKING(for getaddrinfo)
2434                 AC_TRY_LINK([
2435                 #include <stdio.h>
2436                 #include <netdb.h>
2437         ], [
2438                 getaddrinfo(NULL,NULL,NULL,NULL);
2439         ], [
2440                 # Yes, we have it...
2441                 AC_MSG_RESULT(yes)
2442                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2443         ], [
2444                 AC_MSG_RESULT(no)
2445         ])
2447         dnl **********************************
2448         dnl *** Check for gethostbyname2_r ***
2449         dnl **********************************
2450         AC_MSG_CHECKING(for gethostbyname2_r)
2451                 AC_TRY_LINK([
2452                 #include <stdio.h>
2453                 #include <netdb.h>
2454         ], [
2456                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2457         ], [
2458                 # Yes, we have it...
2459                 AC_MSG_RESULT(yes)
2460                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2461         ], [
2462                 AC_MSG_RESULT(no)
2463         ])
2465         dnl **********************************
2466         dnl *** Check for gethostbyname2 ***
2467         dnl **********************************
2468         AC_MSG_CHECKING(for gethostbyname2)
2469                 AC_TRY_LINK([
2470                 #include <stdio.h>
2471                 #include <netdb.h>
2472         ], [
2473                 gethostbyname2(NULL,0);
2474         ], [
2475                 # Yes, we have it...
2476                 AC_MSG_RESULT(yes)
2477                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2478         ], [
2479                 AC_MSG_RESULT(no)
2480         ])
2482         dnl **********************************
2483         dnl *** Check for gethostbyname ***
2484         dnl **********************************
2485         AC_MSG_CHECKING(for gethostbyname)
2486                 AC_TRY_LINK([
2487                 #include <stdio.h>
2488                 #include <netdb.h>
2489         ], [
2490                 gethostbyname(NULL);
2491         ], [
2492                 # Yes, we have it...
2493                 AC_MSG_RESULT(yes)
2494                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2495         ], [
2496                 AC_MSG_RESULT(no)
2497         ])
2499         dnl **********************************
2500         dnl *** Check for getprotobyname ***
2501         dnl **********************************
2502         AC_MSG_CHECKING(for getprotobyname)
2503                 AC_TRY_LINK([
2504                 #include <stdio.h>
2505                 #include <netdb.h>
2506         ], [
2507                 getprotobyname(NULL);
2508         ], [
2509                 # Yes, we have it...
2510                 AC_MSG_RESULT(yes)
2511                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2512         ], [
2513                 AC_MSG_RESULT(no)
2514         ])
2516         dnl **********************************
2517         dnl *** Check for getprotobyname_r ***
2518         dnl **********************************
2519         AC_MSG_CHECKING(for getprotobyname_r)
2520                 AC_TRY_LINK([
2521                 #include <stdio.h>
2522                 #include <netdb.h>
2523         ], [
2524                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2525         ], [
2526                 # Yes, we have it...
2527                 AC_MSG_RESULT(yes)
2528                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2529         ], [
2530                 AC_MSG_RESULT(no)
2531         ])
2533         dnl **********************************
2534         dnl *** Check for getnameinfo ***
2535         dnl **********************************
2536         AC_MSG_CHECKING(for getnameinfo)
2537                 AC_TRY_LINK([
2538                 #include <stdio.h>
2539                 #include <netdb.h>
2540         ], [
2541                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2542         ], [
2543                 # Yes, we have it...
2544                 AC_MSG_RESULT(yes)
2545                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2546         ], [
2547                 AC_MSG_RESULT(no)
2548         ])
2551         dnl **********************************
2552         dnl *** Check for inet_ntop ***
2553         dnl **********************************
2554         AC_MSG_CHECKING(for inet_ntop)
2555                 AC_TRY_LINK([
2556                 #include <stdio.h>
2557                 #include <arpa/inet.h>
2558         ], [
2559                 inet_ntop (0, NULL, NULL, 0);
2560         ], [
2561                 # Yes, we have it...
2562                 AC_MSG_RESULT(yes)
2563                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2564         ], [
2565                 AC_MSG_RESULT(no)
2566         ])
2568         dnl *****************************
2569         dnl *** Checks for libnsl     ***
2570         dnl *****************************
2571         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2573         AC_CHECK_FUNCS(inet_pton inet_aton)
2575         dnl *****************************
2576         dnl *** Checks for libxnet    ***
2577         dnl *****************************
2578         case "${host}" in
2579                 *solaris* )
2580                         AC_MSG_CHECKING(for Solaris XPG4 support)
2581                         if test -f /usr/lib/libxnet.so; then
2582                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2583                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2584                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2585                                 LIBS="$LIBS -lxnet"
2586                                 AC_MSG_RESULT(yes)
2587                         else
2588                                 AC_MSG_RESULT(no)
2589                         fi
2591                         if test "$GCC" = "yes"; then
2592                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2593                         fi
2594                 ;;
2595         esac
2597         dnl *****************************
2598         dnl *** Checks for libpthread ***
2599         dnl *****************************
2600 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2601 # and libpthread does not exist
2603         case "${host}" in
2604                 *-*-*haiku*)
2605                         dnl Haiku has pthread in libroot (libc equiv)
2606                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2607                 ;;
2608                 *-*-*freebsd*)
2609                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2610                 ;;
2611                 *-*-*openbsd*)
2612                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2613                 ;;
2614                 *)
2615                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2616                 ;;
2617         esac
2618         AC_CHECK_HEADERS(pthread.h)
2619         AC_CHECK_HEADERS(pthread_np.h)
2620         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2621         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2622         AC_CHECK_FUNCS(pthread_kill)
2623         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2624         AC_TRY_COMPILE([ #include <pthread.h>], [
2625                 pthread_mutexattr_t attr;
2626                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2627         ], [
2628                 AC_MSG_RESULT(ok)
2629         ], [
2630                 AC_MSG_RESULT(no)
2631                 AC_ERROR(Posix system lacks support for recursive mutexes)
2632         ])
2633         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2634         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2635         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2636         AC_CHECK_FUNCS(mincore mlock munlock)
2638         dnl ***********************************
2639         dnl *** Checks for working __thread ***
2640         dnl ***********************************
2641         AC_MSG_CHECKING(for working __thread)
2642         if test "x$with_tls" != "x__thread"; then
2643                 AC_MSG_RESULT(disabled)
2644         elif test "x$cross_compiling" = "xyes"; then
2645                 AC_MSG_RESULT(cross compiling, assuming yes)
2646         else
2647                 AC_TRY_RUN([
2648                         #if defined(__APPLE__) && defined(__clang__)
2649                         #error "__thread does not currently work with clang on Mac OS X"
2650                         #endif
2651                         
2652                         #include <unistd.h>
2653                         #include <pthread.h>
2654                         __thread int i;
2655                         static int res1, res2;
2657                         void thread_main (void *arg)
2658                         {
2659                                 i = arg;
2660                                 sleep (1);
2661                                 if (arg == 1)
2662                                         res1 = (i == arg);
2663                                 else
2664                                         res2 = (i == arg);
2665                         }
2667                         int main () {
2668                                 pthread_t t1, t2;
2670                                 i = 5;
2672                                 pthread_create (&t1, NULL, thread_main, 1);
2673                                 pthread_create (&t2, NULL, thread_main, 2);
2675                                 pthread_join (t1, NULL);
2676                                 pthread_join (t2, NULL);
2678                                 return !(res1 + res2 == 2);
2679                         }
2680                 ], [
2681                                 AC_MSG_RESULT(yes)
2682                 ], [
2683                                 AC_MSG_RESULT(no)
2684                                 with_tls=pthread
2685                 ])
2686         fi
2688         dnl **************************************
2689         dnl *** Checks for working sigaltstack ***
2690         dnl **************************************
2691         AC_MSG_CHECKING(for working sigaltstack)
2692         if test "x$with_sigaltstack" != "xyes"; then
2693                 AC_MSG_RESULT(disabled)
2694         elif test "x$cross_compiling" = "xyes"; then
2695                 AC_MSG_RESULT(cross compiling, assuming no)
2696                 with_sigaltstack=no
2697         else
2698                 AC_TRY_RUN([
2699                         #include <stdio.h>
2700                         #include <stdlib.h>
2701                         #include <unistd.h>
2702                         #include <signal.h>
2703                         #include <pthread.h>
2704                         #include <sys/wait.h>
2705                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2706                         #define SA_STACK SA_ONSTACK
2707                         #endif
2708                         static void
2709                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2710                         {
2711                                 exit (0);
2712                         }
2714                         volatile char*__ptr = NULL;
2715                         static void *
2716                         loop (void *ignored)
2717                         {
2718                                 *__ptr = 0;
2719                                 return NULL;
2720                         }
2722                         static void
2723                         child ()
2724                         {
2725                                 struct sigaction sa;
2726                                 stack_t sas;
2727                                 pthread_t id;
2728                                 pthread_attr_t attr;
2730                                 sa.sa_sigaction = sigsegv_signal_handler;
2731                                 sigemptyset (&sa.sa_mask);
2732                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2733                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2734                                         perror ("sigaction");
2735                                         return;
2736                                 }
2738                                 /* x86 darwin deliver segfaults using SIGBUS */
2739                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2740                                         perror ("sigaction");
2741                                         return;
2742                                 }
2743                                 sas.ss_sp = malloc (SIGSTKSZ);
2744                                 sas.ss_size = SIGSTKSZ;
2745                                 sas.ss_flags = 0;
2746                                 if (sigaltstack (&sas, NULL) == -1) {
2747                                         perror ("sigaltstack");
2748                                         return;
2749                                 }
2751                                 pthread_attr_init (&attr);
2752                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2753                                         printf ("pthread_create\n");
2754                                         return;
2755                                 }
2757                                 sleep (100);
2758                         }
2760                         int
2761                         main ()
2762                         {
2763                                 pid_t son;
2764                                 int status;
2765                                 int i;
2767                                 son = fork ();
2768                                 if (son == -1) {
2769                                         return 1;
2770                                 }
2772                                 if (son == 0) {
2773                                         child ();
2774                                         return 0;
2775                                 }
2777                                 for (i = 0; i < 300; ++i) {
2778                                         waitpid (son, &status, WNOHANG);
2779                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2780                                                 return 0;
2781                                         usleep (10000);
2782                                 }
2784                                 kill (son, SIGKILL);
2785                                 return 1;
2786                         }
2788                 ], [
2789                                 AC_MSG_RESULT(yes)
2790                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2791                 ], [
2792                                 with_sigaltstack=no
2793                                 AC_MSG_RESULT(no)
2794                 ])
2795         fi
2797         dnl ********************************
2798         dnl *** Checks for semaphore lib ***
2799         dnl ********************************
2800         # 'Real Time' functions on Solaris
2801         # posix4 on Solaris 2.6
2802         # pthread (first!) on Linux
2803         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2805         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2806         AC_CHECK_FUNCS(shm_open)
2808         dnl ********************************
2809         dnl *** Checks for timezone stuff **
2810         dnl ********************************
2811         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2812                 AC_TRY_COMPILE([
2813                         #include <time.h>
2814                         ], [
2815                         struct tm tm;
2816                         tm.tm_gmtoff = 1;
2817                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2818         if test $ac_cv_struct_tm_gmtoff = yes; then
2819                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2820         else
2821                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2822                         AC_TRY_COMPILE([
2823                                 #include <time.h>
2824                         ], [
2825                                 timezone = 1;
2826                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2827                 if test $ac_cv_var_timezone = yes; then
2828                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2829                 else
2830                         AC_ERROR(unable to find a way to determine timezone)
2831                 fi
2832         fi
2834         dnl *********************************
2835         dnl *** Checks for math functions ***
2836         dnl *********************************
2837         AC_SEARCH_LIBS(sqrtf, m)
2839         dnl ****************************************************************
2840         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2841         dnl *** have it in the library (duh))                            ***
2842         dnl ****************************************************************
2843         AC_CHECK_FUNCS(poll)
2845         dnl **********************************
2846         dnl *** epoll                      ***
2847         dnl **********************************
2848         AC_CHECK_HEADERS(sys/epoll.h)
2849         haveepoll=no
2850         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2851         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2852                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2853         fi
2855         havekqueue=no
2857         AC_CHECK_HEADERS(sys/event.h)
2858         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2860         dnl **************************************
2861         dnl * Darwin has a race that prevents us from using reliably:
2862         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2863         dnl * Since kqueue is mostly used for scaling large web servers, 
2864         dnl * and very few folks run Mono on large web servers on OSX, falling
2865         dnl * back 
2866         dnl **************************************
2867         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2868                 if test "x$host_darwin" = "xno"; then
2869                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2870                 fi
2871         fi
2873         dnl ******************************
2874         dnl *** Checks for SIOCGIFCONF ***
2875         dnl ******************************
2876         AC_CHECK_HEADERS(sys/ioctl.h)
2877         AC_CHECK_HEADERS(net/if.h, [], [],
2878            [
2879            #ifdef HAVE_SYS_TYPES_H
2880            # include <sys/types.h>
2881            #endif
2882            #ifdef HAVE_SYS_SOCKET_H
2883            # include <sys/socket.h>
2884            #endif
2885            ])
2886         AC_MSG_CHECKING(for ifreq)
2887         AC_TRY_COMPILE([
2888                 #include <stdio.h>
2889                 #include <sys/ioctl.h>
2890                 #include <net/if.h>
2891                 ], [
2892                 struct ifconf ifc;
2893                 struct ifreq *ifr;
2894                 void *x;
2895                 ifc.ifc_len = 0;
2896                 ifc.ifc_buf = NULL;
2897                 x = (void *) &ifr->ifr_addr;
2898                 ],[
2899                         AC_MSG_RESULT(yes)
2900                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2901                 ], [
2902                         AC_MSG_RESULT(no)
2903                 ])
2904         dnl **********************************
2905         dnl ***     Checks for sin_len     ***
2906         dnl **********************************
2907         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2908         AC_TRY_COMPILE([
2909                 #include <netinet/in.h>
2910                 ], [
2911                 struct sockaddr_in saddr;
2912                 saddr.sin_len = sizeof (saddr);
2913                 ],[
2914                         AC_MSG_RESULT(yes)
2915                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2916                 ], [
2917                         AC_MSG_RESULT(no)
2918                 ])      
2919         dnl **********************************
2920         dnl ***    Checks for sin6_len     ***
2921         dnl **********************************
2922         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2923         AC_TRY_COMPILE([
2924                 #include <netinet/in.h>
2925                 ], [
2926                 struct sockaddr_in6 saddr6;
2927                 saddr6.sin6_len = sizeof (saddr6);
2928                 ],[
2929                         AC_MSG_RESULT(yes)
2930                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2931                 ], [
2932                         AC_MSG_RESULT(no)
2933                 ])
2934         dnl **********************************
2935         dnl *** Check for getifaddrs       ***
2936         dnl **********************************
2937         AC_MSG_CHECKING(for getifaddrs)
2938                 AC_TRY_LINK([
2939                 #include <stdio.h>
2940                 #include <sys/types.h>
2941                 #include <sys/socket.h>
2942                 #ifdef HAVE_NET_IF_H
2943                 #include <net/if.h>
2944                 #endif
2945                 #include <ifaddrs.h>
2946         ], [
2947                 getifaddrs(NULL);
2948         ], [
2949                 # Yes, we have it...
2950                 AC_MSG_RESULT(yes)
2951                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2952         ], [
2953                 AC_MSG_RESULT(no)
2954         ])
2955         dnl **********************************
2956         dnl *** Check for if_nametoindex   ***
2957         dnl **********************************
2958         AC_MSG_CHECKING(for if_nametoindex)
2959                 AC_TRY_LINK([
2960                 #include <stdio.h>
2961                 #include <sys/types.h>
2962                 #include <sys/socket.h>
2963                 #include <net/if.h>
2964         ], [
2965                 if_nametoindex(NULL);
2966         ], [
2967                 # Yes, we have it...
2968                 AC_MSG_RESULT(yes)
2969                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2970         ], [
2971                 AC_MSG_RESULT(no)
2972         ])
2973         dnl **********************************
2974         dnl *** Check for access ***
2975         dnl **********************************
2976         AC_MSG_CHECKING(for access)
2977                 AC_TRY_LINK([
2978                 #include <unistd.h>
2979         ], [
2980                 access(NULL,0);
2981         ], [
2982                 # Yes, we have it...
2983                 AC_MSG_RESULT(yes)
2984                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2985         ], [
2986                 AC_MSG_RESULT(no)
2987         ])
2988                         
2989         dnl **********************************
2990         dnl *** Checks for proclib         ***
2991         dnl **********************************
2992         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.)])
2993         dnl **********************************
2994         dnl *** Checks for MonoPosixHelper ***
2995         dnl **********************************
2996         AC_CHECK_HEADERS(checklist.h)
2997         AC_CHECK_HEADERS(pathconf.h)
2998         AC_CHECK_HEADERS(fstab.h)
2999         AC_CHECK_HEADERS(attr/xattr.h)
3000         AC_CHECK_HEADERS(sys/extattr.h)
3001         AC_CHECK_HEADERS(sys/sendfile.h)
3002         AC_CHECK_HEADERS(sys/statvfs.h)
3003         AC_CHECK_HEADERS(sys/statfs.h)
3004         AC_CHECK_HEADERS(sys/vfstab.h)
3005         AC_CHECK_HEADERS(sys/xattr.h)
3006         AC_CHECK_HEADERS(sys/mman.h)
3007         AC_CHECK_HEADERS(sys/param.h)
3008         AC_CHECK_HEADERS(sys/mount.h, [], [],
3009                 [
3010                 #ifdef HAVE_SYS_PARAM_H
3011                 # include <sys/param.h>
3012                 #endif
3013                 ])
3014         AC_CHECK_HEADERS(sys/mount.h)
3015         AC_CHECK_FUNCS(confstr)
3016         AC_CHECK_FUNCS(seekdir telldir)
3017         AC_CHECK_FUNCS(getdomainname)
3018         AC_CHECK_FUNCS(setdomainname)
3019         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
3020         AC_CHECK_FUNCS(setgroups)
3021         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
3022         AC_CHECK_FUNCS(getfsstat)
3023         AC_CHECK_FUNCS(lutimes futimes)
3024         AC_CHECK_FUNCS(mremap)
3025         AC_CHECK_FUNCS(remap_file_pages)
3026         AC_CHECK_FUNCS(posix_fadvise)
3027         AC_CHECK_FUNCS(posix_fallocate)
3028         AC_CHECK_FUNCS(posix_madvise)
3029         AC_CHECK_FUNCS(vsnprintf)
3030         AC_CHECK_FUNCS(sendfile)
3031         AC_CHECK_FUNCS(gethostid sethostid)
3032         AC_CHECK_FUNCS(sethostname)
3033         AC_CHECK_FUNCS(statfs)
3034         AC_CHECK_FUNCS(fstatfs)
3035         AC_CHECK_FUNCS(statvfs)
3036         AC_CHECK_FUNCS(fstatvfs)
3037         AC_CHECK_FUNCS(stime)
3038         AC_CHECK_FUNCS(ttyname_r)
3039         AC_CHECK_FUNCS(psignal)
3040         AC_CHECK_FUNCS(getlogin_r)
3041         AC_CHECK_FUNCS(lockf)
3042         AC_CHECK_FUNCS(swab)
3043         AC_CHECK_FUNCS(setusershell endusershell)
3044         AC_CHECK_FUNCS(futimens utimensat)
3045         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
3046         AC_CHECK_FUNCS(readv writev preadv pwritev)
3047         AC_CHECK_FUNCS(setpgid)
3048         AC_CHECK_FUNCS(system)
3049         AC_CHECK_FUNCS(fork execv execve)
3050         AC_CHECK_FUNCS(waitpid)
3051         AC_CHECK_FUNCS(accept4)
3052         AC_CHECK_FUNCS(localtime_r)
3053         AC_CHECK_FUNCS(mkdtemp)
3054         AC_CHECK_SIZEOF(size_t)
3055         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
3056                 [#include <sys/types.h>
3057                  #include <sys/stat.h>
3058                  #include <unistd.h>])
3059         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
3060                 [#include <sys/types.h>
3061                  #include <sys/stat.h>
3062                  #include <unistd.h>])
3063         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
3064                 [#include <sys/time.h>])
3065         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
3066                 [#include <sys/socket.h>])
3067         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
3068                 [#include <unistd.h>
3069                  #include <fcntl.h>])
3070         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
3071                 [#include <sys/uio.h>])
3072         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
3073                 [#include <sys/socket.h>])
3074         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3075                 [#include <sys/poll.h>])
3076         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3077                 [#include <sys/socket.h>])
3078         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3079                 [#include <sys/socket.h>])
3080         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3081                 [#include <netinet/in.h>])
3082         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3083                 [#include <netinet/in.h>])
3084         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3085                 [#include <sys/un.h>])
3086         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3087                 [#include <sys/types.h>
3088                  #include <sys/stat.h>
3089                  #include <unistd.h>])
3090         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3091                 [#include <time.h>])
3092         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3093                 [#include <sys/time.h>
3094                  #include <sys/types.h>
3095                  #include <utime.h>])
3096         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3097                 [#include <sys/time.h>])
3098         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3099                 [#include <sys/types.h>
3100                  #include <utime.h>])
3101         AC_CHECK_MEMBERS(
3102                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3103                 [#include <sys/types.h>
3104                  #include <dirent.h>])
3105         AC_CHECK_MEMBERS(
3106                 [struct passwd.pw_gecos],,, 
3107                 [#include <sys/types.h>
3108                  #include <pwd.h>])
3109         AC_CHECK_MEMBERS(
3110                 [struct statfs.f_flags],,, 
3111                 [#include <sys/types.h>
3112                  #include <sys/vfs.h>])
3113         AC_CHECK_MEMBERS(
3114                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3115                 [#include <sys/types.h>
3116                  #include <sys/stat.h>
3117                  #include <unistd.h>])
3119         dnl Favour xattr through glibc, but use libattr if we have to
3120         AC_CHECK_FUNC(lsetxattr, ,
3121                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3122         )
3123         AC_SUBST(XATTR_LIB)
3125         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3126         AC_CHECK_MEMBERS(
3127                 [struct kinfo_proc.kp_proc],,, 
3128                 [#include <sys/types.h>
3129                  #include <sys/param.h>
3130                  #include <sys/sysctl.h>
3131                  #include <sys/proc.h>
3132                  ])
3134         dnl *********************************
3135         dnl *** Checks for Windows compilation ***
3136         dnl *********************************
3137         AC_CHECK_HEADERS(sys/time.h)
3138         AC_CHECK_HEADERS(sys/param.h)
3139         AC_CHECK_HEADERS(dirent.h)
3141         dnl ******************************************
3142         dnl *** Checks for OSX and iOS compilation ***
3143         dnl ******************************************
3144         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3146         dnl *********************************
3147         dnl *** Check for Console 2.0 I/O ***
3148         dnl *********************************
3149         AC_CHECK_HEADERS([curses.h])
3150         AC_CHECK_HEADERS([term.h], [], [],
3151         [#if HAVE_CURSES_H
3152          #include <curses.h>
3153          #endif
3154         ])
3155         AC_CHECK_HEADERS([termios.h])
3157         dnl *********************************
3158         dnl *** Checks for random         ***
3159         dnl *********************************
3160         if test x$host_darwin = xno; then
3161                 AC_CHECK_HEADERS(sys/random.h)
3162                 AC_CHECK_FUNCS(getrandom getentropy)
3163         fi
3165         dnl *********************************
3166         dnl *** Checks for Mono.Native    ***
3167         dnl *********************************
3169         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3170         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3172         AC_MSG_CHECKING(for linux/in.h)
3173         AC_TRY_COMPILE([
3174                 #include <sys/socket.h>
3175                 #include <linux/in.h>
3176         ], [
3177         ],[
3178                 AC_MSG_RESULT(yes)
3179                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3180         ], [
3181                 AC_MSG_RESULT(no)
3182         ])
3184         AC_CHECK_HEADERS([linux/if_packet.h])
3186         AC_MSG_CHECKING(for struct in_pktinfo)
3187         AC_TRY_COMPILE([
3188                 #ifdef HAVE_LINUX_IN_H
3189                 #include <sys/socket.h>
3190                 #include <linux/in.h>
3191                 #else
3192                 #include <netinet/in.h>
3193                 #endif
3194         ], [
3195                 struct in_pktinfo pktinfo;
3196         ],[
3197                 AC_MSG_RESULT(yes)
3198                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3199         ], [
3200                 AC_MSG_RESULT(no)
3201         ])
3203         AC_MSG_CHECKING(for struct ip_mreqn)
3204         AC_TRY_COMPILE([
3205                 #if HAVE_LINUX_IN_H
3206                 #include <sys/socket.h>
3207                 #include <linux/in.h>
3208                 #else
3209                 #include <netinet/in.h>
3210                 #endif
3211         ], [
3212                 struct ip_mreqn mreqn;
3213         ],[
3214                 AC_MSG_RESULT(yes)
3215                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3216         ], [
3217                 AC_MSG_RESULT(no)
3218         ])
3220         if test x$host_darwin = xno; then
3221                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3222         fi
3224         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3225         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3227         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3229         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3230         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3231         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3232         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3234         if test "x$mono_native_platform_ios" = "xno"; then
3235                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3236                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3237                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3238         fi
3240         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3241         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3242         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3243         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3244         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_ADVISE, 1, [posix_fadvise])]) # the define is called HAVE_POSIX_ADVISE in corefx, not a typo
3245         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3246         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3247         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3249         if test "x$platform_android" != "xyes"; then
3250                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3251         fi
3253         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3254         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3255         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3256         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3257         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3258         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3260         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>]])
3261         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>]])
3262         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>]])
3263         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>]])
3264         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3265         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3266         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3268         AC_MSG_CHECKING(for struct statfs)
3269         AC_TRY_COMPILE([
3270                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3271                 #include <sys/mount.h>
3272                 #else
3273                 #include <sys/statfs.h>
3274                 #endif
3275         ], [
3276                 struct statfs;
3277         ],[
3278                 AC_MSG_RESULT(yes)
3279                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3280         ], [
3281                 AC_MSG_RESULT(no)
3282         ])
3284         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3285                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3286         fi
3288         AC_MSG_CHECKING(for readdir_r)
3289         AC_TRY_LINK([
3290                 #include <dirent.h>
3291         ], [
3292                 DIR* dir;
3293                 struct dirent* entry;
3294                 struct dirent* result;
3295                 readdir_r(dir, entry, &result);
3296         ],[
3297                 AC_MSG_RESULT(yes)
3298                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3299         ], [
3300                 AC_MSG_RESULT(no)
3301         ])
3303         AC_MSG_CHECKING(for kevent with void *data)
3304         AC_TRY_LINK([
3305                 #include <sys/types.h>
3306                 #include <sys/event.h>
3307         ], [
3308                 struct kevent event;
3309                 void* data;
3310                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3311         ],[
3312                 AC_MSG_RESULT(yes)
3313                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3314         ], [
3315                 AC_MSG_RESULT(no)
3316         ])
3318         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3319         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3321         AC_MSG_CHECKING(for sendfile with 4 arguments)
3322         AC_TRY_LINK([
3323                 #include <sys/sendfile.h>
3324         ], [
3325                 #if defined(TARGET_ANDROID)
3326                 #if !defined(__ANDROID_API__)
3327                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3328                 #elif __ANDROID_API__ < 21
3329                 #error sendfile is not supported on this Android API level
3330                 #endif
3331                 #endif
3333                 int result = sendfile(0, 0, 0, 0);
3334         ],[
3335                 AC_MSG_RESULT(yes)
3336                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3337         ], [
3338                 AC_MSG_RESULT(no)
3339         ])
3341         ORIG_CFLAGS="$CFLAGS"
3342         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3344         AC_MSG_CHECKING(for sendfile with 6 arguments)
3345         AC_TRY_LINK([
3346                 #include <stdlib.h>
3347                 #include <sys/types.h>
3348                 #include <sys/socket.h>
3349                 #include <sys/uio.h>
3350         ], [
3351                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3352         ],[
3353                 AC_MSG_RESULT(yes)
3354                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3355         ], [
3356                 AC_MSG_RESULT(no)
3357         ])
3359         CFLAGS="$ORIG_CFLAGS"
3361         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3362         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3363         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3364         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3366         ORIG_CFLAGS="$CFLAGS"
3367         CFLAGS="$CFLAGS -Werror=sign-conversion"
3369         AC_MSG_CHECKING(for getnameinfo with signed flags)
3370         AC_TRY_LINK([
3371                 #include <sys/types.h>
3372                 #include <netdb.h>
3373         ], [
3374                 const struct sockaddr *addr;
3375                 socklen_t addrlen;
3376                 char *host;
3377                 socklen_t hostlen;
3378                 char *serv;
3379                 socklen_t servlen;
3380                 int flags;
3381                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3382         ],[
3383                 AC_MSG_RESULT(yes)
3384                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3385         ], [
3386                 AC_MSG_RESULT(no)
3387         ])
3389         CFLAGS="$ORIG_CFLAGS"
3391         if test "x$host_linux" = "xyes"; then
3392                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3393         else
3394                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3395         fi
3397         # HAVE_CLOCK_MONOTONIC check already done above
3398         # HAVE_CLOCK_REALTIME check already done above
3399         # HAVE_MACH_ABSOLUTE_TIME check already done above
3400         # HAVE_MACH_TIMEBASE_INFO check already done above
3401         # HAVE_FUTIMES check already done above
3402         # HAVE_FUTIMENS check already done above
3404         ORIG_CFLAGS="$CFLAGS"
3405         CFLAGS="$CFLAGS -Werror=sign-conversion"
3407         AC_MSG_CHECKING(for bind with unsigned addrlen)
3408         AC_TRY_LINK([
3409                 #include <sys/socket.h>
3410         ], [
3411                 int fd;
3412                 struct sockaddr* addr;
3413                 socklen_t addrLen;
3414                 bind(fd, addr, addrLen);
3415         ],[
3416                 AC_MSG_RESULT(yes)
3417                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3418         ], [
3419                 AC_MSG_RESULT(no)
3420         ])
3422         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3423         AC_TRY_LINK([
3424                 #include <netinet/in.h>
3425                 #include <netinet/tcp.h>
3426         ], [
3427                 struct ipv6_mreq opt;
3428                 unsigned int index = 0;
3429                 opt.ipv6mr_interface = index;
3430         ],[
3431                 AC_MSG_RESULT(yes)
3432                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3433         ], [
3434                 AC_MSG_RESULT(no)
3435         ])
3437         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3438         AC_TRY_LINK([
3439                 #include <sys/inotify.h>
3440         ], [
3441                 intptr_t fd;
3442                 uint32_t wd;
3443                 int result = inotify_rm_watch(fd, wd);
3444         ],[
3445                 AC_MSG_RESULT(yes)
3446                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3447         ], [
3448                 AC_MSG_RESULT(no)
3449         ])
3451         CFLAGS="$ORIG_CFLAGS"
3453         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3454         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3455                 AC_MSG_RESULT(no)
3456         elif test "x$cross_compiling" = "xyes"; then
3457                 AC_MSG_RESULT(cross compiling, assuming yes)
3458                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3459         else
3460                 AC_TRY_RUN([
3461                         #include <sys/mman.h>
3462                         #include <fcntl.h>
3463                         #include <unistd.h>
3465                         int main ()
3466                         {
3467                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3468                                 if (fd == -1)
3469                                         return -1;
3471                                 shm_unlink("/mono_configure_shm_open");
3473                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3474                                 //       on at least the current version of Mac OS X
3476                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3477                                         return -1;
3479                                 return 0;
3480                         }
3481                 ],[
3482                         AC_MSG_RESULT(yes)
3483                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3484                 ], [
3485                         AC_MSG_RESULT(no)
3486                 ])
3487         fi
3489         AC_MSG_CHECKING(for getpriority with int who)
3490         AC_TRY_LINK([
3491                 #include <sys/resource.h>
3492         ], [
3493                 int which;
3494                 int who;
3495                 int result = getpriority(which, who);
3496         ],[
3497                 AC_MSG_RESULT(yes)
3498                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3499         ], [
3500                 AC_MSG_RESULT(no)
3501         ])
3503         AC_MSG_CHECKING(for kevent with int parameters)
3504         AC_TRY_LINK([
3505                 #include <sys/types.h>
3506                 #include <sys/event.h>
3507         ], [
3508                 int kg;
3509                 const struct kevent* chagelist;
3510                 int nchanges;
3511                 struct kevent* eventlist;
3512                 int nevents;
3513                 const struct timespec* timeout;
3514                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3515         ],[
3516                 AC_MSG_RESULT(yes)
3517                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3518         ], [
3519                 AC_MSG_RESULT(no)
3520         ])
3522         AC_CHECK_FUNCS(mkstemps)
3523         # AC_CHECK_FUNCS(mkstemp) # already done above
3525         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3526                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3527         fi
3529         AC_MSG_CHECKING(for tcp/var.h)
3530         AC_TRY_LINK([
3531                 #include <sys/types.h>
3532                 #include <sys/socketvar.h>
3533                 #include <netinet/ip.h>
3534                 #include <netinet/tcp.h>
3535                 #include <netinet/tcp_var.h>
3536         ], [
3537         ],[
3538                 AC_MSG_RESULT(yes)
3539                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3540         ], [
3541                 AC_MSG_RESULT(no)
3542         ])
3544         AC_CHECK_HEADERS([sys/cdefs.h])
3546         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3547         AC_TRY_LINK([
3548                 #ifdef HAVE_SYS_CDEFS_H
3549                 #include <sys/cdefs.h>
3550                 #endif
3551                 #include <netinet/tcp.h>
3552         ], [
3553                 int result = TCP_ESTABLISHED;
3554         ],[
3555                 AC_MSG_RESULT(yes)
3556                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3557         ], [
3558                 AC_MSG_RESULT(no)
3559         ])
3561         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3563         AC_MSG_CHECKING(for struct rt_msghdr)
3564         AC_TRY_COMPILE([
3565                 #include <sys/types.h>
3566                 #include <net/route.h>
3567         ], [
3568                 struct rt_msghdr;
3569         ],[
3570                 AC_MSG_RESULT(yes)
3571                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3572         ], [
3573                 AC_MSG_RESULT(no)
3574         ])
3576         AC_CHECK_HEADERS([sys/sysctl.h])
3577         AC_CHECK_HEADERS([linux/rtnetlink.h])
3579         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3580         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3581         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3583         ORIG_CFLAGS="$CFLAGS"
3584         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3586         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3587         AC_TRY_LINK([
3588                 #include <unistd.h>
3589         ], [
3590                 size_t namelen = 20;
3591                 char name[20];
3592                 int result = getdomainname(name, namelen);
3593         ],[
3594                 AC_MSG_RESULT(yes)
3595                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3596         ], [
3597                 AC_MSG_RESULT(no)
3598         ])
3600         CFLAGS="$ORIG_CFLAGS"
3602         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3603         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3604         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3606         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
3607                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3608         elif test "x$host_linux" = "xyes"; then
3609                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3610         fi
3612         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3613         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3614         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3615         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3617         enable_gss=no;
3618         AC_MSG_CHECKING(for GSS/GSS.h)
3619         AC_TRY_COMPILE([
3620                         #include <GSS/GSS.h>
3621         ], [
3622         ],[
3623                         AC_MSG_RESULT(yes)
3624                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3625                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3626                         enable_gss=yes
3627         ], [
3628                         AC_MSG_RESULT(no)
3629         ])
3631         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3632         AC_TRY_COMPILE([
3633                         #include <gssapi/gssapi_ext.h>
3634         ], [
3635         ],[
3636                         AC_MSG_RESULT(yes)
3637                         enable_gss=yes
3638         ], [
3639                         AC_MSG_RESULT(no)
3640         ])
3642         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3643         AC_TRY_COMPILE([
3644                         #include <gssapi/gssapi_ext.h>
3645                         #include <gssapi/gssapi_krb5.h>
3646                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3647         ], [
3648         ],[
3649                         AC_MSG_RESULT(yes)
3650                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3651         ], [
3652                         AC_MSG_RESULT(no)
3653         ])
3655         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3657         AC_CHECK_HEADERS([crt_externs.h])
3659         AC_MSG_CHECKING(for _NSGetEnviron)
3660         AC_TRY_LINK([
3661                 #include <crt_externs.h>
3662         ], [
3663                 char **result = *(_NSGetEnviron());
3664         ],[
3665                 AC_MSG_RESULT(yes)
3666                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3667         ], [
3668                 AC_MSG_RESULT(no)
3669         ])
3671         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3673         # *** End of Mono.Native checks ***
3674 else
3675         AM_CONDITIONAL(ENABLE_GSS, false)
3677         dnl *********************************
3678         dnl *** Checks for Windows compilation ***
3679         dnl *********************************
3680         AC_CHECK_HEADERS(winternl.h)
3682         jdk_headers_found=no
3683         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3684         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3685         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3686         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3687         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3688         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3689         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3691         dnl *********************************
3692         dnl *** Check for struct ip_mreqn ***
3693         dnl *********************************
3694         AC_MSG_CHECKING(for struct ip_mreqn)
3695         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3696                 struct ip_mreqn mreq;
3697                 mreq.imr_address.s_addr = 0;
3698         ], [
3699                 # Yes, we have it...
3700                 AC_MSG_RESULT(yes)
3701                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3702         ], [
3703                 # We'll just have to try and use struct ip_mreq
3704                 AC_MSG_RESULT(no)
3705                 AC_MSG_CHECKING(for struct ip_mreq)
3706                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3707                         struct ip_mreq mreq;
3708                         mreq.imr_interface.s_addr = 0;
3709                 ], [
3710                         # Yes, we have it...
3711                         AC_MSG_RESULT(yes)
3712                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3713                 ], [
3714                         # No multicast support
3715                         AC_MSG_RESULT(no)
3716                 ])
3717         ])
3719         dnl **********************************
3720         dnl *** Check for getaddrinfo ***
3721         dnl **********************************
3722         AC_MSG_CHECKING(for getaddrinfo)
3723                 AC_TRY_LINK([
3724                 #include <stdio.h>
3725                 #include <winsock2.h>
3726                 #include <ws2tcpip.h>
3727         ], [
3728                 getaddrinfo(NULL,NULL,NULL,NULL);
3729         ], [
3730                 # Yes, we have it...
3731                 AC_MSG_RESULT(yes)
3732                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3733         ], [
3734                 AC_MSG_RESULT(no)
3735         ])
3737         dnl **********************************
3738         dnl *** Check for gethostbyname ***
3739         dnl **********************************
3740         AC_MSG_CHECKING(for gethostbyname)
3741                 AC_TRY_LINK([
3742                 #include <stdio.h>
3743                 #include <winsock2.h>
3744                 #include <ws2tcpip.h>
3745         ], [
3746                 gethostbyname(NULL);
3747         ], [
3748                 # Yes, we have it...
3749                 AC_MSG_RESULT(yes)
3750                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3751         ], [
3752                 AC_MSG_RESULT(no)
3753         ])
3755         dnl **********************************
3756         dnl *** Check for getprotobyname ***
3757         dnl **********************************
3758         AC_MSG_CHECKING(for getprotobyname)
3759                 AC_TRY_LINK([
3760                 #include <stdio.h>
3761                 #include <winsock2.h>
3762                 #include <ws2tcpip.h>
3763         ], [
3764                 getprotobyname(NULL);
3765         ], [
3766                 # Yes, we have it...
3767                 AC_MSG_RESULT(yes)
3768                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3769         ], [
3770                 AC_MSG_RESULT(no)
3771         ])
3773         dnl **********************************
3774         dnl *** Check for getnameinfo ***
3775         dnl **********************************
3776         AC_MSG_CHECKING(for getnameinfo)
3777                 AC_TRY_LINK([
3778                 #include <stdio.h>
3779                 #include <winsock2.h>
3780                 #include <ws2tcpip.h>
3781         ], [
3782                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3783         ], [
3784                 # Yes, we have it...
3785                 AC_MSG_RESULT(yes)
3786                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3787         ], [
3788                 AC_MSG_RESULT(no)
3789         ])
3791         dnl **********************************
3792         dnl *** Check for inet_ntop ***
3793         dnl **********************************
3794         AC_MSG_CHECKING(for inet_ntop)
3795                 AC_TRY_LINK([
3796                 #include <stdio.h>
3797                 #include <winsock2.h>
3798                 #include <ws2tcpip.h>
3799         ], [
3800                 inet_ntop (0, NULL, NULL, 0);
3801         ], [
3802                 # Yes, we have it...
3803                 AC_MSG_RESULT(yes)
3804                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3805         ], [
3806                 AC_MSG_RESULT(no)
3807         ])
3809         dnl **********************************
3810         dnl *** Check for inet_pton ***
3811         dnl **********************************
3812         AC_MSG_CHECKING(for inet_pton)
3813                 AC_TRY_LINK([
3814                 #include <stdio.h>
3815                 #include <winsock2.h>
3816                 #include <ws2tcpip.h>
3817         ], [
3818                 #ifndef inet_pton
3819                 (void) inet_pton;
3820                 #endif
3821                 inet_pton (0, NULL, NULL);
3822         ], [
3823                 # Yes, we have it...
3824                 AC_MSG_RESULT(yes)
3825                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3826         ], [
3827                 AC_MSG_RESULT(no)
3828         ])
3830         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3831         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3832         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3833         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3834         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3835         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3836         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3839 dnl socklen_t check
3840 AC_MSG_CHECKING(for socklen_t)
3841 AC_TRY_COMPILE([
3842 #include <sys/types.h>
3843 #include <sys/socket.h>
3845   socklen_t foo;
3847 ac_cv_c_socklen_t=yes
3848         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3849         AC_MSG_RESULT(yes)
3851         AC_MSG_RESULT(no)
3854 AC_CHECK_FUNCS(execvp)
3856 dnl ****************************
3857 dnl *** Look for /dev/random ***
3858 dnl ****************************
3860 AC_MSG_CHECKING([if usage of random device is requested])
3861 AC_ARG_ENABLE(dev-random,
3862 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3863 try_dev_random=$enableval, try_dev_random=yes)
3865 AC_MSG_RESULT($try_dev_random)
3867 case "{$build}" in
3869 dnl IBM i does not have /dev/random, use unblocking only
3871     *-*-os400*)
3872     NAME_DEV_RANDOM="/dev/urandom"
3873     ;;
3875 dnl Win32 does not have /dev/random, they have their own method...
3877     *-mingw*|*-*-cygwin*)
3878     ac_cv_have_dev_random=no
3879     ;;
3881 dnl Everywhere else, it's /dev/random
3883     *)
3884     NAME_DEV_RANDOM="/dev/random"
3885     ;;
3886 esac
3888 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3890 dnl Now check if the device actually exists
3892 if test "x$try_dev_random" = "xyes"; then
3893     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3894     [if test -r "$NAME_DEV_RANDOM" ; then
3895         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3896     if test "x$ac_cv_have_dev_random" = "xyes"; then
3897         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3898     fi
3899 else
3900     AC_MSG_CHECKING(for random device)
3901     ac_cv_have_dev_random=no
3902     AC_MSG_RESULT(has been disabled)
3905 if test "x$host_win32" = "xyes"; then
3906     AC_DEFINE(HAVE_CRYPT_RNG)
3909 if test "x$ac_cv_have_dev_random" = "xno" \
3910     && test "x$host_win32" = "xno"; then
3911     AC_MSG_WARN([[
3913 *** A system-provided entropy source was not found on this system.
3914 *** Because of this, the System.Security.Cryptography random number generator
3915 *** will throw a NotImplemented exception.
3917 *** If you are seeing this message, and you know your system DOES have an
3918 *** entropy collection in place, please report an issue on GitHub and
3919 *** provide information about the system and how to access the random device.
3921 *** Otherwise you can install either egd or prngd and set the environment
3922 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3923 ***]])
3926 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)
3928 AC_MSG_CHECKING([if big-arrays are to be enabled])
3929 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)
3930 if test "x$enable_big_arrays" = "xyes" ; then
3931     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3932         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3933     else
3934         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3935     fi
3937 AC_MSG_RESULT($enable_big_arrays)
3939 dnl **************
3940 dnl *** DTRACE ***
3941 dnl **************
3943 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3945 if test "x$enable_dtrace" = "xyes"; then
3946    if test "x$has_dtrace" = "xno"; then
3947           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3948    fi
3949    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3950    if test "x$DTRACE" = "xno"; then
3951           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3952           enable_dtrace=no
3953    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3954           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3955           enable_dtrace=no
3956    fi
3959 dtrace_g=no
3960 if test "x$enable_dtrace" = "xyes"; then
3961         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3962         DTRACEFLAGS=
3963         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3964                 case "$host" in
3965                         powerpc-*-darwin*)
3966                         DTRACEFLAGS="-arch ppc64"
3967                         ;;
3968                         i*86-*-darwin*)
3969                         DTRACEFLAGS="-arch x86_64"
3970                         ;;
3971                         *)
3972                         DTRACEFLAGS=-64
3973                         ;;
3974                 esac
3975         else
3976                 case "$host" in
3977                         powerpc-*-darwin*)
3978                         DTRACEFLAGS="-arch ppc"
3979                         ;;
3980                         i*86-*-darwin*)
3981                         DTRACEFLAGS="-arch i386"
3982                         ;;
3983                         *)
3984                         DTRACEFLAGS=-32
3985                         ;;
3986                 esac
3987         fi
3988         AC_SUBST(DTRACEFLAGS)
3989         case "$host" in
3990                 *-*-solaris*)
3991                 dtrace_g=yes
3992                 ;;
3993         esac
3994         AC_CHECK_HEADERS([sys/sdt.h])
3996 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3997 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3999 dnl **************************
4000 dnl *** AOT cross offsets  ***
4001 dnl **************************
4003 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
4004     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
4006 dnl **************
4007 dnl ***  LLVM  ***
4008 dnl **************
4010 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
4011 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
4012 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)
4013 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
4014 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
4016 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
4018 if test "x$enable_llvm" = "xdefault"; then
4019    enable_llvm=$enable_llvm_default
4022 enable_llvm_msvc_only="no"
4023 if test "x$enable_llvm" = "xyes"; then
4024         if test "x$host_win32" = "xyes"; then
4025                 if test "x$cross_compiling" = "xno"; then
4026                         case "$target" in
4027                         x86_64*)
4028                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
4029                                 enable_llvm_msvc_only="yes"
4030                                 ;;
4031                         i686*)
4032                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
4033                                 ;;
4034                         esac
4035                 fi
4036                 if test "x$enable_loadedllvm" = "xyes"; then
4037                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
4038                         enable_loadedllvm=no
4039                 fi
4040         fi
4043 internal_llvm="no"
4044 if test "x$enable_llvm" = "xyes"; then
4045         if test "x$with_llvm" != "x"; then
4046                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
4047                 if test x$host_win32 = xyes; then
4048                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
4049                 fi
4050                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
4051                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
4052                 fi
4053         else
4054                 if test x$host_win32 = xyes; then
4055                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
4056                 else
4057                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
4058                 fi
4059                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
4060                         internal_llvm=yes
4061                 fi
4062         fi
4064         LLVM_CODEGEN_LIBS="x86codegen"
4065         case "$target" in
4066         arm*)
4067                 LLVM_CODEGEN_LIBS="armcodegen"
4068                 ;;
4069         aarch64*)
4070                 LLVM_CODEGEN_LIBS="aarch64codegen"
4071                 ;;
4072         powerpc*)
4073                 LLVM_CODEGEN_LIBS="powerpccodegen"
4074                 ;;
4075         esac
4076         if test "x$host" != "x$target"; then
4077                 # No need for jit libs
4078                 LLVM_CODEGEN_LIBS=
4079         fi
4081         AC_SUBST(LLVM_CODEGEN_LIBS)
4082         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4084         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4085                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4086                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4087         fi
4088         if test "x$enable_llvm_msvc_only" != "xyes"; then
4089                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4090         else
4091                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4092         fi
4093 fi # ENABLE_LLVM
4095 # AC_DEFINE necessary for correct restore behavior on Linux
4096 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4097 if test "x$internal_llvm" != "xno"; then
4098         if test "x$enable_llvm_msvc_only" != "xyes"; then
4099                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4100         else
4101                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4102         fi
4105 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4106 if test "x$enable_llvm_asserts" != "xno"; then
4107         if test "x$enable_llvm_msvc_only" != "xyes"; then
4108                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4109         else
4110                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4111         fi
4114 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4116 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4117 if test "x$enable_loadedllvm" = "xyes"; then
4118         if test "x$enable_llvm_msvc_only" != "xyes"; then
4119                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4120         fi
4123 if test "x$enable_llvm" = "xyes"; then
4124         enable_llvm_runtime=yes
4127 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4128 if test "x$enable_llvm_runtime" = "xyes"; then
4129         if test "x$enable_llvm_msvc_only" != "xyes"; then
4130                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4131         else
4132                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4133         fi
4136 TARGET="unknown"
4137 ACCESS_UNALIGNED="yes"
4139 LIBC="libc.so.6"
4140 INTL="libc.so.6"
4141 SQLITE="libsqlite.so.0"
4142 SQLITE3="libsqlite3.so.0"
4143 X11="libX11.so"
4144 GDKX11="libgdk-x11-2.0.so.0"
4145 GTKX11="libgtk-x11-2.0.so.0"
4146 XINERAMA="libXinerama.so.1"
4148 sizeof_register="SIZEOF_VOID_P"
4150 jit_wanted=true
4151 boehm_supported=true
4152 BTLS_SUPPORTED=no
4153 BTLS_PLATFORM=
4155 case "$host" in
4156         wasm32*)
4157                 TARGET=WASM
4158                 arch_target=wasm
4159                 BTLS_SUPPORTED=no
4160                 ACCESS_UNALIGNED="no"
4161                 with_tls=pthread
4162                 target_wasm=yes
4163                 ;;
4164         mips*)
4165                 TARGET=MIPS;
4166                 arch_target=mips;
4167                 with_tls=pthread;
4168                 ACCESS_UNALIGNED="no"
4170                 AC_MSG_CHECKING(for mips n32)
4171                 AC_TRY_COMPILE([],[
4172                 #if _MIPS_SIM != _ABIN32
4173                 #error Not mips n32
4174                 #endif
4175                 ],[
4176                 AC_MSG_RESULT(yes)
4177                 sizeof_register=8
4178                 ],[
4179                 AC_MSG_RESULT(no)
4180                 ])
4181                 ;;
4182         i*86-*-*)
4183                 TARGET=X86;
4184                 arch_target=x86;
4185                 case $host_os in
4186                   solaris*)
4187                         LIBC="libc.so"
4188                         INTL="libintl.so"
4189                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4190                                 TARGET=AMD64
4191                                 arch_target=amd64
4192                         fi
4194                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4195                         # int astruct __attribute__ ((visibility ("hidden")));
4196                         # void foo ()
4197                         # {
4198                         #       void *p = &astruct;
4199                         # }
4200                         # gcc -fPIC --shared -o libfoo.so foo.c
4201                         # yields:
4202                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4203                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4204                         have_visibility_hidden=no
4205                         ;;
4206                   mingw*|cygwin*)
4207                         have_visibility_hidden=no
4208                         BTLS_SUPPORTED=no
4209                         BTLS_PLATFORM=i386
4210                         ;;
4211                   haiku*)
4212                         LIBC=libroot.so
4213                         ;;
4214                   linux*)
4215                         AOT_SUPPORTED="yes"
4216                         BTLS_SUPPORTED=yes
4217                         BTLS_PLATFORM=i386
4218                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4219                         ;;
4220                   darwin*)
4221                         AOT_SUPPORTED="yes"
4222                         BTLS_SUPPORTED=yes
4223                         BTLS_PLATFORM=i386
4224                         ;;
4225                   openbsd*|freebsd*|kfreebsd-gnu*)
4226                         AOT_SUPPORTED="yes"
4227                         BTLS_SUPPORTED=yes
4228                         BTLS_PLATFORM=i386
4229                         ;;
4230                 esac
4231                 ;;
4232         x86_64-*-* | amd64-*-*)
4233                 TARGET=AMD64;
4234                 arch_target=amd64;
4235                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4236                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4237                         sizeof_register=8
4238                 fi
4239                 case $host_os in
4240                   linux*)
4241                         AOT_SUPPORTED="yes"
4242                         BTLS_SUPPORTED=yes
4243                         BTLS_PLATFORM=x86_64
4244                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4245                         ;;
4246                   darwin*)
4247                         AOT_SUPPORTED="yes"
4248                         BTLS_SUPPORTED=yes
4249                         BTLS_PLATFORM=x86_64
4250                         boehm_supported=false
4251                         ;;
4252                   openbsd*|freebsd*|kfreebsd-gnu*)
4253                         AOT_SUPPORTED="yes"
4254                         BTLS_SUPPORTED=yes
4255                         BTLS_PLATFORM=x86_64
4256                         ;;
4257                   mingw*|cygwin*)
4258                         BTLS_SUPPORTED=no
4259                         BTLS_PLATFORM=x86_64
4260                         ;;
4261                 esac
4262                 ;;
4263         sparc*-*-*)
4264                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4265                    TARGET=SPARC64
4266                 else
4267                         TARGET=SPARC
4268                 fi
4269                 arch_target=sparc;
4270                 ACCESS_UNALIGNED="no"
4271                 case $host_os in
4272                   linux*) ;;
4273                   *)
4274                         LIBC="libc.so"
4275                         INTL="libintl.so"
4276                 esac
4277                 if test x"$GCC" = xyes; then
4278                         # We don't support v8 cpus
4279                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4280                 fi
4281                 if test x"$AR" = xfalse; then
4282                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4283                 fi
4284                 ;;
4285         *-mingw*|*-*-cygwin*)
4286                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4287                 have_visibility_hidden=no
4288                 INTL="intl"
4289                 case "$host" in
4290                         x86_64*mingw*)
4291                                 # Old Boehm fails to compile for x86_64-mingw.
4292                                 # It is trivial to fix, but just silently drop it.
4293                                 boehm_supported=false
4294                                 ;;
4295                 esac
4296                 ;;
4297         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4298         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4299         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4300                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4301                         TARGET=POWERPC64;
4302                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4303                         if ! (echo $CC | grep -q -- 'clang'); then
4304                                 CFLAGS="$CFLAGS -mminimal-toc"
4305                         fi
4306                 else
4307                         TARGET=POWERPC;
4308                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4309                 fi
4310                 arch_target=ppc;
4311                 case $host_os in
4312                   aix*|os400*)
4313                         BTLS_SUPPORTED=yes
4314                         BTLS_PLATFORM=powerpc
4315                         dnl on AIX/PASE, shared libraries can be inside archives
4316                         dnl if they are, we specify them by lib.a(lib.so)
4317                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4318                         LIBC="libc.a(shr_64.o)"
4319                         INTL="libintl.a(libintl.so.8)"
4320                         ;;
4321                   linux*)
4322                         BTLS_SUPPORTED=yes
4323                         BTLS_PLATFORM=powerpc
4324                         ;;
4325                 esac
4326                 ;;
4327         armv7k-*-darwin*)
4328                 TARGET=ARM;
4329                 TARGET_SYS=WATCHOS
4330                 arch_target=arm;
4331                 arm_fpu=VFP_HARD
4332                 ACCESS_UNALIGNED="no"
4333                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4334                 ;;
4336         arm*-darwin*)
4337                 TARGET=ARM;
4338                 arch_target=arm;
4339                 ACCESS_UNALIGNED="no"
4340                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4341                 ;;
4342         arm*-linux*)
4343                 TARGET=ARM;
4344                 arch_target=arm;
4345                 ACCESS_UNALIGNED="no"
4346                 AOT_SUPPORTED="yes"
4347                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4348                 BTLS_SUPPORTED=yes
4349                 BTLS_PLATFORM=arm
4350                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4351                 case "$target" in
4352                 arm*-linux*-gnueabi)
4353                         BTLS_PLATFORM=armsoft
4354                         ;;
4355                 esac
4356                 ;;
4357         arm*-netbsd*-eabi*)
4358                 TARGET=ARM;
4359                 arch_target=arm;
4360                 ACCESS_UNALIGNED="no"
4361                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4362                 ;;
4363         aarch64-*darwin*ilp32)
4364                 TARGET=ARM6432
4365                 arch_target=arm64
4366                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4367                 sizeof_register=8
4368                 # assuming no other target other than watchOS is using aarch64*darwin triple
4369                 TARGET_SYS=WATCHOS
4370                 ;;
4371         aarch64-*)
4372                 # https://lkml.org/lkml/2012/7/15/133
4373                 TARGET=ARM64
4374                 arch_target=arm64
4375                 boehm_supported=false
4376                 AOT_SUPPORTED="yes"
4377                 BTLS_SUPPORTED=yes
4378                 BTLS_PLATFORM=aarch64
4379                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4380                 ;;
4381         s390x-*-linux*)
4382                 TARGET=S390X;
4383                 arch_target=s390x;
4384                 ACCESS_UNALIGNED="yes"
4385                 BTLS_SUPPORTED=yes
4386                 BTLS_PLATFORM=s390x
4387                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4388                 ;;
4389         riscv32-*)
4390                 TARGET=RISCV32
4391                 ACCESS_UNALIGNED=no
4392                 AOT_SUPPORTED=no
4393                 BTLS_SUPPORTED=yes
4394                 BTLS_PLATFORM=riscv32
4395                 arch_target=riscv32
4396                 boehm_supported=false
4397                 ;;
4398         riscv64*)
4399                 TARGET=RISCV64
4400                 ACCESS_UNALIGNED=no
4401                 AOT_SUPPORTED=no
4402                 BTLS_SUPPORTED=yes
4403                 BTLS_PLATFORM=riscv64
4404                 arch_target=riscv64
4405                 boehm_supported=false
4406                 ;;
4407 esac
4409 HOST=$TARGET
4411 if test "x$host" != "x$target"; then
4412    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4413    enable_mcs_build=no
4414    enable_support_build=no
4415    BTLS_SUPPORTED=no
4416    # Can't use tls, since it depends on the runtime detection of tls offsets
4417    # in mono-compiler.h
4418    with_tls=pthread
4419    target_mach=no
4420    case "$target" in
4421    wasm32*)
4422                 TARGET=WASM
4423                 arch_target=wasm
4424                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4425                 ;;
4426    arm*-darwin*)
4427                 TARGET=ARM;
4428                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4429                 case "$target" in
4430                 armv7k-*)
4431                         arm_fpu=VFP_HARD
4432                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4433                         ;;
4434                 esac            
4435                 ;;
4436    powerpc64-ps3-linux-gnu)
4437                 TARGET=POWERPC64
4438                 arch_target=powerpc64
4439                 AC_DEFINE(TARGET_PS3, 1, [...])
4440                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4441                 # uses this define
4442                 AC_DEFINE(__mono_ppc64__, 1, [...])
4443                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4444                 sizeof_register=8
4445                 target_byte_order=G_BIG_ENDIAN
4446                 ;;
4447    powerpc64-xbox360-linux-gnu)
4448                 TARGET=POWERPC64
4449                 arch_target=powerpc64
4450                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4451                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4452                 # uses this define
4453                 sizeof_register=8
4454                 target_byte_order=G_BIG_ENDIAN
4455                 ;;
4456    arm*-linux-*)
4457                 TARGET=ARM;
4458                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4459                 ;;
4460    arm*-netbsd*-eabi*)
4461                 TARGET=ARM;
4462                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4463                 ;;
4464    i686*-linux-*)
4465                 TARGET=X86;
4466                 ;;
4467    i*86-apple-*)
4468                 TARGET=X86;
4469                 ;;
4470    x86_64*-linux-*)
4471                 TARGET=AMD64;
4472                 ;;
4473    x86_64-ps4-freebsd)
4474                 TARGET=AMD64;
4475                 AC_DEFINE(TARGET_PS4, 1, [...])
4476                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4477                 CPPFLAGS="$CPPFLAGS"
4478                 target_win32=no
4479                 ;;
4480         aarch64*darwin*_ilp32)
4481                 TARGET=ARM6432;
4482                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4483                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4484                 ;;
4485         aarch64-*)
4486                 TARGET=ARM64
4487                 ;;
4488         riscv32*)
4489                 TARGET=RISCV32
4490                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4491                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4492                 arch_target=riscv32
4493                 target_mach=no
4494                 with_tls=pthread
4495                 ;;
4496         riscv64*)
4497                 TARGET=RISCV64
4498                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4499                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4500                 arch_target=riscv64
4501                 target_mach=no
4502                 with_tls=pthread
4503                 ;;
4504         x86_64-google-fuchsia)
4505                 TARGET=AMD64
4506                 target_win32=nop
4507                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
4508                 ;;
4509         *)
4510                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4511         esac
4513         case "$target" in
4514         *-darwin*)
4515                 target_mach=yes
4516                 ;;
4517         *-linux-android*)
4518                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4519                 ;;
4520         esac
4523 case "$TARGET" in
4524 WASM)
4525         AC_DEFINE(TARGET_WASM, 1, [...])
4526         arch_target=wasm
4527         ;;
4528 X86)
4529         AC_DEFINE(TARGET_X86, 1, [...])
4530         arch_target=x86
4531         ;;
4532 AMD64)
4533         AC_DEFINE(TARGET_AMD64, 1, [...])
4534         arch_target=amd64
4535         ;;
4536 ARM)
4537         AC_DEFINE(TARGET_ARM, 1, [...])
4538         arch_target=arm
4539         ACCESS_UNALIGNED="no"
4540         ;;
4541 ARM64|ARM6432)
4542         AC_DEFINE(TARGET_ARM64, 1, [...])
4543         arch_target=arm64
4544         ;;
4545 POWERPC)
4546         AC_DEFINE(TARGET_POWERPC, 1, [...])
4547         ;;
4548 POWERPC64)
4549         AC_DEFINE(TARGET_POWERPC, 1, [...])
4550         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4551         ;;
4552 S390X)
4553         AC_DEFINE(TARGET_S390X, 1, [...])
4554         ;;
4555 MIPS)
4556         AC_DEFINE(TARGET_MIPS, 1, [...])
4557         ;;
4558 SPARC)
4559         AC_DEFINE(TARGET_SPARC, 1, [...])
4560         ;;
4561 SPARC64)
4562         AC_DEFINE(TARGET_SPARC64, 1, [...])
4563         ;;
4564 RISCV32)
4565         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4566         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4567         ;;
4568 RISCV64)
4569         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4570         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4571         ;;
4572 esac
4574 case "$TARGET" in
4575 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4576     target_sizeof_void_p=4
4577     ;;
4578 *64* | S390X)
4579     target_sizeof_void_p=8
4580     ;;
4582     AC_MSG_ERROR([unknown target])
4583     ;;
4584 esac
4586 case "$HOST" in
4587 WASM)
4588         AC_DEFINE(HOST_WASM, 1, [...])
4589         ;;
4590 X86)
4591         AC_DEFINE(HOST_X86, 1, [...])
4592         ;;
4593 AMD64)
4594         AC_DEFINE(HOST_AMD64, 1, [...])
4595         ;;
4596 ARM)
4597         AC_DEFINE(HOST_ARM, 1, [...])
4598         ;;
4599 ARM64)
4600         AC_DEFINE(HOST_ARM64, 1, [...])
4601         ;;
4602 POWERPC)
4603         AC_DEFINE(HOST_POWERPC, 1, [...])
4604         ;;
4605 POWERPC64)
4606         AC_DEFINE(HOST_POWERPC, 1, [...])
4607         AC_DEFINE(HOST_POWERPC64, 1, [...])
4608         ;;
4609 S390X)
4610         AC_DEFINE(HOST_S390X, 1, [...])
4611         ;;
4612 MIPS)
4613         AC_DEFINE(HOST_MIPS, 1, [...])
4614         ;;
4615 SPARC)
4616         AC_DEFINE(HOST_SPARC, 1, [...])
4617         ;;
4618 SPARC64)
4619         AC_DEFINE(HOST_SPARC64, 1, [...])
4620         ;;
4621 RISCV32)
4622         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4623         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4624         ;;
4625 RISCV64)
4626         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4627         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4628         ;;
4629 esac
4631 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4632 case "$HOST" in
4633 X86 | AMD64 | ARM | ARM64)
4634         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4635         ;;
4636 esac
4638 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4639 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4641 dnl *************
4642 dnl *** VTUNE ***
4643 dnl *************
4645 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4646 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4648 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4650 if test "x$enable_vtune" = "xyes"; then
4651         if test "x$with_vtune" = "x"; then
4652                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4653         else
4654                 VTUNE_PATH=$with_vtune
4655         fi
4656         VTUNE_INCLUDE=$VTUNE_PATH/include
4657         case "$TARGET" in
4658         X86)
4659                 VTUNE_LIB=$VTUNE_PATH/lib32
4660                 ;;
4661         AMD64)
4662                 VTUNE_LIB=$VTUNE_PATH/lib64
4663                 ;;
4664         *)
4665                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4666                 ;;
4667         esac
4668         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4669                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4670         fi
4671         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4672                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4673         fi
4675         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4676         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4678         AC_SUBST(VTUNE_LIBS)
4679         AC_SUBST(VTUNE_CFLAGS)
4681 dnl Use GCC atomic ops if they work on the target.
4682 if test x$GCC = "xyes"; then
4683         case $TARGET in
4684         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4685                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4686                 ;;
4687         esac
4690 if test "x$target_mach" = "xyes"; then
4692    if test "x$TARGET_SYS" = "xWATCHOS"; then
4693           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4694           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4695           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4696           BTLS_SUPPORTED=no
4697    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4698           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4699           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4700           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4701           BTLS_SUPPORTED=no
4702           target_ios=yes
4703    else
4704        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4705        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4706        #error fail this for ios
4707        #endif
4708        ], [
4709                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4710           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4711           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4712           target_osx=yes
4713        ], [
4714           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4715           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4716           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4717           BTLS_SUPPORTED=no
4718                   target_ios=yes
4719        ])
4720         fi
4721    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4724 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4726 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4728 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4729    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4730 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4731    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4732 else
4733    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4736 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4738 if test "x$sizeof_register" = "x4"; then
4739   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4740 elif test "x$sizeof_register" = "x8"; then
4741   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4742 else
4743   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4746 if test "x$have_visibility_hidden" = "xyes"; then
4747    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4750 if test "x$have_deprecated" = "xyes"; then
4751    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4754 dnl 
4755 dnl Simple Generational checks (sgen)
4757 SGEN_DEFINES=
4758 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4759 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4760 if test x$buildsgen = xyes; then
4761    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4762    SGEN_DEFINES="-DHAVE_SGEN_GC"
4764         conc_gc_msg=""
4765    if test x$with_sgen_default_concurrent != xno; then
4766        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4767            conc_gc_msg=" (concurrent by default)"
4768    fi
4770    if test "x$gc_msg" = "x"; then
4771       gc_msg="sgen$conc_gc_msg"
4772    else
4773       gc_msg="sgen$conc_gc_msg and $gc_msg"
4774    fi
4776 AC_SUBST(SGEN_DEFINES)
4777 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4779 jit_status="Building and using the JIT"
4781 libsuffix=".so"
4783 case "$host" in
4784      *-*-darwin*)
4785         libsuffix=".dylib"
4786         LIBC="libc.dylib"
4787         INTL="libintl.dylib"
4788         SQLITE="libsqlite.0.dylib"
4789         SQLITE3="libsqlite3.0.dylib"
4790         X11="libX11.dylib"
4791         GDKX11="libgdk-x11-2.0.dylib"
4792         GTKX11="libgtk-x11-2.0.dylib"
4793         ;;
4794      *-*-*netbsd*)
4795         LIBC="libc.so"
4796         INTL="libintl.so"
4797         SQLITE="libsqlite.so"
4798         SQLITE3="libsqlite3.so"
4799         ;;
4800      *-*-kfreebsd*-gnu)
4801         LIBC="libc.so.0.1"
4802         INTL="libc.so.0.1"
4803         X11="libX11.so.6"
4804         ;;
4805     *-*-*freebsd*)
4806         LIBC="libc.so.7"
4807         INTL="libintl.so"
4808         SQLITE="libsqlite.so"
4809         SQLITE3="libsqlite3.so"
4810         ;;
4811     *-*-*openbsd*)
4812         LIBC="libc.so"
4813         INTL="libintl.so"
4814         SQLITE="libsqlite.so"
4815         SQLITE3="libsqlite3.so"
4816         ;;
4817     *-*-*linux*)
4818         AC_PATH_X
4819         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4820         AC_MSG_CHECKING(for the soname of libX11.so)
4821         for i in $x_libraries $dlsearch_path; do
4822                 for r in 4 5 6; do
4823                         if test -f $i/libX11.so.$r; then
4824                                 X11=libX11.so.$r
4825                                 AC_MSG_RESULT($X11)
4826                         fi
4827                 done
4828         done
4829         
4830         if test "x$X11" = "xlibX11.so"; then
4831                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4832                 X11=libX11.so.6
4833         fi
4834         ;;
4835 esac
4837 AC_SUBST(libsuffix)
4839 ######################################
4840 # EGLIB CHECKS
4841 ######################################
4843 GNUC_PRETTY=
4844 GNUC_UNUSED=
4845 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4846 if test x$GCC = xyes; then
4847    GNUC_UNUSED='__attribute__((__unused__))'
4848    GNUC_NORETURN='__attribute__((__noreturn__))'
4849    case $host_cpu in
4850      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4851    esac
4853 AC_SUBST(GNUC_PRETTY)
4854 AC_SUBST(GNUC_UNUSED)
4855 AC_SUBST(GNUC_NORETURN)
4856 AC_SUBST(BREAKPOINT)
4858 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4860 case $host in
4861 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4862     PATHSEP='\\'
4863     SEARCHSEP=';'
4864     OS="WIN32"
4865     PIDTYPE='void *'
4866     ;;
4868     PATHSEP='/'
4869     SEARCHSEP=':'
4870     OS="UNIX"
4871     PIDTYPE='int'
4872     ;;
4873 esac
4875 case $host in
4876         *-*-solaris*)
4877         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4878         ;;
4879 esac
4881 case $target in
4882 arm*-darwin*|aarch64*-*|riscv*)
4883     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4884     ;;
4885 i*86-*-darwin*)
4886     ORDER=G_LITTLE_ENDIAN
4887     ;;
4888 *-*-haiku*)
4889     LDFLAGS="$LDFLAGS -ltextencoding"
4890     ;;
4891 *-*-openbsd*)
4892     CFLAGS="$CFLAGS -pthread"
4893     LDFLAGS="$LDFLAGS -pthread"
4894     ;;
4895 esac
4897 AC_SUBST(ORDER)
4898 AC_SUBST(PATHSEP)
4899 AC_SUBST(SEARCHSEP)
4900 AC_SUBST(OS)
4901 AC_SUBST(PIDTYPE)
4903 # Defined for all targets/platforms using classic Windows API support.
4904 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4905 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4907 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4908 AC_CHECK_FUNCS(getrlimit)
4909 AC_CHECK_FUNCS(fork execv execve)
4910 AC_CHECK_FUNCS(waitpid)
4912 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4914 if test x$with_overridable_allocators = xyes; then
4915         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4916   AC_MSG_NOTICE([Overridable allocator support enabled])
4917 else
4918   AC_MSG_NOTICE([Overridable allocator support disabled])
4922 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4923 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4924 # removed once support for 10.6 is dropped.
4926 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4928 if test x$target_osx = xyes; then
4929 AC_CHECK_FUNCS(getpwuid_r)
4930 elif test x$target_ios = xno; then
4931 AC_CHECK_FUNCS(strndup getpwuid_r)
4934 AC_SEARCH_LIBS(sqrtf, m)
4936 # nanosleep may not be part of libc, also search it in other libraries
4937 AC_SEARCH_LIBS(nanosleep, rt)
4939 AC_SEARCH_LIBS(dlopen, dl)
4940 old_ldflags="${LDFLAGS}"
4941 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4942 if test $lt_cv_prog_gnu_ld = yes; then
4943         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic,-Bsymbolic"
4944 else
4945         case $host in
4946         *-*-aix*|*-*-os400*)
4947                 LDFLAGS="${LDFLAGS} -bsymbolic"
4948                 ;;
4949         *)
4950                 dnl Try to use export-dynamic anyways
4951                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic,-Bsymbolic"
4952                 ;;
4953         esac
4955 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4956 if test $found_export_dynamic = no; then
4957         LDFLAGS="${old_ldflags}"
4960 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4961 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4962 AC_CHECK_LIB(iconv, iconv_open)
4963 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4964 AC_SUBST(HAVE_ALLOCA_H)
4966 # Get the exact type of size_t, not just its size.
4967 # This is so we can find an exact printf format among u, lu, llu, I64u.
4968 # To avoid warnings about slight mismatches.
4969 # C99 runtime "zu" dependency is being avoided here.
4971 # We have to compile as C++ because C is too lenient
4972 # and lets the wrong thing compile, with warnings.
4974 # Note: "zu" or ifdef <something> have the advantage
4975 # of producing installable "biarch" headers. i.e. one Mac header
4976 # for Mac/x86 and Mac/amd64.
4978 AC_LANG_PUSH(C++)
4980 # Check long before int because it is the overwhelming Unix answer,
4981 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4983 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4985 AC_MSG_CHECKING(if size_t is unsigned long)
4986 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4987         #include <stddef.h>
4988         unsigned long *a = (size_t*)0;
4989 ])], [
4990         AC_MSG_RESULT(yes)
4991         AC_SUBST(GSIZE_FORMAT, '"lu"')
4992 ], [
4993         AC_MSG_RESULT(no)
4994         AC_MSG_CHECKING(if size_t is unsigned int)
4995         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4996                 #include <stddef.h>
4997                 unsigned *a = (size_t*)0;
4998         ])], [
4999                 AC_MSG_RESULT(yes)
5000                 AC_SUBST(GSIZE_FORMAT, '"u"')
5001         ], [
5002 # At this point the majority of systems have their answer,
5003 # and we descend into non-standard or new-standard territory.
5005 # Check __int64 first because I64 on some systems predates ll, enabling
5006 # new compiler/old runtime interop, and the types always have the same size.
5007                 AC_MSG_RESULT(no)
5008                 AC_MSG_CHECKING(if size_t is unsigned __int64)
5009                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5010                         #include <stddef.h>
5011                         unsigned __int64 *a = (size_t*)0;
5012                 ])], [
5013                         AC_MSG_RESULT(yes)
5014                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
5015                 ], [
5016                         AC_MSG_RESULT(no)
5017                         AC_MSG_CHECKING(if size_t is unsigned long long)
5018                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5019                                 #include <stddef.h>
5020                                 unsigned long long *a = (size_t*)0;
5021                         ])], [
5022                                 AC_MSG_RESULT(yes)
5023                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
5024                         ], [
5025                                 AC_MSG_RESULT(no)
5026                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
5027                         ] )
5028                 ] )
5029         ] )
5030 ] )
5032 AC_LANG_POP
5034 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
5035 # This provides for an exact match with functions that
5036 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
5037 # uintptr_t is not necessarily the same.
5039 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
5040 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
5042 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
5043    GSIZE="size_t"
5044    GSSIZE="ptrdiff_t"
5045 else
5046    GSIZE="uintptr_t"
5047    GSSIZE="intptr_t"
5050 AC_SUBST(GSIZE)
5051 AC_SUBST(GSSIZE)
5052 AC_SUBST(GSIZE_FORMAT)
5055 # END OF EGLIB CHECKS
5058 AC_ARG_WITH([libgdiplus],
5059         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
5060         [], [with_libgdiplus=installed])
5062 # default install location
5063 libgdiplus_install_loc=libgdiplus${libsuffix}
5064 case "$host" in
5065     *-*-*linux*)
5066     libgdiplus_install_loc=libgdiplus${libsuffix}.0
5067     ;;
5068 esac
5070 case $with_libgdiplus in
5071     no)
5072     libgdiplus_loc=
5073     ;;
5075     installed)
5076     libgdiplus_loc=
5077     if test x$cross_compiling = xno; then
5078         if test x$host_darwin = xyes; then
5079             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
5080             if test -x $a; then
5081               libgdiplus_install_loc=$a
5082               libgdiplus_loc=$a
5083             fi
5084         fi
5085     fi
5086     ;;
5088     yes|sibling)
5089     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5090     ;;
5092     /*) # absolute path, assume it is an install location
5093     libgdiplus_loc=$with_libgdiplus
5094     libgdiplus_install_loc=$with_libgdiplus
5095     ;;
5097     *)
5098     libgdiplus_loc=`pwd`/$with_libgdiplus
5099     ;;
5100 esac
5101 AC_SUBST(libgdiplus_loc)
5102 AC_SUBST(libgdiplus_install_loc)
5104 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)
5105 if test "x$icall_symbol_map" = "xyes"; then
5106    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5109 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5110 if test "x$icall_export" = "xyes"; then
5111    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5114 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5115 if test "x$icall_tables" = "xno"; then
5116    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5119 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5121 if test "x$with_tls" = "x__thread"; then
5122         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5123         # Pass the information to libgc
5124         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5125         AC_MSG_CHECKING(if the tls_model attribute is supported)
5126         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5127                 ], [
5128                         AC_MSG_RESULT(yes)
5129                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5130                 ], [
5131                         AC_MSG_RESULT(no)
5132         ])
5135 if test ${TARGET} = ARM; then
5136         dnl ******************************************
5137         dnl *** Check to see what FPU is available ***
5138         dnl ******************************************
5139         AC_MSG_CHECKING(which FPU to use)
5141         #
5142         # This is a bit tricky:
5143         #
5144         # if (__ARM_PCS_VFP) {
5145         #       /* mfloat-abi=hard == VFP with hard ABI */
5146         # } elif (!__SOFTFP__) {
5147         #       /* mfloat-abi=softfp == VFP with soft ABI */
5148         # } else {
5149         #       /* mfloat-abi=soft == no VFP */
5150         # }
5151         #
5152         # The exception is iOS (w/ GCC) where none of the above
5153         # are defined (but iOS always uses the 'softfp' ABI).
5154         #
5155         # No support for FPA.
5156         #
5158         fpu=NONE
5160         # iOS GCC always uses the 'softfp' ABI.
5161         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5162                 fpu=VFP
5163         fi
5165         # Are we using the 'hard' ABI?
5166         if test x$fpu = xNONE; then
5167                 AC_TRY_COMPILE([], [
5168                         #ifndef __ARM_PCS_VFP
5169                         #error "Float ABI is not 'hard'"
5170                         #endif
5171                 ], [
5172                         fpu=VFP_HARD
5173                 ], [
5174                         fpu=NONE
5175                 ])
5176         fi
5178         # No 'hard' ABI. 'soft' or 'softfp'?
5179         if test x$fpu = xNONE; then
5180                 AC_TRY_COMPILE([], [
5181                         #ifdef __SOFTFP__
5182                         #error "Float ABI is not 'softfp'"
5183                         #endif
5184                 ], [
5185                         fpu=VFP
5186                 ], [
5187                         fpu=NONE
5188                 ])
5189         fi
5191         if test x$arm_fpu != x; then
5192            fpu=$arm_fpu
5193         fi
5195         AC_MSG_RESULT($fpu)
5196         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5197         unset fpu
5199         dnl *********************************************
5200         dnl *** Check which ARM version(s) we can use ***
5201         dnl *********************************************
5202         AC_MSG_CHECKING(which ARM version to use)
5204         AC_TRY_COMPILE([], [
5205                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5206                 #error Not on ARM v5.
5207                 #endif
5208         ], [
5209                 arm_v5=yes
5211                 arm_ver=ARMv5
5212         ], [])
5214         AC_TRY_COMPILE([], [
5215                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5216                 #error Not on ARM v6.
5217                 #endif
5218         ], [
5219                 arm_v5=yes
5220                 arm_v6=yes
5222                 arm_ver=ARMv6
5223         ], [])
5225         AC_TRY_COMPILE([], [
5226                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5227                 #error Not on ARM v7.
5228                 #endif
5229         ], [
5230                 arm_v5=yes
5231                 arm_v6=yes
5232                 arm_v7=yes
5234                 arm_ver=ARMv7
5235         ], [])
5237         AC_MSG_RESULT($arm_ver)
5239         if test x$arm_v5 = xyes; then
5240                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5241                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5242         fi
5244         if test x$arm_v6 = xyes; then
5245                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5246                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5247         fi
5249         if test x$arm_v7 = xyes; then
5250                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5251                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5252         fi
5254         if test x$host_linux = xyes; then
5255                 RID="linux-arm"
5256                 COREARCH="arm"
5257                 if test x$fpu = xNONE; then
5258                         RID="linux-armel"
5259                         COREARCH="armel"
5260                 fi
5261         fi
5264 AC_SUBST(RID)
5265 AC_SUBST(COREARCH)
5266 AC_SUBST(CORETARGETS)
5268 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5269         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5271         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5273         if test x$fpabi = xauto; then
5274                 AC_TRY_COMPILE([], [
5275                         #ifdef __riscv_float_abi_double
5276                         #error "double"
5277                         #endif
5278                 ], [
5279                         fpabi=auto
5280                 ], [
5281                         fpabi=double
5282                 ])
5283         fi
5285         if test x$fpabi = xauto; then
5286                 AC_TRY_COMPILE([], [
5287                         #ifdef __riscv_float_abi_single
5288                         #error "single"
5289                         #endif
5290                 ], [
5291                         fpabi=auto
5292                 ], [
5293                         fpabi=single
5294                 ])
5295         fi
5297         if test x$fpabi = xauto; then
5298                 AC_TRY_COMPILE([], [
5299                         #ifdef __riscv_float_abi_soft
5300                         #error "soft"
5301                         #endif
5302                 ], [
5303                         fpabi=auto
5304                 ], [
5305                         fpabi=soft
5306                 ])
5307         fi
5309         case $fpabi in
5310         double)
5311                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5312                 AC_MSG_RESULT([double-precision])
5313                 ;;
5314         single)
5315                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5316                 AC_MSG_ERROR([single-precision, not supported])
5317                 ;;
5318         soft)
5319                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5320                 AC_MSG_RESULT([soft float])
5321                 ;;
5322         auto)
5323                 AC_MSG_ERROR([unknown])
5324                 ;;
5325         *)
5326                 AC_MSG_ERROR([invalid option: $fpabi])
5327                 ;;
5328         esac
5331 if test ${TARGET} = unknown; then
5332         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5333         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5336 if test "x$platform_android" = "xyes"; then
5337         case "x${TARGET}" in
5338         xARM)
5339                 case "x$arm_ver" in
5340                 xARMv5)
5341                         BTLS_SUPPORTED=yes
5342                         BTLS_PLATFORM=android-armv5
5343                         ;;
5344                 xARMv6)
5345                         BTLS_SUPPORTED=yes
5346                         BTLS_PLATFORM=android-armv6
5347                         ;;
5348                 xARMv7)
5349                         BTLS_SUPPORTED=yes
5350                         BTLS_PLATFORM=android-armv7
5351                         ;;
5352                 *)
5353                         BTLS_SUPPORTED=no
5354                         ;;
5355                 esac
5356                 ;;
5357         xARM64)
5358                 BTLS_SUPPORTED=yes
5359                 BTLS_PLATFORM=android-v8a
5360                 ;;
5361         xX86)
5362                 BTLS_SUPPORTED=yes
5363                 BTLS_PLATFORM=android-x86
5364                 ;;
5365         xAMD64)
5366                 BTLS_SUPPORTED=yes
5367                 BTLS_PLATFORM=android-x64
5368                 ;;
5369         *)
5370                 BTLS_SUPPORTED=no
5371                 ;;
5372         esac
5375 if test ${ACCESS_UNALIGNED} = no; then
5376         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5379 if test x$host_darwin = xyes; then
5380         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5381         AS_IF(
5382                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5383                 [AC_MSG_RESULT([no])],
5384                 [
5385                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5386                         AR_FLAGS="Scru"
5387                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5388                         AC_MSG_RESULT([yes])
5389                 ]
5390         )
5393 case "x$libgc" in
5394         xincluded)
5395                 # Pass CPPFLAGS to libgc configure
5396                 # We should use a separate variable for this to avoid passing useless and
5397                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5398                 # This should be executed late so we pick up the final version of CPPFLAGS
5399                 # The problem with this approach, is that during a reconfigure, the main
5400                 # configure scripts gets invoked with these arguments, so we use separate
5401                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5402                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5403                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5404                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5405                 fi
5406                 # Don't pass -finstrument-for-thread-suspension in, 
5407                 # if these are instrumented it will be very bad news 
5408                 # (infinite recursion, undefined parking behavior, etc)
5409                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5410                 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\""
5411                 if test "x$support_boehm" = "xyes"; then
5412                         AC_CONFIG_SUBDIRS(libgc)
5413                 fi
5414                 ;;
5415 esac
5417 MALLOC_MEMPOOLS=no
5418 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5419         if test x$with_malloc_mempools = xyes; then
5420                 MALLOC_MEMPOOLS=yes
5421                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5422         fi
5426 DISABLE_MCS_DOCS=default
5427 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5428         if test x$with_mcs_docs != xyes; then
5429                 DISABLE_MCS_DOCS=yes
5430         fi
5432 if test -n "$INSTALL_4_x_TRUE"; then :
5433         DISABLE_MCS_DOCS=yes
5435 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5436    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5439 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)],[
5440         if test x$with_lazy_gc_thread_creation != xno ; then
5441                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5442         fi
5443 ], [with_lazy_gc_thread_creation=no])
5445 dnl *****************************
5446 dnl *** Thread suspend policy ***
5447 dnl *****************************
5449 dnl Set a default hybrid or cooperative suspend on some platforms
5451 dnl Coop default is set by the bitcode preset.
5453 dnl If coop isn't on by default, maybe hybrid should be?
5454 if test x$enable_cooperative_suspend_default != xyes; then
5455         case $HOST in
5456         X86 | AMD64)
5457                 dnl Some host/target confusion, there's no host_osx (and
5458                 dnl host_darwin would be true on iOS not just macOS).
5459                 if test x$target_osx = xyes; then
5460                         enable_hybrid_suspend_default=yes
5461                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5462                         enable_hybrid_suspend_default=yes
5463                 fi
5464                 ;;
5465         esac
5468 dnl Now check if there were flags overriding the defaults
5470 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])
5471 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5473 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5474         enable_cooperative_suspend=$with_cooperative_gc
5477 if test x$enable_cooperative_suspend = xdefault; then
5478         enable_cooperative_suspend=$enable_cooperative_suspend_default
5481 if test x$enable_cooperative_suspend != xno; then
5482         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5485 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5487 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])
5489 if test x$enable_hybrid_suspend = xdefault; then
5490    enable_hybrid_suspend=$enable_hybrid_suspend_default
5493 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5494         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5497 if test x$enable_hybrid_suspend != xno ; then
5498         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5501 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5503 dnl End of thread suspend policy
5505 dnl ***************************
5506 dnl *** feature experiments ***
5507 dnl ***************************
5509 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5510 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5512         if test x$enable_experiment != x ; then
5513                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5514         fi
5515         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5516                 eval "mono_experiment_test_enable_$feature='yes'"
5517         done
5519         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5520                 eval "mono_experiment_test_enable_null='yes'"
5521                 true
5522         fi
5524         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5525                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5526         fi
5527 ],[])
5529 dnl **********************
5530 dnl *** checked builds ***
5531 dnl **********************
5533 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, crash_reporting],[
5535         if test x$enable_checked_build != x ; then
5536                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5537         fi
5538         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5539                 eval "mono_checked_build_test_enable_$feature='yes'"
5540         done
5542         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5543                 eval "mono_checked_build_test_enable_gc='yes'"
5544                 eval "mono_checked_build_test_enable_metadata='yes'"
5545                 eval "mono_checked_build_test_enable_thread='yes'"
5546                 eval "mono_checked_build_test_enable_private_types='yes'"
5547                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5548         fi
5550         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5551                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5552         fi
5554         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5555                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5556         fi
5558         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5559                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5560         fi
5562         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5563                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5564         fi
5566         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5567                 # Required
5568                 with_overridable_allocators=yes
5569                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5571                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5572         fi
5573 ], [])
5575 dnl End of checked builds
5577 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5579 AC_CHECK_HEADER([malloc.h], 
5580                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5581                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5583 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5584 # instead of libmono-static.a
5585 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5586    LIBMONO_LA=libmini-static.la
5587 else
5588    if test x$buildsgen = xyes; then
5589       LIBMONO_LA=libmonosgen-$API_VER.la
5590    else
5591       LIBMONO_LA=libmonoboehm-$API_VER.la
5592    fi
5594 AC_SUBST(LIBMONO_LA)
5596 dnl **************
5597 dnl ***  Btls  ***
5598 dnl **************
5600 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5601 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5602 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5603 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5604 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5605 AC_ARG_WITH(btls_android_ndk_asm_workaround, [  --with-btls-android-ndk-asm-workaround        Work around a problem with NDK r18+ clang compiler when compiling some AES assembly for ARM])
5607 if test "x$with_btls_android_api" = "x" ; then
5608         case "$BTLS_PLATFORM" in
5609                 android-armv5)
5610                         with_btls_android_api=16" ;;
5611                 android-armv6)
5612                         with_btls_android_api=16" ;;
5613                 android-armv7)
5614                         with_btls_android_api=16 ;;
5615                 android-v8a)
5616                         with_btls_android_api=21 ;;
5617                 android-x86)
5618                         with_btls_android_api=16 ;;
5619                 android-x64)
5620                         with_btls_android_api=21 ;;
5621         esac
5624 if test "x$enable_btls" = "xno"; then
5625    enable_btls_lib=no
5628 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5630 btls_android=no
5631 if test "x$enable_btls" = "xyes"; then
5632         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5633         if test "x$CMAKE" = "xno"; then
5634                 AC_MSG_ERROR("cmake not found")
5635         fi
5637         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5638         AC_SUBST(BTLS_ROOT)
5640         btls_arch=
5641         btls_cflags=
5642         BTLS_CMAKE_ARGS=
5644         if test "x$host_win32" = "xyes"; then
5645                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5646         fi
5648         case "$BTLS_PLATFORM" in
5649         i386)
5650                 btls_arch=i386
5651                 btls_cflags="-m32"
5652                 case $host_os in
5653                         darwin*)
5654                                 btls_cflags="$btls_cflags -arch i386"
5655                                 ;;
5656                         mingw*|cygwin*)
5657                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5658                                 if test "x$HAVE_YASM" != "xyes"; then
5659                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5660                                 fi
5661                                 ;;
5662                 esac
5663                 ;;
5664         x86_64)
5665                 btls_arch=x86_64
5666                 case $host_os in
5667                         mingw*|cygwin*)
5668                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5669                                 if test "x$HAVE_YASM" != "xyes"; then
5670                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5671                                 fi
5672                                 ;;
5673                 esac
5674                 ;;
5675         arm)
5676                 btls_arch=arm
5677                 btls_cflags="-DOPENSSL_NO_ASM=1"
5678                 ;;
5679         armsoft)
5680                 btls_arch=arm
5681                 btls_cflags="-DOPENSSL_NO_ASM=1"
5682                 ;;
5683         aarch64)
5684                 btls_arch=aarch64
5685                 btls_cflags="-march=armv8-a+crypto"
5686                 ;;
5687         s390x)
5688                 btls_arch=s390x
5689                 ;;
5690         powerpc)
5691                 btls_arch=powerpc
5692                 case $host_os in
5693                         aix*|os400*)
5694                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5695                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5696                 esac
5697                 ;;
5698         android-armv5)
5699                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5700                 ;;
5701         android-armv6)
5702                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5703                 ;;
5704         android-armv7)
5705                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5706                 ;;
5707         android-v8a)
5708                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5709                 ;;
5710         android-x86)
5711                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5712                 ;;
5713         android-x64)
5714                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5715                 ;;
5716         riscv32)
5717                 btls_arch=riscv32
5718                 ;;
5719         riscv64)
5720                 btls_arch=riscv64
5721                 ;;
5722         *)
5723                 AC_MSG_ERROR(Invalid BTLS platform)
5724         esac
5726         if test "x$platform_android" = "xyes"; then
5727                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5728                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5729                 fi
5731                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5732                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5733                 fi
5735                 btls_android=yes
5736                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5737                 if test "x$with_btls_android_ndk" != "x"; then
5738                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5739                 else
5740                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5741                 fi
5742         fi
5744         if test "x$btls_arch" != "x"; then
5745                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5746         fi
5748         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5749         AC_SUBST(BTLS_ARCH)
5750         AC_SUBST(BTLS_CFLAGS)
5751         AC_SUBST(BTLS_PLATFORM)
5752         AC_SUBST(BTLS_CMAKE_ARGS)
5754         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5755 else
5756         enable_btls=no
5759 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5761 if test x$DISABLE_MCS_DOCS = xyes; then
5762    docs_dir=""
5763 else
5764    docs_dir=docs
5766 AC_SUBST(docs_dir)
5768 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5769 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5770 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5772 libmono_ldflags="$libmono_ldflags $LIBS"
5774 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5775 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5776 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5777 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5778 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5779 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5780 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5781 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5782 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5783 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5784 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5785 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5786 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5787 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5788 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5789 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5790 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5791 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5792 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5793 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5794 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5795 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5796 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5797 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5799 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5801 AC_SUBST(LIBC)
5802 AC_SUBST(INTL)
5803 AC_SUBST(SQLITE)
5804 AC_SUBST(SQLITE3)
5805 AC_SUBST(X11)
5806 AC_SUBST(GDKX11)
5807 AC_SUBST(GTKX11)
5808 AC_SUBST(XINERAMA)
5809 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5810 AC_SUBST(arch_target)
5812 #This must always be defined when building the runtime
5813 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5815 mono_build_root=`pwd`
5816 AC_SUBST(mono_build_root)
5818 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5819 if test x$host_win32 = xno; then
5820         if test x$enable_msvc = xyes; then
5821                 echo "Error, --enable-msvc only supported for Windows builds."
5822                 exit 1
5823         fi
5825 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5827 if test "x$enable_msvc" = "xyes"; then
5828         if test "x$support_boehm" = "xyes"; then
5829                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5830                 exit 1
5831         fi
5832         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5833         if test "x$host_cpu" = "xi686"; then
5834                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5835                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5836                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5837                 mono_runtime_wrapper=$mono_runtime
5838         else
5839                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5840                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5841                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5842                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
5843         fi
5844         AC_SUBST(mono_msvc_build_dir)
5845         AC_SUBST(mono_msvc_build_lib_dir)
5846         AC_SUBST(mono_msvc_build_bin_dir)
5847 else
5848         mono_runtime=mono/mini/mono
5849         mono_runtime_wrapper=$mono_runtime
5852 AC_SUBST(mono_runtime)
5853 AC_SUBST(mono_runtime_wrapper)
5855 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.1.0/csc.exe
5856 VBCS_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.1.0/VBCSCompiler.exe
5858 if test $csc_compiler = mcs; then
5859   CSC=$mcs_topdir/class/lib/build/mcs.exe
5860 else
5861   CSC=$CSC_LOCATION
5864 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5866 mono_cfg_root=$mono_build_root/runtime
5867 if test x$host_win32 = xyes; then
5868   if test "x$cross_compiling" = "xno"; then
5869     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5870     CSC=`cygpath -m -a $CSC`
5871     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5872     VBCS_LOCATION=`cygpath -m -a $VBCS_LOCATION`
5873   else
5874     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5875   fi
5876 else
5877   mono_cfg_dir=$mono_cfg_root/etc
5880 if test "x$platform_android" = "xyes"; then
5881   mono_cfg_dir=
5884 AC_SUBST(mono_cfg_dir)
5886 AC_SUBST(CSC)
5888 AC_CONFIG_FILES([po/mcs/Makefile.in])
5890 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5891 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5892 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5894 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5895 [   depth=../../../..
5896     case $srcdir in
5897     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5898     .) reldir=$depth ;;
5899     *) reldir=$depth/$srcdir ;;
5900     esac
5901     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5902     cd runtime/etc/mono/1.0
5903     rm -f machine.config
5904     $LN_S $reldir/data/net_1_1/machine.config machine.config
5905     cd $depth
5906 ],[LN_S='$LN_S'])
5908 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5909 [   depth=../../../..
5910     case $srcdir in
5911     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5912     .) reldir=$depth ;;
5913     *) reldir=$depth/$srcdir ;;
5914     esac
5915     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5916     cd runtime/etc/mono/2.0
5917     rm -f machine.config
5918     $LN_S $reldir/data/net_2_0/machine.config machine.config
5919     cd $depth
5920 ],[LN_S='$LN_S'])
5922 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5923 [   depth=../../../..
5924     case $srcdir in
5925     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5926     .) reldir=$depth ;;
5927     *) reldir=$depth/$srcdir ;;
5928     esac
5929     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5930     cd runtime/etc/mono/2.0
5931     rm -f web.config
5932     $LN_S $reldir/data/net_2_0/web.config web.config
5933     cd $depth
5934 ],[LN_S='$LN_S'])
5936 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5937 [   depth=../../..
5938     case $srcdir in
5939     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5940     .) reldir=$depth ;;
5941     *) reldir=$depth/$srcdir ;;
5942     esac
5943     $ac_aux_dir/install-sh -d runtime/etc/mono/
5944     cd runtime/etc/mono/
5945     rm -f browscap.ini
5946     $LN_S $reldir/data/browscap.ini browscap.ini
5947     cd $depth
5948 ],[LN_S='$LN_S'])
5950 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5951 [   depth=../../../../..
5952     case $srcdir in
5953     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5954     .) reldir=$depth ;;
5955     *) reldir=$depth/$srcdir ;;
5956     esac
5957     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5958     cd runtime/etc/mono/2.0/Browsers
5959     rm -f Compat.browser
5960     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5961     cd $depth
5962 ],[LN_S='$LN_S'])
5964 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5965 [   depth=../../../../..
5966     case $srcdir in
5967     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5968     .) reldir=$depth ;;
5969     *) reldir=$depth/$srcdir ;;
5970     esac
5971     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5972     cd runtime/etc/mono/4.0/Browsers
5973     rm -f Compat.browser
5974     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5975     cd $depth
5976 ],[LN_S='$LN_S'])
5978 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5979 [   depth=../../../../..
5980     case $srcdir in
5981     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5982     .) reldir=$depth ;;
5983     *) reldir=$depth/$srcdir ;;
5984     esac
5985     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5986     cd runtime/etc/mono/4.5/Browsers
5987     rm -f Compat.browser
5988     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5989     cd $depth
5990 ],[LN_S='$LN_S'])
5992 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5993 [   depth=../../../..
5994     case $srcdir in
5995     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5996     .) reldir=$depth ;;
5997     *) reldir=$depth/$srcdir ;;
5998     esac
5999     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6000     cd runtime/etc/mono/4.0
6001     rm -f machine.config
6002     $LN_S $reldir/data/net_4_0/machine.config machine.config
6003     cd $depth
6004 ],[LN_S='$LN_S'])
6006 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
6007 [   depth=../../../..
6008     case $srcdir in
6009     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6010     .) reldir=$depth ;;
6011     *) reldir=$depth/$srcdir ;;
6012     esac
6013     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6014     cd runtime/etc/mono/4.0
6015     rm -f web.config
6016     $LN_S $reldir/data/net_4_0/web.config web.config
6017     cd $depth
6018 ],[LN_S='$LN_S'])
6020 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
6021 [   depth=../../../..
6022     case $srcdir in
6023     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6024     .) reldir=$depth ;;
6025     *) reldir=$depth/$srcdir ;;
6026     esac
6027     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6028     cd runtime/etc/mono/4.5
6029     rm -f machine.config
6030     $LN_S $reldir/data/net_4_5/machine.config machine.config
6031     cd $depth
6032 ],[LN_S='$LN_S'])
6034 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
6035 [   depth=../../../..
6036     case $srcdir in
6037     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6038     .) reldir=$depth ;;
6039     *) reldir=$depth/$srcdir ;;
6040     esac
6041     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6042     cd runtime/etc/mono/4.5
6043     rm -f web.config
6044     $LN_S $reldir/data/net_4_5/web.config web.config
6045     cd $depth
6046 ],[LN_S='$LN_S'])
6048 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])
6049 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])
6050 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
6053 # Mono.Native Support
6054 # -------------------
6055 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
6056 # It is built as a stand-alone shared library and not bundled with the runtime because we
6057 # may need to build two different versions of it.
6059 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
6060 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
6062 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
6063 # implementation accordingly.  We build a single `libmono-native` shared library.
6065 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
6067 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
6068 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
6069 # depending on platform.
6071 # We build two versions of the shared library:
6072 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
6073 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
6075 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
6076 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
6077 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
6079 # This can be called by automated tests both to ensure that the library has been correctly installed and also
6080 # to verify that it's the correct version of it.
6083 AC_MSG_CHECKING([Mono.Native support])
6084 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
6085 if test x$disable_mono_native = xyes; then
6086         mono_native=no
6087 elif test x$target_osx = xyes; then
6088         MONO_NATIVE_CC=$CC
6089         MONO_NATIVE_CXX=$CXX
6090         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6091         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6092         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6093         MONO_NATIVE_CFLAGS=$CFLAGS
6094         MONO_NATIVE_LDFLAGS=$LDFLAGS
6096         mono_native=yes
6097         MONO_NATIVE_PLATFORM=macos
6098         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6100         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6101                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6103         if test x$mono_native_compat = xyes; then
6104                 mono_native_compat=yes
6105                 mono_native_text="Mac OSX (compat + unified v10.12)"
6106                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6107                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6108                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6109                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6110                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6112                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6113                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6114                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6115                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6116                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6117                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6118         else
6119                 mono_native_compat=no
6120                 mono_native_text="Mac OSX"
6121         fi
6122 elif test x$mono_native_platform_ios = xyes; then
6123         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6125         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6126                 if test x$mono_native_ios_sim = xyes; then
6127                         mono_native_ios_target=ios-simulator
6128                         mono_native_text="iOS Simulator"
6129                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6130                 else
6131                         mono_native_ios_target=iphoneos
6132                         mono_native_text="iOS Device"
6133                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6134                 fi
6135                 mono_native_unified_version="10.0"
6136                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6137         ], [
6138                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6139                         if test x$mono_native_ios_sim = xyes; then
6140                                 mono_native_ios_target=tvos-simulator
6141                                 mono_native_text="AppleTV Simulator"
6142                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6143                         else
6144                                 mono_native_ios_target=tvos
6145                                 mono_native_text="AppleTV Device"
6146                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6147                         fi
6148                         mono_native_unified_version="10.0"
6149                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6150                 ], [
6151                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6152                                 if test x$mono_native_ios_sim = xyes; then
6153                                         mono_native_ios_target=watchos-simulator
6154                                         mono_native_text="Apple Watch Simulator"
6155                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6156                                 else
6157                                         mono_native_ios_target=watchos
6158                                         mono_native_text="Apple Watch Device"
6159                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6160                                 fi
6161                                 mono_native_unified_version="5.0"
6162                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6163                         ], [
6164                                 AC_MSG_ERROR([Unknown iOS Target])
6165                         ])
6166                 ])
6167         ])
6169         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6171         if test x$with_bitcode = xyes; then
6172                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6173                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6174         else
6175                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6176         fi
6178         if test x$enable_gss = xyes; then
6179                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6180         fi
6182         MONO_NATIVE_CC=$CC
6183         MONO_NATIVE_CXX=$CXX
6184         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6185         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6186         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6187         MONO_NATIVE_CFLAGS=$CFLAGS
6188         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6190         if test x$mono_native_compat = xyes; then
6191                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6192                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6193                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6194                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6195                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6196                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6198                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6199                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6200                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6201                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6202                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6203                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6204         fi
6206         mono_native=yes
6207         MONO_NATIVE_PLATFORM=ios
6208 elif test x$host_linux = xyes; then
6209         mono_native_text="Linux"
6210         MONO_NATIVE_CC=$CC
6211         MONO_NATIVE_CXX=$CXX
6212         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6213         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6214         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6215         MONO_NATIVE_CFLAGS=$CFLAGS
6216         MONO_NATIVE_LDFLAGS=$LDFLAGS
6218         mono_native=yes
6219         mono_native_compat=no
6220         MONO_NATIVE_PLATFORM=linux
6222         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6223 elif test x$target_wasm = xyes; then
6224         mono_native_text="wasm"
6225         MONO_NATIVE_CC=$CC
6226         MONO_NATIVE_CXX=$CXX
6227         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6228         # The system.native code uses _WASM_ to check for wasm
6229         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6230         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6231         MONO_NATIVE_CFLAGS=$CFLAGS
6232         MONO_NATIVE_LDFLAGS=$LDFLAGS
6234         mono_native=yes
6235         mono_native_compat=no
6236         MONO_NATIVE_PLATFORM=linux
6238         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6239 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6240         mono_native_text="AIX"
6241         MONO_NATIVE_CC=$CC
6242         MONO_NATIVE_CXX=$CXX
6243         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6244         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6245         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6246         MONO_NATIVE_CFLAGS=$CFLAGS
6247         dnl flock in AIX exists in libbsd (not the same as freedesktop.org
6248         dnl libbsd) which Mono.Native needs.
6249         dnl Because of the way that the library is built by default, unresolved
6250         dnl references are kept and resolved at runtime. Often, the dependency
6251         dnl chain means libbsd is loaded anyways, but not necessarily. It's
6252         dnl better to explicitly link it, even though it has it shadows libc's
6253         dnl ioctl with its own. (As for the other unresolved imports, those
6254         dnl should be provided by the Mono runtime loaded.)
6255         MONO_NATIVE_LDFLAGS="$LDFLAGS -lbsd"
6257         mono_native=yes
6258         mono_native_compat=no
6259         MONO_NATIVE_PLATFORM=aix
6261         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6262 elif case $host_os in freebsd*) true;; *) false;; esac; then
6263         mono_native_text="FreeBSD"
6264         MONO_NATIVE_CC=$CC
6265         MONO_NATIVE_CXX=$CXX
6266         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6267         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6268         MONO_NATIVE_CFLAGS=$CFLAGS
6269         MONO_NATIVE_LDFLAGS=$LDFLAGS
6271         mono_native=yes
6272         mono_native_compat=no
6273         MONO_NATIVE_PLATFORM=freebsd
6274         AC_MSG_CHECKING([Mono.Native support])
6275         AC_MSG_RESULT(freebsd)
6277         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_FREEBSD"
6278 elif test x$platform_android = xyes; then
6279         mono_native_text="Android"
6280         MONO_NATIVE_CC=$CC
6281         MONO_NATIVE_CXX=$CXX
6282         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6283         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6284         MONO_NATIVE_CFLAGS=$CFLAGS
6285         MONO_NATIVE_LDFLAGS=$LDFLAGS
6286         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6288         mono_native=yes
6289         mono_native_compat=no
6290         MONO_NATIVE_PLATFORM=android
6292         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6293 else
6294         mono_native=no
6295         mono_native_text="no"
6298 AC_MSG_RESULT($mono_native_text)
6300 if test x$mono_native_compat = xyes; then
6301         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6302 else
6303         MONO_NATIVE_LIBRARY_NAME=libmono-native
6306 AC_SUBST(MONO_NATIVE_PLATFORM)
6307 AC_SUBST(MONO_NATIVE_CC)
6308 AC_SUBST(MONO_NATIVE_CXX)
6309 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6310 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6311 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6312 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6313 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6314 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6315 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6316 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6317 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6318 AC_SUBST(MONO_NATIVE_CFLAGS)
6319 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6320 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6321 AC_SUBST(MONO_NATIVE_LDFLAGS)
6322 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6323 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6324 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6325 AC_SUBST(MONO_NATIVE_LIBADD)
6327 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6328 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6329 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6330 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6331 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6332 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6333 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6334 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_FREEBSD, test x$MONO_NATIVE_PLATFORM = xfreebsd)
6336 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6337 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6338 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6339 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6340 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6342 ### C++ Linker selection
6344 # We have to lie to autotools, sometimes.
6346 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6347 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6348 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6349 # except if we're linking with LLVM which relies on it.
6351 # Explanation of the hack:
6353 # According to
6354 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6355 # automake chooses the linker that it used to compile a target based on the
6356 # _SOURCES for that target.  If the target is comprised of only C code, it
6357 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6358 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6359 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6361 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6362 # or libc++) linked in - even when Mono is written in C++, we take care not to
6363 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6364 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6365 # C++ linker - LLVM doesn't have the same restrictions.
6367 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6368 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6369 #  automake's autodetection and lets us use the linker that we want.
6371 if test "x$enable_llvm_runtime" = "xyes"; then
6372         AC_SUBST(MONO_CXXLD, [$CXX])
6373 else
6374         AC_SUBST(MONO_CXXLD, [$CC])
6377 ### Set -Werror options
6379 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6381 if test x"$GCC" = xyes; then
6383         if test "x$with_jemalloc" != "xyes"; then
6385                 # incompatible-pointer-types requires gcc circa 5.x
6387                 ORIG_CFLAGS=$CFLAGS
6388                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6389                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6390                 AC_TRY_COMPILE([],[
6391                 ], [
6392                         AC_MSG_RESULT(yes)
6393                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6394                 ], [
6395                         AC_MSG_RESULT(no)
6396                         CFLAGS=$ORIG_CFLAGS
6397                 ])
6399                 CFLAGS="$CFLAGS -Werror=return-type"
6400         fi
6402         # Implicit function declarations are not 64 bit safe
6403         # Do this late, since this causes lots of configure tests to fail
6404         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6405         # jay has a lot of implicit declarations
6406         JAY_CFLAGS="-Wno-implicit-function-declaration"
6409 AC_SUBST(CFLAGS)
6410 AC_SUBST(CPPFLAGS)
6411 AC_SUBST(LDFLAGS)
6413 # Update all submodules recursively to ensure everything is checked out
6414 if test "x$with_core" != "xonly"; then
6415         (cd $srcdir && scripts/update_submodules.sh)
6418 AC_OUTPUT([
6419 Makefile
6420 mono-uninstalled.pc
6421 acceptance-tests/Makefile
6422 llvm/Makefile
6423 scripts/mono-find-provides
6424 scripts/mono-find-requires
6425 mk/Makefile
6426 mono/Makefile
6427 mono/btls/Makefile
6428 mono/native/Makefile
6429 mono/utils/Makefile
6430 mono/utils/jemalloc/Makefile
6431 mono/metadata/Makefile
6432 mono/dis/Makefile
6433 mono/cil/Makefile
6434 mono/arch/Makefile
6435 mono/arch/x86/Makefile
6436 mono/arch/amd64/Makefile
6437 mono/arch/ppc/Makefile
6438 mono/arch/sparc/Makefile
6439 mono/arch/s390x/Makefile
6440 mono/arch/arm/Makefile
6441 mono/arch/arm64/Makefile
6442 mono/arch/mips/Makefile
6443 mono/arch/riscv/Makefile
6444 mono/sgen/Makefile
6445 mono/native/platform-type.c
6446 mono/native/platform-type-compat.c
6447 mono/native/platform-type-unified.c
6448 mono/tests/Makefile
6449 mono/tests/assembly-load-reference/Makefile
6450 mono/tests/tests-config
6451 mono/tests/gc-descriptors/Makefile
6452 mono/tests/testing_gac/Makefile
6453 mono/tests/fullaot-mixed/Makefile
6454 mono/tests/llvmonly-mixed/Makefile
6455 mono/unit-tests/Makefile
6456 mono/benchmark/Makefile
6457 mono/mini/Makefile
6458 mono/profiler/Makefile
6459 mono/eglib/Makefile
6460 mono/eglib/eglib-config.h
6461 mono/eglib/test/Makefile
6462 m4/Makefile
6463 ikvm-native/Makefile
6464 scripts/Makefile
6465 man/Makefile
6466 docs/Makefile
6467 data/Makefile
6468 data/net_2_0/Makefile
6469 data/net_4_0/Makefile
6470 data/net_4_5/Makefile
6471 data/net_2_0/Browsers/Makefile
6472 data/net_4_0/Browsers/Makefile
6473 data/net_4_5/Browsers/Makefile
6474 data/mint.pc
6475 data/mono-2.pc
6476 data/monosgen-2.pc
6477 data/mono.pc
6478 data/mono-cairo.pc
6479 data/mono-options.pc
6480 data/mono-lineeditor.pc
6481 data/monodoc.pc
6482 data/dotnet.pc
6483 data/dotnet35.pc
6484 data/wcf.pc
6485 data/cecil.pc
6486 data/system.web.extensions_1.0.pc
6487 data/system.web.extensions.design_1.0.pc
6488 data/system.web.mvc.pc
6489 data/system.web.mvc2.pc
6490 data/system.web.mvc3.pc
6491 data/aspnetwebstack.pc
6492 data/reactive.pc
6493 samples/Makefile
6494 support/Makefile
6495 data/config
6496 tools/Makefile
6497 tools/locale-builder/Makefile
6498 tools/sgen/Makefile
6499 tools/pedump/Makefile
6500 runtime/Makefile
6501 msvc/Makefile
6502 po/Makefile
6505 if test x$host_win32 = xyes; then
6506    # Get rid of 'cyg' prefixes in library names
6507    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6508    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6509    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6510    # executable doesn't work...
6511    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6514 if test x$host_darwin = xyes; then
6515    # This doesn't seem to be required and it slows down parallel builds
6516    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6520   case $prefix in
6521   NONE) prefix=$ac_default_prefix ;;
6522   esac
6523   case $exec_prefix in
6524   NONE) exec_prefix='${prefix}' ;;
6525   esac
6527   #
6528   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6529   # any existing config.make.  This allows people to share the same source tree
6530   # with different build directories, one native and one cross
6531   #
6532   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6534     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6536     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6537     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6538     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6539     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6540     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6541     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6542     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6543     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6544     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6545     echo "RID = $RID" >> $mcs_topdir/build/config.make
6546     echo "COREARCH = $COREARCH" >> $mcs_topdir/build/config.make
6547     echo "CORETARGETS = $CORETARGETS" >> $mcs_topdir/build/config.make
6548     echo "VERSION = $VERSION" >> $mcs_topdir/build/config.make
6550     case $INSTALL in
6551     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6552     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6553     esac
6555     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6557     export VERSION
6558     [myver=$($AWK 'BEGIN {
6559       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6560       if(length(vsplit [1]) > 4) {
6561         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6562       }
6563       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6564     }')]
6566     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6567     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6569     if test x$host_darwin = xyes; then
6570       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6571       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6572       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6573     elif test x$host_win32 = xyes; then
6574       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6575       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6576       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6577     elif test x$host_linux = xyes; then
6578       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6579       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6580       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6581     else
6582       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6583       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6584       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6585     fi
6587     echo "PLATFORM_AOT_PREFIX = $PLATFORM_AOT_PREFIX" >> $mcs_topdir/build/config.make
6588     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6589       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6590     fi
6592         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6593            enable_system_aot=yes
6594         fi
6596     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6597       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6598     fi
6600     if test x$DISABLE_MCS_DOCS = xyes; then
6601       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6602     fi
6604     if test x$has_extension_module != xno; then
6605         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6606     fi
6607     
6608     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6609     
6610     if test "x$test_bcl_opt" = "xyes"; then    
6611       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6612     fi
6614     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6615     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6616     echo "VBCS_LOCATION?=$VBCS_LOCATION" >> $srcdir/$mcsdir/build/config.make
6618     if test $csc_compiler = mcs; then
6619       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6620     fi
6622     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6623       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6624       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6625       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6626     fi
6628     if test "x$AOT_MODE" != "x" ; then
6629       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6630     fi
6632     if test "x$enable_btls" = "xyes"; then
6633       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6634     fi
6636     if test "x$mono_native" = "xyes"; then
6637       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6638     else
6639       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6640     fi
6642     if test x$mono_native_compat = xyes; then
6643       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6644     else
6645       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6646     fi
6648     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6649     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6650     if test x$enable_compiler_server = xyes; then
6651       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6652     else
6653       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6654     fi
6655     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6657   fi
6661 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6663 btls_platform_string=
6664 if test x$enable_btls = xyes; then
6665         if test x$btls_android = xyes; then
6666                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6667         else
6668                 btls_platform_string=" ($BTLS_PLATFORM)"
6669         fi
6672 thread_suspend_msg=
6673 if test x$buildsgen = xyes; then
6674         if test x$enable_cooperative_suspend != xno; then
6675                 thread_suspend_msg="Suspend:       Cooperative"
6676         elif test x$enable_hybrid_suspend != xno; then
6677                 thread_suspend_msg="Suspend:       Hybrid"
6678         else
6679                 thread_suspend_msg="Suspend:       Preemptive"
6680         fi
6682         
6683 echo "
6684         mcs source:    $mcsdir
6685         C# Compiler:   $csc_compiler
6687    Engine:
6688         Host:          $host
6689         Target:        $target
6690         GC:            $gc_msg 
6691         $thread_suspend_msg
6692         TLS:           $with_tls
6693         SIGALTSTACK:   $with_sigaltstack
6694         Engine:        $jit_status
6695         BigArrays:     $enable_big_arrays
6696         DTrace:        $enable_dtrace
6697         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6698         Spectre:       $spectre_mitigation_status
6699         Mono.Native:   $mono_native_text
6701    Libraries:
6702         .NET 4.x:        $with_profile4_x
6703         Xamarin.Android: $with_monodroid
6704         Xamarin.iOS:     $with_monotouch
6705         Xamarin.WatchOS: $with_monotouch_watch
6706         Xamarin.TVOS:    $with_monotouch_tv
6707         Xamarin.Mac:     $with_xammac
6708         Windows AOT:     $with_winaot
6709         Orbis:           $with_orbis
6710         Unreal:          $with_unreal
6711         WebAssembly:     $with_wasm
6712         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6713         JNI support:     $jdk_headers_found
6714         libgdiplus:      $libgdiplus_msg
6715         zlib:            $zlib_msg
6716         BTLS:            $enable_btls$btls_platform_string
6717         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6718         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6719         .NET Core:       $with_core
6720         $disabled
6722 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6723    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)