Add support for Windows x64 Full AOT + LLVM + Interpreter on CI. (#15276)
[mono-project.git] / configure.ac
blob9140f0c677f6e83da0e34399b9ff74527b1d21b4
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.5.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=62731146-81CF-4D61-826D-9A8DDED14432
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 IMPORTANT: For svr4 sonames on AIX, you should set
474                 dnl `OBJECT_MODE=64` when configuring.
475                 dnl libtool cannot generate functioning svr4 sonames on
476                 dnl 64-bit without it.
477                 dnl Unfortunately, everything is complicated by the fact that
478                 dnl gcc doesn't respect this variable. (otherwise we could set
479                 dnl it for build time for configure and make)
480                 dnl On IBM i PASE using IBM's packages, GCC *does* respect this
481                 dnl variable, and builds are 64-bit by default. svr4 sonames
482                 dnl must still be specified when configuring on i, however.
483                 dnl As such, because Mono doesn't support 32-bit AIX or PASE,
484                 dnl set up a 64-bit build (assming GCC; XLC not supported)
485                 dnl regardless of what variable is used.
486                 case $host_os in
487                         aix*)
488                         if test "x$OBJECT_MODE" = "x64" && test "x$CC" = "x" && test "x$CXX" = "x"; then
489                                 dnl HACK: Set -maix64 at the GCC invocation
490                                 dnl level explicitly to work around the fact
491                                 dnl GCC in default maix32 mode explodes when
492                                 dnl binutils respects OBJECT_MODE.
493                                 dnl When that check occurs, flags are not
494                                 dnl passed to to the compiler, so GCC has no
495                                 dnl chance to change its mode.
496                                 dnl Otherwise, it may enter a state where it
497                                 dnl runs, but uses the libtool "compile"
498                                 dnl wrapper, which subtly breaks other things.
499                                 dnl This should propagate to all uses of CC.
500                                 dnl This is only set if not manually set.
501                                 CC="gcc -maix64"
502                                 CXX="g++ -maix64"
503                                 echo
504                         fi
505                         ;;
506                         dnl Not needed on i because it defaults to 64-bit and
507                         dnl has a GCC smart enough to respect OBJECT_MODE.
508                 esac
509                 dnl We still set this for *FLAGS, however, because we may not
510                 dnl be setting OBJECT_MODE.
511                 LDFLAGS="$LDFLAGS -maix64"
512                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
513                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
514                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
515                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
516                 dnl specifiy 64-bit mode for tools. (OBJECT_MODE is finicky with cmake.)
517                 dnl XXX: We should stop the hardcoding madness
518                 AR="/usr/bin/ar -X64"
519                 NM="/usr/bin/nm -X64"
520                 STRIP="/usr/bin/strip -X64"
521                 RANLIB="/usr/bin/ranlib -X64"
522                 dnl SGen is the future (changes to Boehm support code would be
523                 dnl required if you wish to re-enable Boehm)
524                 support_boehm=no
525                 with_gc=sgen
526                 need_link_unlink=yes
527                 use_sigposix=yes
528                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
529                 with_sigaltstack=no
530                 dnl use pthread TLS, __thread has issues with the compiler flags we use
531                 with_tls=pthread
532                 dnl ppc Linux is the same? test further
533                 disable_munmap=yes
534                 RID="aix-ppc64"
535                 CORETARGETS="-p:TargetsUnix=true"
536                 ;;
537         *)
538                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
539                 libdl="-ldl"
540                 ;;
541 esac
543 AC_MSG_RESULT(ok)
545 if test x$need_link_unlink = xyes; then
546    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
549 if test x$host_win32 = xyes; then
550    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
553 if test x$target_win32 = xyes; then
554    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
557 if test x$host_darwin = xyes; then
558    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
561 # Defined for all targets/platforms using classic Windows API support.
562 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
563 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
565 AC_SUBST(extra_runtime_ldflags)
566 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
567 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
568 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
569 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
570 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
571 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
572 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
573 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
574 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
576 if test -z "$HOST_DARWIN_TRUE"; then :
577 PLATFORM_AOT_SUFFIX=.dylib
578 PLATFORM_AOT_PREFIX=lib
581 if test -z "$HOST_LINUX_TRUE"; then :
582 PLATFORM_AOT_SUFFIX=.so
583 PLATFORM_AOT_PREFIX=lib
586 if test -z "$HOST_WIN32_TRUE"; then :
587 PLATFORM_AOT_SUFFIX=.dll
588 PLATFORM_AOT_PREFIX=
591 AC_SUBST(PLATFORM_AOT_SUFFIX)
592 AC_SUBST(PLATFORM_AOT_PREFIX)
594 if test -z "$HOST_WASM_TRUE"; then :
595 AC_DEFINE(HAVE_UTIME)
596 AC_DEFINE(HAVE_UTIMES)
599 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
601 AC_CHECK_TOOL(CC, gcc, gcc)
602 AC_PROG_CC
603 AC_CHECK_TOOL(CXX, g++, g++)
604 AC_PROG_CXX
605 AM_PROG_AS
606 AC_PROG_INSTALL
607 AC_PROG_AWK
608 AM_PROG_CC_C_O
609 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
610 : ${CCAS='$(CC)'}
611 # Set ASFLAGS if not already set.
612 : ${CCASFLAGS='$(CFLAGS)'}
613 AC_SUBST(CCAS)
614 AC_SUBST(CCASFLAGS)
616 if test "x$CXX" = "xno"; then
617         AC_MSG_ERROR([No c++ compiler found. You need to install a c++ compiler])
620 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
621 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
622 if test "x$CXX" = "xg++"; then
623         if test "x$GXX" != "xyes"; then
624                 # automake/libtool is so broken, it requires g++ even if the c++ sources
625                 # are inside automake conditionals
626                 AC_MSG_ERROR([You need to install g++])
627         fi
630 dnl may require a specific autoconf version
631 dnl AC_PROG_CC_FOR_BUILD
632 dnl CC_FOR_BUILD not automatically detected
633 CC_FOR_BUILD=$CC
634 CFLAGS_FOR_BUILD=$CFLAGS
635 BUILD_EXEEXT=
636 if test "x$cross_compiling" = "xyes"; then
637         CC_FOR_BUILD=cc
638         CFLAGS_FOR_BUILD=
639         BUILD_EXEEXT=""
641 AC_SUBST(CC_FOR_BUILD)
642 AC_SUBST(CFLAGS_FOR_BUILD)
643 AC_SUBST(HOST_CC)
644 AC_SUBST(BUILD_EXEEXT)
646 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
647 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
649 # Set STDC_HEADERS
650 AC_HEADER_STDC
651 AC_LIBTOOL_WIN32_DLL
652 # This causes monodis to not link correctly
653 #AC_DISABLE_FAST_INSTALL
655 #lookup makedev() header
656 AC_HEADER_MAJOR
658 AM_PROG_LIBTOOL
659 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
660 DOLT
662 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
663 AC_SUBST(export_ldflags)
665 # Test whenever ld supports -version-script
666 AC_PROG_LD
667 AC_PROG_LD_GNU
669 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)
670 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)
671 AC_CHECK_HEADER(unistd.h, [HAVE_UNISTD_H=1], [HAVE_UNISTD_H=0])
672 AC_SUBST(HAVE_UNISTD_H)
673 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
674                   [], [], [#include <stddef.h>
675                   #include <sys/socket.h>
676                   #include <linux/socket.h>])
678 AC_CHECK_HEADERS(sys/user.h, [], [],
680 #ifdef HAVE_SYS_PARAM_H
681 # include <sys/param.h>
682 #endif
685 AC_CHECK_HEADERS(linux/serial.h)
687 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
688 if test x$have_zlib = xyes; then
689    AC_TRY_COMPILE([#include <zlib.h>], [
690    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
691    #else
692    #error No good zlib found
693    #endif
694    ],[
695         AC_MSG_RESULT(Using system zlib)
696         zlib_msg="system zlib"
697         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
698    ],[
699         AC_MSG_RESULT(Using embedded zlib)
700         have_zlib=no
701         zlib_msg="bundled zlib"
702    ])
705 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=])
706 if test "x$STATIC_ZLIB_PATH" != "x"; then
707         have_static_zlib=yes
708         AC_SUBST(STATIC_ZLIB_PATH)
711 AM_CONDITIONAL(HAVE_STATIC_ZLIB, test x$have_static_zlib = xyes)
712 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
713 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
715 # for mono/metadata/debug-symfile.c
716 AC_CHECK_HEADERS(elf.h)
718 # for support
719 AC_CHECK_HEADERS(poll.h)
720 AC_CHECK_HEADERS(sys/poll.h)
721 AC_CHECK_HEADERS(sys/wait.h)
722 AC_CHECK_HEADERS(grp.h)
723 AC_CHECK_HEADERS(syslog.h)
724 AC_CHECK_FUNCS(vsyslog)
726 # for mono/dis
727 AC_CHECK_HEADERS(wchar.h)
729 # for Linux statfs support
730 AC_CHECK_HEADERS(linux/magic.h)
732 # For Android NDK unified headers
733 if test x$platform_android = xyes; then
734         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
735         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
736         AC_CHECK_HEADERS(android/ndk-version.h)
738         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
739         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
740         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
741         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
742         # doesn't contain the required definitions (NDK 14)
743         if test x$have_android_signal_inlines = xyes; then
744                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
745                 AC_COMPILE_IFELSE([
746                         AC_LANG_PROGRAM([#include <signal.h>
747                                 #include <android/legacy_signal_inlines.h>],[
748                                 int i;
749                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
750                                 }
751                         ])],[
752                                 AC_MSG_RESULT(yes)
753                                 android_sigrtminmax_work=yes
754                         ],[
755                                 AC_MSG_RESULT(no)
756                                 android_sigrtminmax_work=no
757                         ]
758                 )
760                 if test x$android_sigrtminmax_work = xno; then
761                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
762                 fi
763         fi
765         # Attempt to detect whether we're using Android NDK unified headers
766         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
767         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
769         android_unified_headers=no
770         if test x$have_android_api_level = xyes; then
771                 if test x$have_android_versioning = xyes; then
772                         AC_MSG_CHECKING([whether using Android NDK unified headers])
774                         # Both macros are defined only in the NDK unified headers
775                         AC_COMPILE_IFELSE([
776                                 AC_LANG_PROGRAM([
777                                         #include <android/api-level.h>
778                                         #include <android/versioning.h>
779                                 ],[
780                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
781                                         #else
782                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
783                                         #endif
784                                 ])],[
785                                         AC_MSG_RESULT(yes)
786                                         android_unified_headers=yes
787                                 ],[
788                                         AC_MSG_RESULT(no)
789                                         android_unified_headers=no
790                                 ]
791                         )
792                 fi
793         fi
795         if test x$android_unified_headers = xyes; then
796                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
797         fi
798 fi # Android
800 # not 64 bit clean in cross-compile
801 AC_CHECK_SIZEOF(void *)
802 AC_CHECK_SIZEOF(long)
804 AC_CHECK_SIZEOF(int)
805 AC_CHECK_SIZEOF(long long)
807 AC_CACHE_CHECK([for clang],
808         mono_cv_clang,[
809         AC_TRY_COMPILE([], [
810                 #ifdef __clang__
811                 #else
812                 #error "FAILED"
813                 #endif
814         ],
815         [mono_cv_clang=yes],
816         [mono_cv_clang=no],
817         [])
820 AC_ARG_ENABLE(visibility-hidden,
821 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
822    disable_visibility_hidden=yes, disable_visibility_hidden=no)
824 WARN=''
825 if test x"$GCC" = xyes; then
826                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
827                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
829                 # We require C99 with some GNU extensions, e.g. `linux` macro
830                 CFLAGS="$CFLAGS -std=gnu99"
832                 # The runtime code does not respect ANSI C strict aliasing rules
833                 CFLAGS="$CFLAGS -fno-strict-aliasing"
835                 # We rely on signed overflow to behave
836                 CFLAGS="$CFLAGS -fwrapv"
838                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
839                 if test x"$disable_visibility_hidden" = xno; then
840                    # Don't export any symbols by default
841                    SHARED_CFLAGS="-fvisibility=hidden"
842                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
843                 fi
845                 ORIG_CFLAGS=$CFLAGS
846                 # Check for the normal version, since gcc ignores unknown -Wno options
847                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
848                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
849                 AC_TRY_COMPILE([],[
850                 ], [
851                    AC_MSG_RESULT(yes)
852                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
853                 ], [
854                    AC_MSG_RESULT(no)
855                    CFLAGS=$ORIG_CFLAGS
856                 ])
858                 if test "x$mono_cv_clang" = "xyes"; then
859                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
860                    WARN="$WARN -Qunused-arguments"
861                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
862                    # We rely on zero length arrays in structs
863                    WARN="$WARN -Wno-zero-length-array"
864                 fi
865 else
866         # The Sun Forte compiler complains about inline functions that access static variables
867         # so disable all inlining.
868         case "$host" in
869         *-*-solaris*)
870                 CFLAGS="$CFLAGS -Dinline="
871                 ;;
872         esac
874 CFLAGS="$WARN $CFLAGS -g"
875 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
876 CPPFLAGS="$WARN $CPPFLAGS -g"
878 # Where's the 'mcs' source tree?
879 if test -d $srcdir/mcs; then
880   mcsdir=mcs
881 else
882   mcsdir=../mcs
885 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
886         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
887                 mcsdir=$with_mcs_path
888         fi
891 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
893 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
894 if test x$with_core = xonly; then
895     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
896     with_runtime_preset=netcore
898 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
901 # A sanity check to catch cases where the package was unpacked
902 # with an ancient tar program (Solaris)
904 AC_ARG_ENABLE(solaris-tar-check,
905 [  --disable-solaris-tar-check    disable solaris tar check],
906    do_solaris_tar_check=no, do_solaris_tar_check=yes)
908 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
909         AC_MSG_CHECKING(integrity of package)
910         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
911         then
912                 AC_MSG_RESULT(ok)
913         else
914                 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"
915                 AC_MSG_ERROR([$errorm])
916         fi
919 if test "x$with_mcs_path" != "x"; then
920 mcs_topdir=$(cd "$mcsdir" && pwd)
921 mcs_topdir_from_srcdir=$mcs_topdir
922 else
923 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
924 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
927 # Convert mcs_topdir* paths to Windows syntax.
928 if test x$cross_compiling$host_win32 = xnoyes; then
929   mcs_topdir=$(cygpath -m $mcs_topdir)
930   case $mcs_topdir_from_srcdir in
931     /cygdrive/*)
932         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
933         ;;
934   esac
937 AC_SUBST([mcs_topdir])
938 AC_SUBST([mcs_topdir_from_srcdir])
940 # gettext: prepare the translation directories. 
941 # we do not configure the full gettext, as we consume it dynamically from C#
942 AM_PO_SUBDIRS
944 if test "x$USE_NLS" = "xyes"; then
945    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
947    if test "x$HAVE_MSGFMT" = "xno"; then
948           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
949    fi
952 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
954 pkg_config_path=
955 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
956         if test x$with_crosspkgdir = "x"; then
957                 if test -s $PKG_CONFIG_PATH; then
958                         pkg_config_path=$PKG_CONFIG_PATH
959                 fi
960         else
961                 pkg_config_path=$with_crosspkgdir
962                 PKG_CONFIG_PATH=$pkg_config_path
963                 export PKG_CONFIG_PATH
964         fi
967 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
968 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
969 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
971 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
972 if test x$werror_flag = xyes; then
973         WERROR_CFLAGS="-Werror"
975 AC_SUBST([WERROR_CFLAGS])
976 AC_SUBST([SHARED_CFLAGS])
978 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
979   
980 AC_SUBST(GLIB_CFLAGS)
982 # Enable support for fast thread-local storage
983 # Some systems have broken support, so we allow to disable it.
984 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
986 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
987 # This does not work on some platforms (bug #55253)
988 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
990 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
991 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
992 # Same as --with-shared_mono=no
993 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
995 if test "x$enable_static" = "xno"; then
996    with_static_mono=no
999 if test "x$enable_shared" = "xno"; then
1000    with_shared_mono=no
1003 if test "x$enable_libraries" = "xno"; then
1004    with_shared_mono=no
1007 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
1009 if test "x$host_win32" = "xyes"; then
1010    # Boehm GC requires the runtime to be in its own dll
1011    with_static_mono=no
1014 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
1015 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
1016 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
1017 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
1019 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
1020 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
1021         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
1022         ORIG_CFLAGS=$CFLAGS
1023         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
1024         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
1025         AC_TRY_COMPILE([], [
1026         ], [
1027            AC_MSG_RESULT(yes)
1028            # Pass it to libgc as well
1029            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
1030         ], [
1031            AC_MSG_RESULT(no)
1032            CFLAGS=$ORIG_CFLAGS
1033         ])
1036 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
1038 if test x$enable_small_config = xyes; then
1039         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
1040         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
1043 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)
1045 DISABLED_FEATURES=none
1046 csc_compiler=default
1047 endian=unknown
1048 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
1049 AC_MSG_CHECKING([CSharp compiler to use])
1050 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
1051    if test x$withval = xmcs; then
1052        csc_compiler=mcs
1053    elif test x$withval = xroslyn; then
1054        csc_compiler=roslyn
1055    elif test x$withval = xdefault; then
1056        :
1057    else
1058        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
1059    fi
1060 ],[csc_compiler=default])
1062 if test $csc_compiler = default; then
1063    if test $endian = big; then
1064       csc_compiler=mcs
1065    elif test $endian = little; then
1066       case "$host" in
1067         powerpc*) csc_compiler=mcs ;;
1068         *) csc_compiler=roslyn ;;
1069       esac
1070    else
1071       csc_compiler=mcs
1072    fi
1074 AC_MSG_RESULT($csc_compiler)
1076 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
1077 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
1078 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])
1081 if test x$target_win32 = xyes; then
1082 with_jemalloc=no
1083 with_jemalloc_assert=no
1084 with_jemalloc_always=no
1087 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
1088 if test "x$with_jemalloc_assert" = "xyes"; then
1089 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
1090 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
1091 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
1094 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
1095 if test "x$with_jemalloc_always" = "xyes"; then
1096 with_jemalloc=yes
1097 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
1098 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
1099 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
1102 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
1103 if test "x$with_jemalloc" = "xyes"; then
1104 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
1105 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
1106 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
1108 if test "x$target_mach" = "xyes"; then
1109         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
1112 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
1113 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
1115 AC_SUBST(JEMALLOC_CFLAGS)
1116 AC_SUBST(JEMALLOC_CPPFLAGS)
1117 AC_SUBST(JEMALLOC_LDFLAGS)
1118 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
1121 # Terminology:
1122 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
1123 # MERP - The MS telemetry profile. Not for general use.
1124 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
1126 # 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.
1128 #--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.
1129 #--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.
1130 #--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.
1131 #--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.
1133 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])
1134 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])
1135 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1137 if test "x$with_crash_privacy" = "xyes"; then
1138 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1141 if test "x$with_structured_crashes" = "xno"; then
1142 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1145 case "$host" in
1146         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1147                 crash_reporting=no
1148                 ;;
1149 esac
1151 if test "x$crash_reporting" != "xyes"; then
1152 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1153 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1156 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1157 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1159 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1160 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1162 if test x$enable_monodroid = xyes; then
1163         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1166 if test x$enable_monotouch = xyes; then
1167         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1170 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1172 # mono/corefx/native has a lot of invalid C++98 in its headers
1173 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1174 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1175 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1176 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1178 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1179 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1180 # and add it whenever we're running clang on Darwin.
1181 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1182         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1185 AC_SUBST(CXXFLAGS_COMMON)
1187 if test "x$enable_cxx" = "xyes"; then
1189         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1191         # -std=gnu99 -xc++ is not allowed and errors.
1192         CXX_REMOVE_CFLAGS=-std=gnu99
1193         # These give warnings and should be removed. They are C-only.
1194         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1195         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1196         # Likewise with CentOS 6 gcc 4.4.
1197         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1199         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1200         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1201         # generates a warning every time we run gcc which is very unsightly.
1202         # The warning is for e.g. sprintf(foo, "") which can just be
1203         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1204         # and completely legal and valid.
1205         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1206         # Alternatively, just run $CXX -xc++ -c /dev/null.
1207         AC_LANG_PUSH(C++)
1208         ORIG_CXXFLAGS=$CXXFLAGS
1209         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1210         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1211         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1212                                  [ AC_MSG_RESULT(no)
1213                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1214         CXXFLAGS=$ORIG_CXXFLAGS
1215         AC_LANG_POP(C++)
1217 AC_SUBST(CXX_ADD_CFLAGS)
1218 AC_SUBST(CXX_REMOVE_CFLAGS)
1221 # Set the build profiles and options before things which use them
1224 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])
1225 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1226 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1227 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])
1228 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])
1229 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1230 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1231 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])
1232 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])
1233 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])
1234 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1235 AC_ARG_WITH(testing_winaot_interp,    [  --with-testing_winaot_interp=yes,no      If you want to build the Windows friendly AOT + Interpreter testing assemblies (defaults to no)], [], [with_testing_winaot_interp=default])
1236 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1237 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1238 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1241 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,winaot,winaotinterp,winaot_llvm,winaotinterp_llvm,bitcode,bitcodeinterp,unreal,fullaotinterp,fullaotinterp_llvm  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1242 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])
1243 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])
1244 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])
1247 dnl Spectre compiler mitigation flag checks
1249 if test "x$with_spectre_mitigation" = "xyes"; then
1250    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1251    SPECTRE_CFLAGS=
1252    SPECTRE_INDIRECT_BRANCH_KIND=
1253    case "x$with_spectre_indirect_branch_choice" in
1254        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1255        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1256        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1257        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1258        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1259    esac
1261    SPECTRE_FUNCTION_RETURN_KIND=""
1262    case "x$with_spectre_function_return_choice" in
1263        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1264        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1265        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1266        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1267        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1268    esac
1270    AX_CHECK_COMPILE_FLAG(
1271         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1272         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1273    )
1275    AX_CHECK_COMPILE_FLAG(
1276         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1277         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1278    )
1280    if test "x$SPECTRE_CFLAGS" != "x" ; then
1281         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1282         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1283         spectre_mitigation_status="mitigation enabled"
1284    fi
1285 else
1286         spectre_mitigation_status="no mitigation"
1290 dnl Profile defaults
1292 TEST_PROFILE=default
1293 enable_llvm_default=no
1295 with_profile4_x_default=no
1296 with_monodroid_default=no
1297 with_monotouch_default=no
1298 with_monotouch_watch_default=no
1299 with_monotouch_tv_default=no
1300 with_xammac_default=no
1301 with_testing_aot_full_interp_default=no
1302 with_testing_aot_hybrid_default=no
1303 with_testing_aot_full_default=no
1304 with_winaot_default=no
1305 with_testing_winaot_interp_default=no
1306 with_orbis_default=no
1307 with_unreal_default=no
1308 with_wasm_default=no
1310 with_bitcode_default=no
1311 enable_cooperative_suspend_default=no
1312 enable_hybrid_suspend_default=no
1313 enable_copy_stack_data_default=yes
1315 # For the sake of clearer error messages, these numbers should all be different from each other.
1316 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4400,nftnptr-arg-trampolines=4000
1318 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1320 MONO_LLVM_PATH_OPTION=llvm-path="`pwd`/llvm/usr/bin"
1322 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1323    DISABLE_MCS_DOCS_default=yes
1324 elif test x$with_runtime_preset = xnetcore; then
1325    DISABLE_MCS_DOCS_default=yes
1326    BTLS_SUPPORTED=no
1327    enable_mcs_build=no
1328    enable_support_build=no
1330    mono_feature_disable_remoting='yes'
1331    mono_feature_disable_reflection_emit_save='yes'
1332    mono_feature_disable_appdomains='yes'
1333    mono_feature_disable_cleanup='yes'
1334    mono_feature_disable_assembly_remapping='yes'
1335    mono_feature_disable_security='yes'
1336    mono_feature_disable_mdb='yes'
1337    mono_feature_disable_com='yes'
1338    disable_mono_native=yes
1339    support_boehm=no
1340 elif test x$with_runtime_preset = xnet_4_x; then
1341    with_profile4_x_default=yes
1342    TEST_PROFILE=net_4_x
1343 elif test x$with_runtime_preset = xall; then
1344    with_profile4_x_default=yes
1345    with_monodroid_default=yes
1346    with_monotouch_default=yes
1347    with_monotouch_watch_default=yes
1348    with_monotouch_tv_default=yes
1349    with_xammac_default=yes
1350    with_winaot_default=yes
1351    with_testing_winaot_interp_default=yes
1352    with_orbis_default=yes
1353    with_unreal_default=yes
1354    with_wasm_default=yes
1355    with_testing_aot_full_interp_default=yes
1356    with_testing_aot_hybrid_default=yes
1357    with_testing_aot_full_default=yes
1358    TEST_PROFILE=net_4_x
1359 elif test x$with_runtime_preset = xbitcode; then
1360    DISABLE_MCS_DOCS_default=yes
1361    with_testing_aot_full_default=yes
1362    with_bitcode_default=yes
1363    enable_cooperative_suspend_default=yes
1364    # FIXME: use TEST_PROFILE=testing_aot_full
1365    TEST_PROFILE=testing_aot_bitcode
1366    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1367    enable_llvm_default=yes
1369    mono_feature_disable_com='yes'
1370    mono_feature_disable_remoting='yes'
1371    mono_feature_disable_reflection_emit_save='yes'
1372    mono_feature_disable_reflection_emit='yes'
1373    mono_feature_disable_appdomains='yes'
1375    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1376    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1377    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1378    AOT_MODE="llvmonly"
1379 elif test x$with_runtime_preset = xbitcodeinterp; then
1380    with_testing_aot_full_interp_default=yes
1381    with_bitcode_default=yes
1382    enable_cooperative_suspend_default=yes
1383    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1384    TEST_PROFILE=testing_aot_bitcode_interp
1385    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1386    enable_llvm_default=yes
1388    # mscorlib.dll aot compilation crashes
1389    mono_feature_disable_com='yes'
1391    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1392    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1393    AOT_RUN_FLAGS="--llvmonly-interp"
1394 elif test x$with_runtime_preset = xfullaot; then
1395    DISABLE_MCS_DOCS_default=yes
1396    with_testing_aot_full_default=yes
1397    TEST_PROFILE=testing_aot_full
1399    mono_feature_disable_com='yes'
1400    mono_feature_disable_remoting='yes'
1401    mono_feature_disable_reflection_emit_save='yes'
1402    mono_feature_disable_reflection_emit='yes'
1403    mono_feature_disable_appdomains='yes'
1405    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1406    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1407    AOT_MODE="full"
1408 elif test x$with_runtime_preset = xfullaot_llvm; then
1409    DISABLE_MCS_DOCS_default=yes
1410    with_testing_aot_full_default=yes
1411    TEST_PROFILE=testing_aot_full
1413    mono_feature_disable_com='yes'
1414    mono_feature_disable_remoting='yes'
1415    mono_feature_disable_reflection_emit_save='yes'
1416    mono_feature_disable_reflection_emit='yes'
1417    mono_feature_disable_appdomains='yes'
1419    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1420    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1421    AOT_MODE="full"
1422 elif test x$with_runtime_preset = xhybridaot; then
1423    DISABLE_MCS_DOCS_default=yes
1424    with_testing_aot_hybrid_default=yes
1425    TEST_PROFILE=testing_aot_hybrid 
1427    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1428    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1429 elif test x$with_runtime_preset = xhybridaot_llvm; then
1430    DISABLE_MCS_DOCS_default=yes
1431    with_testing_aot_hybrid_default=yes
1432    TEST_PROFILE=testing_aot_hybrid
1434    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1435    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1436 elif test x$with_runtime_preset = xfullaotinterp; then
1437    with_testing_aot_full_interp_default=yes
1438    TEST_PROFILE=testing_aot_full_interp
1440    # mscorlib.dll aot compilation crashes
1441    mono_feature_disable_com='yes'
1443    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1444    AOT_RUN_FLAGS="--full-aot-interp"
1445 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1446    with_testing_aot_full_interp_default=yes
1447    TEST_PROFILE=testing_aot_full_interp
1449    # mscorlib.dll aot compilation crashes
1450    mono_feature_disable_com='yes'
1452    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1453    AOT_RUN_FLAGS="--full-aot-interp"
1454 elif test x$with_runtime_preset = xaot; then
1455    with_profile4_x_default=yes
1457    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1458    AOT_RUN_FLAGS=""
1460    DISABLE_MCS_DOCS_default=yes
1461 elif test x$with_runtime_preset = xaot_llvm; then
1462    with_profile4_x_default=yes
1464    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1465    AOT_RUN_FLAGS=""
1467    DISABLE_MCS_DOCS_default=yes
1468 elif test x$with_runtime_preset = xwinaot; then
1469    DISABLE_MCS_DOCS_default=yes
1470    with_winaot_default=yes
1471    TEST_PROFILE=winaot
1473    mono_feature_disable_com='yes'
1474    mono_feature_disable_remoting='yes'
1475    mono_feature_disable_reflection_emit_save='yes'
1476    mono_feature_disable_reflection_emit='yes'
1477    mono_feature_disable_appdomains='yes'
1479    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1480    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1481    AOT_MODE="full"
1482 elif test x$with_runtime_preset = xwinaotinterp; then
1483    DISABLE_MCS_DOCS_default=yes
1484    with_testing_winaot_interp_default=yes
1485    TEST_PROFILE=testing_winaot_interp
1487    mono_feature_disable_com='yes'
1488    mono_feature_disable_remoting='yes'
1489    mono_feature_disable_appdomains='yes'
1491    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1492    AOT_RUN_FLAGS="--full-aot-interp"
1493 elif test x$with_runtime_preset = xwinaotinterp_llvm; then
1494    DISABLE_MCS_DOCS_default=yes
1495    with_testing_winaot_interp_default=yes
1496    TEST_PROFILE=testing_winaot_interp
1498    mono_feature_disable_com='yes'
1499    mono_feature_disable_remoting='yes'
1500    mono_feature_disable_appdomains='yes'
1502    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1503    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1504    AOT_RUN_FLAGS="--full-aot-interp"
1505 elif test x$with_runtime_preset = xwinaot_llvm; then
1506    DISABLE_MCS_DOCS_default=yes
1507    with_winaot_default=yes
1508    TEST_PROFILE=winaot
1510    mono_feature_disable_com='yes'
1511    mono_feature_disable_remoting='yes'
1512    mono_feature_disable_reflection_emit_save='yes'
1513    mono_feature_disable_reflection_emit='yes'
1514    mono_feature_disable_appdomains='yes'
1516    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1517    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1518    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1519    AOT_MODE="full"
1520 elif test x$with_runtime_preset = xorbis; then
1521    DISABLE_MCS_DOCS_default=yes
1522    with_orbis_default=yes
1523    TEST_PROFILE=orbis
1525    mono_feature_disable_com='yes'
1526    mono_feature_disable_remoting='yes'
1527    mono_feature_disable_reflection_emit_save='yes'
1528    mono_feature_disable_reflection_emit='yes'
1529    mono_feature_disable_appdomains='yes'
1531    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1532    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1533    AOT_MODE="full"
1534 elif test x$with_runtime_preset = xunreal; then
1535    DISABLE_MCS_DOCS_default=yes
1536    with_unreal_default=yes
1537    TEST_PROFILE=unreal
1539    mono_feature_disable_com='yes'
1540    mono_feature_disable_remoting='yes'
1541    mono_feature_disable_appdomains='no'
1543    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1544    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1545 elif test x$with_runtime_preset = xwasm; then
1546    DISABLE_MCS_DOCS_default=yes
1547    with_wasm_default=yes
1548    TEST_PROFILE=wasm
1550    mono_feature_disable_com='yes'
1551    mono_feature_disable_remoting='yes'
1552    mono_feature_disable_reflection_emit_save='yes'
1553    mono_feature_disable_reflection_emit='yes'
1554    mono_feature_disable_appdomains='yes'
1556    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1557    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1558 else
1559    TEST_PROFILE=net_4_x
1560    with_profile4_x_default=yes
1563 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1564    AC_SUBST(AOT_BUILD_FLAGS)
1565    AC_SUBST(AOT_RUN_FLAGS)
1566    # For llvmonlycheck + fullaotcheck
1567    AC_SUBST(INVARIANT_AOT_OPTIONS)
1570 AC_SUBST(TEST_PROFILE)
1572 if test "x$with_profile4_x" = "xdefault"; then
1573    with_profile4_x=$with_profile4_x_default
1575 if test "x$with_monodroid" = "xdefault"; then
1576    with_monodroid=$with_monodroid_default
1578 if test "x$with_monotouch" = "xdefault"; then
1579    with_monotouch=$with_monotouch_default
1581 if test "x$with_monotouch_watch" = "xdefault"; then
1582    with_monotouch_watch=$with_monotouch_watch_default
1584 if test "x$with_monotouch_tv" = "xdefault"; then
1585    with_monotouch_tv=$with_monotouch_tv_default
1587 if test "x$with_bitcode" = "xdefault"; then
1588    with_bitcode=$with_bitcode_default
1590 if test "x$with_xammac" = "xdefault"; then
1591    with_xammac=$with_xammac_default
1593 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1594    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1596 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1597    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1599 if test "x$with_testing_aot_full" = "xdefault"; then
1600    with_testing_aot_full=$with_testing_aot_full_default
1602 if test "x$with_winaot" = "xdefault"; then
1603    with_winaot=$with_winaot_default
1605 if test "x$with_testing_winaot_interp" = "xdefault"; then
1606    with_testing_winaot_interp=$with_testing_winaot_interp_default
1608 if test "x$with_orbis" = "xdefault"; then
1609    with_orbis=$with_orbis_default
1611 if test "x$with_unreal" = "xdefault"; then
1612    with_unreal=$with_unreal_default
1614 if test "x$with_wasm" = "xdefault"; then
1615    with_wasm=$with_wasm_default
1619 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1620 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1621 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1622 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1623 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1624 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1625 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1626 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1627 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1628 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1629 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1630 AM_CONDITIONAL(INSTALL_TESTING_WINAOT_INTERP, [test "x$with_testing_winaot_interp" != "xno"])
1631 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1632 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1633 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1634 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1636 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1637 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"])
1638 AM_CONDITIONAL(FULL_AOT_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"] || [test "x$TEST_PROFILE" = "xtesting_aot_bitcode_interp"] || [test "x$TEST_PROFILE" == "xtesting_winaot_interp"])
1639 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1641 default_profile=net_4_x
1642 if test -z "$INSTALL_MONODROID_TRUE"; then :
1643    default_profile=monodroid
1645 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1646    default_profile=monotouch
1648 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1649    default_profile=xammac
1651 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1652    default_profile=testing_aot_full_interp
1654 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1655    default_profile=testing_aot_hybrid
1657 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1658    default_profile=testing_aot_full
1660 if test -z "$INSTALL_WINAOT_TRUE"; then :
1661    default_profile=winaot
1663 if test -z "$INSTALL_TESTING_WINAOT_INTERP_TRUE"; then :
1664    default_profile=testing_winaot_interp
1666 if test -z "$INSTALL_ORBIS_TRUE"; then :
1667    default_profile=orbis
1669 if test -z "$INSTALL_UNREAL_TRUE"; then :
1670    default_profile=unreal
1672 if test -z "$INSTALL_WASM_TRUE"; then :
1673    default_profile=wasm
1675 if test -z "$INSTALL_4_x_TRUE"; then :
1676    default_profile=net_4_x
1678 DEFAULT_PROFILE=$default_profile
1679 AC_SUBST(DEFAULT_PROFILE)
1682 # End build profile configuration
1685 if test x$USE_NLS = xprofile_default; then
1687         AC_MSG_CHECKING([NLS used])
1689         # We make the default value for USE_NLS
1690         # "no" on OSX because it isn't available on most
1691         # default OSX installs. The most common configurations will
1692         # all disable it, so this saves us typing.
1693         if test x$host_darwin = xyes; then
1694                 USE_NLS=no;
1695         else
1696                 USE_NLS=yes;
1697         fi
1699         AC_SUBST([USE_NLS])
1700         AC_MSG_RESULT([$USE_NLS])
1703 AC_ARG_ENABLE(static-gcc-libs, [  --enable-static-gcc-libs      Statically link GCC support libs (for MinGW32)])
1704 if test "x$enable_static_gcc_libs" = "xyes"; then
1705         # llvm/build.mk doesn't use automake, so make a regular make variable for it.
1706         AC_SUBST(STATIC_GCC_LIBS,1)
1708 AM_CONDITIONAL(ENABLE_STATIC_GCC_LIBS, test "x$enable_static_gcc_libs" = "xyes")
1710 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1711      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1712      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1713          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1715         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1716                 eval "mono_feature_disable_$feature='yes'"
1717         done
1718         DISABLED_FEATURES=$enable_minimal
1719         disabled="Disabled:      $enable_minimal"
1720 ],[])
1722 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1724 if test "x$mono_feature_disable_aot" = "xyes"; then
1725         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1726         enable_system_aot=no
1727         AC_MSG_NOTICE([Disabled AOT compiler])
1730 if test "x$mono_feature_disable_profiler" = "xyes"; then
1731         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1732         AC_MSG_NOTICE([Disabled support for the profiler])
1734 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1736 if test "x$mono_feature_disable_decimal" = "xyes"; then
1737         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1738         AC_MSG_NOTICE([Disabled support for decimal])
1741 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1742         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1743         AC_MSG_NOTICE([Disabled support for P/Invoke])
1746 if test "x$mono_feature_disable_debug" = "xyes"; then
1747         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1748         AC_MSG_NOTICE([Disabled support for runtime debugging])
1751 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1752         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1753         mono_feature_disable_reflection_emit_save=yes
1754         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1757 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1758         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1759         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1762 if test "x$mono_feature_disable_large_code" = "xyes"; then
1763         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1764         AC_MSG_NOTICE([Disabled support for large assemblies])
1767 if test "x$mono_feature_disable_logging" = "xyes"; then
1768         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1769         AC_MSG_NOTICE([Disabled support for logging])
1772 if test "x$mono_feature_disable_com" = "xyes"; then
1773         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1774         AC_MSG_NOTICE([Disabled COM support])
1777 if test "x$mono_feature_disable_ssa" = "xyes"; then
1778         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1779         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1782 if test "x$mono_feature_disable_generics" = "xyes"; then
1783         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1784         AC_MSG_NOTICE([Disabled Generics Support])
1787 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1788         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1789         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1792 if test "x$mono_feature_disable_portability" = "xyes"; then
1793         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1794         AC_MSG_NOTICE([Disabled IO Portability layer])
1797 if test "x$mono_feature_disable_attach" = "xyes"; then
1798         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1799         AC_MSG_NOTICE([Disabled agent attach])
1802 if test "x$mono_feature_disable_verifier" = "xyes"; then
1803         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1804         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1807 if test "x$mono_feature_disable_jit" = "xyes"; then
1808         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1809         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1812 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1814 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1815         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1816         AC_MSG_NOTICE([Disabled the interpreter])
1819 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1821 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1822         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1825 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1827 if test "x$mono_feature_disable_simd" = "xyes"; then
1828         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1829         AC_MSG_NOTICE([Disabled SIMD support])
1832 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1833         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1834         AC_MSG_NOTICE([Disabled Soft Debugger.])
1837 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1839 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1840         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1841         AC_MSG_NOTICE([Disabled Performance Counters.])
1843 if test "x$mono_feature_disable_normalization" = "xyes"; then
1844         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1845         AC_MSG_NOTICE([Disabled String normalization support.])
1848 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1849 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1850         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1851         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1854 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1855         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1856         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1859 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1860         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1861         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1864 if test "x$mono_feature_disable_remoting" = "xyes"; then
1865         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1866         AC_MSG_NOTICE([Disabled remoting])
1869 if test "x$mono_feature_disable_security" = "xyes"; then
1870         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1871         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1874 if test "x$mono_feature_disable_lldb" = "xyes"; then
1875         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1876         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1879 if test "x$mono_feature_disable_mdb" = "xyes"; then
1880         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1881         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1884 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1885         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1886         AC_MSG_NOTICE([Disabled assertion messages.])
1889 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1890         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1891         AC_MSG_NOTICE([Disabled runtime cleanup.])
1894 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1895         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1896         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1900 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1901         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1902         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1905 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1906         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1907         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1910 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1911         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1912         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1915 if test "x$mono_feature_disable_sockets" = "xyes"; then
1916         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1917         AC_MSG_NOTICE([Disabled sockets])
1920 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1921 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1923 has_extension_module=no
1924 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1926         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1927                 if test x$extension = xdefault ; then
1928                         has_extension_module=yes;
1929                 fi
1930         done
1931         if test x$enable_extension_module = xyes; then
1932                 has_extension_module=yes;
1933         fi
1934 ], [])
1936 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1938 if test x$has_extension_module != xno ; then
1939         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1940         AC_MSG_NOTICE([Enabling mono extension module.])
1943 # Deprecated
1944 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1946 AC_MSG_CHECKING(for visibility __attribute__)
1947 AC_COMPILE_IFELSE([
1948         AC_LANG_SOURCE([[
1949                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1950                 int main () { doit (); return 0; }
1951         ]])
1952 ], [
1953    have_visibility_hidden=yes
1954    AC_MSG_RESULT(yes)
1955 ], [
1956    have_visibility_hidden=no
1957    AC_MSG_RESULT(no)
1961 dnl Boehm GC configuration
1964 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1966 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1967 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1969 if test "x$support_boehm" = "xyes"; then
1971         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1972         if test x$enable_parallel_mark = xyes; then
1973                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1974         fi
1976         gc_msg=""
1977         LIBGC_CPPFLAGS=
1978         LIBGC_LIBS=
1979         LIBGC_STATIC_LIBS=
1980         libgc_dir=
1981         case "x$libgc" in
1982                 xincluded)
1983                         if test "x$support_boehm" = "xyes"; then
1984                                 libgc_dir=libgc
1985                         fi
1987                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1988                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1989                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1991                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1993                         if test x$target_win32 = xyes; then
1994                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1995                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1996                         fi
1998                         gc_msg="Included Boehm GC with typed GC"
1999                         if test x$enable_parallel_mark = xyes; then
2000                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
2001                                 gc_msg="$gc_msg and parallel mark"
2002                         else
2003                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
2004                         fi
2005                         ;;
2007                 xboehm|xbohem|xyes)
2008                         AC_MSG_WARN("External Boehm is no longer supported")
2009                         ;;
2011                 xsgen)
2012                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
2013                         ;;
2015                 xnone)
2016                         AC_MSG_WARN("Compiling mono without GC.")
2017                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
2018                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
2019                         gc_msg="none"
2020                         ;;
2021                 *)
2022                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
2023                         ;;
2024         esac
2026         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])
2027         if test "x$large_heap" = "xyes"; then
2028            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
2029         fi
2031         AC_SUBST(LIBGC_CPPFLAGS)
2032         AC_SUBST(LIBGC_LIBS)
2033         AC_SUBST(LIBGC_STATIC_LIBS)
2034         AC_SUBST(libgc_dir)
2035         AC_SUBST(BOEHM_DEFINES)
2038 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
2041 dnl End of Boehm GC Configuration
2044 dnl *************************************
2045 dnl *** Checks for zero length arrays ***
2046 dnl *************************************
2047 AC_MSG_CHECKING(whether $CC supports zero length arrays)
2048 AC_TRY_COMPILE([
2049         struct s {
2050                 int  length;
2051                 char data [0];
2052         };
2053 ], [], [
2054         AC_MSG_RESULT(yes)
2055         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
2056 ], [
2057         AC_MSG_RESULT(no)
2058         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
2061 dnl ***********************************
2062 dnl *** Checks for signals
2063 dnl ***********************************
2064 AC_CHECK_HEADERS(signal.h)
2065 AC_CHECK_FUNCS(sigaction)
2066 AC_CHECK_FUNCS(kill)
2067 AC_CHECK_FUNCS(signal)
2069 # signal() is declared inline in Android headers
2070 # so we need to workaround it by overriding the check.
2071 if test x$platform_android = xyes; then
2072         AC_DEFINE(HAVE_SIGNAL,1)
2075 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
2076 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
2078 if test x$host_win32 = xno; then
2079         dnl *************************************
2080         dnl *** Checks for time capabilities ***
2081         dnl *************************************
2083         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
2084         AC_TRY_COMPILE([#include <time.h>], [
2085                 const int foo = CLOCK_MONOTONIC;
2086         ],[
2087                 AC_MSG_RESULT(yes)
2088                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
2089         ], [
2090                 AC_MSG_RESULT(no)
2091         ])
2093         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
2094         AC_TRY_COMPILE([#include <time.h>], [
2095                 const int foo = CLOCK_MONOTONIC_COARSE;
2096         ],[
2097                 AC_MSG_RESULT(yes)
2098                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
2099         ], [
2100                 AC_MSG_RESULT(no)
2101         ])
2103         AC_MSG_CHECKING(for CLOCK_REALTIME)
2104         AC_TRY_COMPILE([#include <time.h>], [
2105                 const int foo = CLOCK_REALTIME;
2106         ],[
2107                 AC_MSG_RESULT(yes)
2108                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
2109         ], [
2110                 AC_MSG_RESULT(no)
2111         ])
2113         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
2114         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
2115         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
2116         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
2117         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
2118         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
2120         dnl hires monotonic clock support
2121         AC_SEARCH_LIBS(clock_gettime, rt)
2122         AC_CHECK_FUNCS(clock_nanosleep)
2124         dnl dynamic loader support
2125         AC_CHECK_FUNC(dlopen, DL_LIB="",
2126                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
2127         )
2128         if test x$dl_support = xno; then
2129                 AC_MSG_WARN([No dynamic loading support available])
2130         else
2131                 LIBS="$LIBS $DL_LIB"
2132                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
2133                 dnl from glib's configure.ac
2134                 AC_CACHE_CHECK([for preceeding underscore in symbols],
2135                         mono_cv_uscore,[
2136                         AC_TRY_RUN([#include <dlfcn.h>
2137                         int mono_underscore_test (void) { return 42; }
2138                         int main() {
2139                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
2140                           handle = dlopen ((void*)0, 0);
2141                           if (handle) {
2142                             f1 = dlsym (handle, "mono_underscore_test");
2143                             f2 = dlsym (handle, "_mono_underscore_test");
2144                           } return (!f2 || f1);
2145                         }],
2146                                 [mono_cv_uscore=yes],
2147                                 [mono_cv_uscore=no],
2148                         [])
2149                 ])
2150                 if test "x$mono_cv_uscore" = "xyes"; then
2151                         MONO_DL_NEED_USCORE=1
2152                 else
2153                         MONO_DL_NEED_USCORE=0
2154                 fi
2155                 AC_SUBST(MONO_DL_NEED_USCORE)
2156                 AC_CHECK_FUNC(dlerror)
2157         fi
2159         dnl ******************************************************************
2160         dnl *** Checks for the IKVM JNI interface library                  ***
2161         dnl ******************************************************************
2162         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])
2164         ikvm_native_dir=
2165         if test x$with_ikvm_native = xyes; then
2166                 ikvm_native_dir=ikvm-native
2167                 jdk_headers_found="IKVM Native"
2168         fi
2170         AC_SUBST(ikvm_native_dir)
2172         AC_CHECK_HEADERS(execinfo.h)
2174         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2176         AC_CHECK_FUNCS(getgrgid_r)
2177         AC_CHECK_FUNCS(getgrnam_r)
2178         AC_CHECK_FUNCS(getresuid)
2179         AC_CHECK_FUNCS(setresuid)
2180         AC_CHECK_FUNCS(kqueue)
2181         AC_CHECK_FUNCS(backtrace_symbols)
2182         AC_CHECK_FUNCS(mkstemp)
2183         AC_CHECK_FUNCS(mmap)
2184         AC_CHECK_FUNCS(madvise)
2185         AC_CHECK_FUNCS(getrusage)
2186         AC_CHECK_FUNCS(getpriority)
2187         AC_CHECK_FUNCS(setpriority)
2188         AC_CHECK_FUNCS(dl_iterate_phdr)
2189         AC_CHECK_FUNCS(dladdr)
2190         AC_CHECK_FUNCS(sysconf)
2191         AC_CHECK_FUNCS(getrlimit)
2192         AC_CHECK_FUNCS(prctl)
2193         AC_CHECK_FUNCS(arc4random)
2194         AC_CHECK_FUNCS(nl_langinfo)
2196         AC_CHECK_FUNCS(sched_getaffinity)
2197         AC_CHECK_FUNCS(sched_setaffinity)
2198         AC_CHECK_FUNCS(sched_getcpu)
2200         if test x$platform_android != xyes; then
2201                 AC_CHECK_FUNCS(getpwnam_r)
2202                 AC_CHECK_FUNCS(getpwuid_r)
2203         fi
2205         AC_CHECK_FUNCS(readlink)
2206         AC_CHECK_FUNCS(chmod)
2207         AC_CHECK_FUNCS(lstat)
2208         AC_CHECK_FUNCS(getdtablesize)
2210         AC_CHECK_FUNCS(ftruncate)
2211         AC_CHECK_FUNCS(msync)
2213         AC_CHECK_FUNCS(gethostname getpeername)
2214         AC_CHECK_FUNCS(utime utimes)
2216         AC_CHECK_FUNCS(openlog closelog)
2217         AC_CHECK_FUNCS(atexit)
2218         AC_CHECK_FUNCS(popen)
2220         AC_FUNC_STRERROR_R()
2222         dnl ****************************************************************
2223         dnl *** Check for sched_setaffinity from glibc versions before   ***
2224         dnl *** 2.3.4. The older versions of the function only take 2    ***
2225         dnl *** parameters, not 3.                                       ***
2226         dnl ***                                                          ***
2227         dnl *** Because the interface change was not made in a minor     ***
2228         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2229         dnl *** won't always indicate the interface sched_affinity has.  ***
2230         dnl ****************************************************************
2231         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2232         AC_TRY_COMPILE([#include <sched.h>], [
2233             int mask = 1; 
2234             sched_setaffinity(0, &mask);
2235         ], [
2236                 # Yes, we have it...
2237                 AC_MSG_RESULT(yes)
2238                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2239         ], [
2240                 # We have the new, three-parameter version
2241                 AC_MSG_RESULT(no)
2242         ])
2243         AC_TRY_COMPILE([#include <sched.h>], [
2244              CPU_COUNT((void *) 0);
2245         ], [
2246                 AC_MSG_RESULT(yes)
2247                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2248         ], [
2249                 # We have the new, three-parameter version
2250                 AC_MSG_RESULT(no)
2251         ])
2253         dnl ******************************************************************
2254         dnl *** Check for large file support                               ***
2255         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2256         dnl ******************************************************************
2257         
2258         # Check that off_t can represent 2**63 - 1 correctly, working around
2259         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2260         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2261         large_offt=no
2262         AC_DEFUN([LARGE_FILES], [
2263                 large_CPPFLAGS=$CPPFLAGS
2264                 CPPFLAGS="$CPPFLAGS $1"
2265                 AC_TRY_COMPILE([
2266                         #include <sys/types.h>
2267                         #include <limits.h>
2268                 ], [
2269                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2270                         #define COMPILE_TIME_ASSERT(pred) \
2271                                 switch(0){case 0:case pred:;}
2272                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2273                 ], [
2274                         AC_MSG_RESULT(ok)
2275                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2276                         large_CPPFLAGS="$large_CPPFLAGS $1"
2277                         large_offt=yes
2278                 ], [
2279                         AC_MSG_RESULT(no)
2280                 ])
2281                 CPPFLAGS=$large_CPPFLAGS
2282         ])
2284         AC_MSG_CHECKING(if off_t is 64 bits wide)
2285         LARGE_FILES("")
2286         if test $large_offt = no; then
2287                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2288                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2289         fi
2290         if test $large_offt = no; then
2291                 AC_MSG_WARN([No 64 bit file size support available])
2292         fi
2293         
2294         dnl *****************************
2295         dnl *** Checks for libsocket  ***
2296         dnl *****************************
2297         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2299         case "$host" in
2300                 *-*-*freebsd*)
2301                         dnl *****************************
2302                         dnl *** Checks for libinotify ***
2303                         dnl *****************************
2304                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2305         esac
2307         dnl *******************************
2308         dnl *** Checks for MSG_NOSIGNAL ***
2309         dnl *******************************
2310         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2311         AC_TRY_COMPILE([#include <sys/socket.h>], [
2312                 int f = MSG_NOSIGNAL;
2313         ], [
2314                 # Yes, we have it...
2315                 AC_MSG_RESULT(yes)
2316                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2317         ], [
2318                 # We'll have to use signals
2319                 AC_MSG_RESULT(no)
2320         ])
2322         dnl *****************************
2323         dnl *** Checks for IPPROTO_IP ***
2324         dnl *****************************
2325         AC_MSG_CHECKING(for IPPROTO_IP)
2326         AC_TRY_COMPILE([#include <netinet/in.h>], [
2327                 int level = IPPROTO_IP;
2328         ], [
2329                 # Yes, we have it...
2330                 AC_MSG_RESULT(yes)
2331                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2332         ], [
2333                 # We'll have to use getprotobyname
2334                 AC_MSG_RESULT(no)
2335         ])
2337         dnl *******************************
2338         dnl *** Checks for IPPROTO_IPV6 ***
2339         dnl *******************************
2340         AC_MSG_CHECKING(for IPPROTO_IPV6)
2341         AC_TRY_COMPILE([#include <netinet/in.h>], [
2342                 int level = IPPROTO_IPV6;
2343         ], [
2344                 # Yes, we have it...
2345                 AC_MSG_RESULT(yes)
2346                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2347         ], [
2348                 # We'll have to use getprotobyname
2349                 AC_MSG_RESULT(no)
2350         ])
2352         dnl ******************************
2353         dnl *** Checks for IPPROTO_TCP ***
2354         dnl ******************************
2355         AC_MSG_CHECKING(for IPPROTO_TCP)
2356         AC_TRY_COMPILE([#include <netinet/in.h>], [
2357                 int level = IPPROTO_TCP;
2358         ], [
2359                 # Yes, we have it...
2360                 AC_MSG_RESULT(yes)
2361                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2362         ], [
2363                 # We'll have to use getprotobyname
2364                 AC_MSG_RESULT(no)
2365         ])
2367         dnl *****************************
2368         dnl *** Checks for SOL_IP     ***
2369         dnl *****************************
2370         AC_MSG_CHECKING(for SOL_IP)
2371         AC_TRY_COMPILE([#include <netdb.h>], [
2372                 int level = SOL_IP;
2373         ], [
2374                 # Yes, we have it...
2375                 AC_MSG_RESULT(yes)
2376                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2377         ], [
2378                 # We'll have to use getprotobyname
2379                 AC_MSG_RESULT(no)
2380         ])
2382         dnl *****************************
2383         dnl *** Checks for SOL_IPV6     ***
2384         dnl *****************************
2385         AC_MSG_CHECKING(for SOL_IPV6)
2386         AC_TRY_COMPILE([#include <netdb.h>], [
2387                 int level = SOL_IPV6;
2388         ], [
2389                 # Yes, we have it...
2390                 AC_MSG_RESULT(yes)
2391                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2392         ], [
2393                 # We'll have to use getprotobyname
2394                 AC_MSG_RESULT(no)
2395         ])
2397         dnl *****************************
2398         dnl *** Checks for SOL_TCP    ***
2399         dnl *****************************
2400         AC_MSG_CHECKING(for SOL_TCP)
2401         AC_TRY_COMPILE([#include <netdb.h>], [
2402                 int level = SOL_TCP;
2403         ], [
2404                 # Yes, we have it...
2405                 AC_MSG_RESULT(yes)
2406                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2407         ], [
2408                 # We'll have to use getprotobyname
2409                 AC_MSG_RESULT(no)
2410         ])
2412         dnl *****************************
2413         dnl *** Checks for IP_PKTINFO ***
2414         dnl *****************************
2415         AC_MSG_CHECKING(for IP_PKTINFO)
2416         AC_TRY_COMPILE([#include <linux/in.h>], [
2417                 int level = IP_PKTINFO;
2418         ], [
2419                 # Yes, we have it...
2420                 AC_MSG_RESULT(yes)
2421                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2422         ], [
2423                 AC_MSG_RESULT(no)
2424         ])
2426         dnl *****************************
2427         dnl *** Checks for IPV6_PKTINFO ***
2428         dnl *****************************
2429         AC_MSG_CHECKING(for IPV6_PKTINFO)
2430         AC_TRY_COMPILE([#include <netdb.h>], [
2431                 int level = IPV6_PKTINFO;
2432         ], [
2433                 # Yes, we have it...
2434                 AC_MSG_RESULT(yes)
2435                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2436         ], [
2437                 AC_MSG_RESULT(no)
2438         ])
2440         dnl **********************************
2441         dnl *** Checks for IP_DONTFRAG     ***
2442         dnl **********************************
2443         AC_MSG_CHECKING(for IP_DONTFRAG)
2444         AC_TRY_COMPILE([#include <netinet/in.h>], [
2445                 int level = IP_DONTFRAG;
2446         ], [
2447                 # Yes, we have it...
2448                 AC_MSG_RESULT(yes)
2449                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2450         ], [
2451                 AC_MSG_RESULT(no)
2452         ])
2454         dnl **********************************
2455         dnl *** Checks for IP_DONTFRAGMENT ***
2456         dnl **********************************
2457         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2458         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2459                 int level = IP_DONTFRAGMENT;
2460         ], [
2461                 # Yes, we have it...
2462                 AC_MSG_RESULT(yes)
2463                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2464         ], [
2465                 AC_MSG_RESULT(no)
2466         ])
2468         dnl **********************************
2469         dnl *** Checks for IP_MTU_DISCOVER ***
2470         dnl **********************************
2471         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2472         AC_TRY_COMPILE([#include <linux/in.h>], [
2473                 int level = IP_MTU_DISCOVER;
2474         ], [
2475                 # Yes, we have it...
2476                 AC_MSG_RESULT(yes)
2477                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2478         ], [
2479                 AC_MSG_RESULT(no)
2480         ])
2482         dnl **********************************
2483         dnl *** Checks for  IP_PMTUDISC_DO ***
2484         dnl **********************************
2485         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2486         AC_TRY_COMPILE([#include <linux/in.h>], [
2487                 int level = IP_PMTUDISC_DO;
2488         ], [
2489                 # Yes, we have it...
2490                 AC_MSG_RESULT(yes)
2491                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2492         ], [
2493                 AC_MSG_RESULT(no)
2494         ])
2496         dnl *********************************
2497         dnl *** Check for struct ip_mreqn ***
2498         dnl *********************************
2499         AC_MSG_CHECKING(for struct ip_mreqn)
2500         AC_TRY_COMPILE([#include <netinet/in.h>], [
2501                 struct ip_mreqn mreq;
2502                 mreq.imr_address.s_addr = 0;
2503         ], [
2504                 # Yes, we have it...
2505                 AC_MSG_RESULT(yes)
2506                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2507         ], [
2508                 # We'll just have to try and use struct ip_mreq
2509                 AC_MSG_RESULT(no)
2510                 AC_MSG_CHECKING(for struct ip_mreq)
2511                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2512                         struct ip_mreq mreq;
2513                         mreq.imr_interface.s_addr = 0;
2514                 ], [
2515                         # Yes, we have it...
2516                         AC_MSG_RESULT(yes)
2517                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2518                 ], [
2519                         # No multicast support
2520                         AC_MSG_RESULT(no)
2521                 ])
2522         ])
2523         
2524         dnl **********************************
2525         dnl *** Check for getaddrinfo ***
2526         dnl **********************************
2527         AC_MSG_CHECKING(for getaddrinfo)
2528                 AC_TRY_LINK([
2529                 #include <stdio.h>
2530                 #include <netdb.h>
2531         ], [
2532                 getaddrinfo(NULL,NULL,NULL,NULL);
2533         ], [
2534                 # Yes, we have it...
2535                 AC_MSG_RESULT(yes)
2536                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2537         ], [
2538                 AC_MSG_RESULT(no)
2539         ])
2541         dnl **********************************
2542         dnl *** Check for gethostbyname2_r ***
2543         dnl **********************************
2544         AC_MSG_CHECKING(for gethostbyname2_r)
2545                 AC_TRY_LINK([
2546                 #include <stdio.h>
2547                 #include <netdb.h>
2548         ], [
2550                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2551         ], [
2552                 # Yes, we have it...
2553                 AC_MSG_RESULT(yes)
2554                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2555         ], [
2556                 AC_MSG_RESULT(no)
2557         ])
2559         dnl **********************************
2560         dnl *** Check for gethostbyname2 ***
2561         dnl **********************************
2562         AC_MSG_CHECKING(for gethostbyname2)
2563                 AC_TRY_LINK([
2564                 #include <stdio.h>
2565                 #include <netdb.h>
2566         ], [
2567                 gethostbyname2(NULL,0);
2568         ], [
2569                 # Yes, we have it...
2570                 AC_MSG_RESULT(yes)
2571                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2572         ], [
2573                 AC_MSG_RESULT(no)
2574         ])
2576         dnl **********************************
2577         dnl *** Check for gethostbyname ***
2578         dnl **********************************
2579         AC_MSG_CHECKING(for gethostbyname)
2580                 AC_TRY_LINK([
2581                 #include <stdio.h>
2582                 #include <netdb.h>
2583         ], [
2584                 gethostbyname(NULL);
2585         ], [
2586                 # Yes, we have it...
2587                 AC_MSG_RESULT(yes)
2588                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2589         ], [
2590                 AC_MSG_RESULT(no)
2591         ])
2593         dnl **********************************
2594         dnl *** Check for getprotobyname ***
2595         dnl **********************************
2596         AC_MSG_CHECKING(for getprotobyname)
2597                 AC_TRY_LINK([
2598                 #include <stdio.h>
2599                 #include <netdb.h>
2600         ], [
2601                 getprotobyname(NULL);
2602         ], [
2603                 # Yes, we have it...
2604                 AC_MSG_RESULT(yes)
2605                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2606         ], [
2607                 AC_MSG_RESULT(no)
2608         ])
2610         dnl **********************************
2611         dnl *** Check for getprotobyname_r ***
2612         dnl **********************************
2613         AC_MSG_CHECKING(for getprotobyname_r)
2614                 AC_TRY_LINK([
2615                 #include <stdio.h>
2616                 #include <netdb.h>
2617         ], [
2618                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2619         ], [
2620                 # Yes, we have it...
2621                 AC_MSG_RESULT(yes)
2622                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2623         ], [
2624                 AC_MSG_RESULT(no)
2625         ])
2627         dnl **********************************
2628         dnl *** Check for getnameinfo ***
2629         dnl **********************************
2630         AC_MSG_CHECKING(for getnameinfo)
2631                 AC_TRY_LINK([
2632                 #include <stdio.h>
2633                 #include <netdb.h>
2634         ], [
2635                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2636         ], [
2637                 # Yes, we have it...
2638                 AC_MSG_RESULT(yes)
2639                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2640         ], [
2641                 AC_MSG_RESULT(no)
2642         ])
2645         dnl **********************************
2646         dnl *** Check for inet_ntop ***
2647         dnl **********************************
2648         AC_MSG_CHECKING(for inet_ntop)
2649                 AC_TRY_LINK([
2650                 #include <stdio.h>
2651                 #include <arpa/inet.h>
2652         ], [
2653                 inet_ntop (0, NULL, NULL, 0);
2654         ], [
2655                 # Yes, we have it...
2656                 AC_MSG_RESULT(yes)
2657                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2658         ], [
2659                 AC_MSG_RESULT(no)
2660         ])
2662         dnl *****************************
2663         dnl *** Checks for libnsl     ***
2664         dnl *****************************
2665         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2667         AC_CHECK_FUNCS(inet_pton inet_aton)
2669         dnl *****************************
2670         dnl *** Checks for libxnet    ***
2671         dnl *****************************
2672         case "${host}" in
2673                 *solaris* )
2674                         AC_MSG_CHECKING(for Solaris XPG4 support)
2675                         if test -f /usr/lib/libxnet.so; then
2676                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2677                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2678                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2679                                 LIBS="$LIBS -lxnet"
2680                                 AC_MSG_RESULT(yes)
2681                         else
2682                                 AC_MSG_RESULT(no)
2683                         fi
2685                         if test "$GCC" = "yes"; then
2686                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2687                         fi
2688                 ;;
2689         esac
2691         dnl *****************************
2692         dnl *** Checks for libpthread ***
2693         dnl *****************************
2694 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2695 # and libpthread does not exist
2697         case "${host}" in
2698                 *-*-*haiku*)
2699                         dnl Haiku has pthread in libroot (libc equiv)
2700                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2701                 ;;
2702                 *-*-*freebsd*)
2703                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2704                 ;;
2705                 *-*-*openbsd*)
2706                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2707                 ;;
2708                 *)
2709                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2710                 ;;
2711         esac
2712         AC_CHECK_HEADERS(pthread.h)
2713         AC_CHECK_HEADERS(pthread_np.h)
2714         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2715         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2716         AC_CHECK_FUNCS(pthread_kill)
2717         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2718         AC_TRY_COMPILE([ #include <pthread.h>], [
2719                 pthread_mutexattr_t attr;
2720                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2721         ], [
2722                 AC_MSG_RESULT(ok)
2723         ], [
2724                 AC_MSG_RESULT(no)
2725                 AC_ERROR(Posix system lacks support for recursive mutexes)
2726         ])
2727         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2728         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2729         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2730         dnl check that pthread_mutexattr_setprotocol is declared
2731         AC_CHECK_DECLS([pthread_mutexattr_setprotocol], [], [], [[#include <pthread.h>]])
2732         AC_CHECK_FUNCS(mincore mlock munlock)
2734         dnl ***********************************
2735         dnl *** Checks for working __thread ***
2736         dnl ***********************************
2737         AC_MSG_CHECKING(for working __thread)
2738         if test "x$with_tls" != "x__thread"; then
2739                 AC_MSG_RESULT(disabled)
2740         elif test "x$cross_compiling" = "xyes"; then
2741                 AC_MSG_RESULT(cross compiling, assuming yes)
2742         else
2743                 AC_TRY_RUN([
2744                         #if defined(__APPLE__) && defined(__clang__)
2745                         #error "__thread does not currently work with clang on Mac OS X"
2746                         #endif
2747                         
2748                         #include <unistd.h>
2749                         #include <pthread.h>
2750                         __thread int i;
2751                         static int res1, res2;
2753                         void thread_main (void *arg)
2754                         {
2755                                 i = arg;
2756                                 sleep (1);
2757                                 if (arg == 1)
2758                                         res1 = (i == arg);
2759                                 else
2760                                         res2 = (i == arg);
2761                         }
2763                         int main () {
2764                                 pthread_t t1, t2;
2766                                 i = 5;
2768                                 pthread_create (&t1, NULL, thread_main, 1);
2769                                 pthread_create (&t2, NULL, thread_main, 2);
2771                                 pthread_join (t1, NULL);
2772                                 pthread_join (t2, NULL);
2774                                 return !(res1 + res2 == 2);
2775                         }
2776                 ], [
2777                                 AC_MSG_RESULT(yes)
2778                 ], [
2779                                 AC_MSG_RESULT(no)
2780                                 with_tls=pthread
2781                 ])
2782         fi
2784         dnl **************************************
2785         dnl *** Checks for working sigaltstack ***
2786         dnl **************************************
2787         AC_MSG_CHECKING(for working sigaltstack)
2788         if test "x$with_sigaltstack" != "xyes"; then
2789                 AC_MSG_RESULT(disabled)
2790         elif test "x$cross_compiling" = "xyes"; then
2791                 AC_MSG_RESULT(cross compiling, assuming no)
2792                 with_sigaltstack=no
2793         else
2794                 AC_TRY_RUN([
2795                         #include <stdio.h>
2796                         #include <stdlib.h>
2797                         #include <unistd.h>
2798                         #include <signal.h>
2799                         #include <pthread.h>
2800                         #include <sys/wait.h>
2801                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2802                         #define SA_STACK SA_ONSTACK
2803                         #endif
2804                         static void
2805                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2806                         {
2807                                 exit (0);
2808                         }
2810                         volatile char*__ptr = NULL;
2811                         static void *
2812                         loop (void *ignored)
2813                         {
2814                                 *__ptr = 0;
2815                                 return NULL;
2816                         }
2818                         static void
2819                         child ()
2820                         {
2821                                 struct sigaction sa;
2822                                 stack_t sas;
2823                                 pthread_t id;
2824                                 pthread_attr_t attr;
2826                                 sa.sa_sigaction = sigsegv_signal_handler;
2827                                 sigemptyset (&sa.sa_mask);
2828                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2829                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2830                                         perror ("sigaction");
2831                                         return;
2832                                 }
2834                                 /* x86 darwin deliver segfaults using SIGBUS */
2835                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2836                                         perror ("sigaction");
2837                                         return;
2838                                 }
2839                                 sas.ss_sp = malloc (SIGSTKSZ);
2840                                 sas.ss_size = SIGSTKSZ;
2841                                 sas.ss_flags = 0;
2842                                 if (sigaltstack (&sas, NULL) == -1) {
2843                                         perror ("sigaltstack");
2844                                         return;
2845                                 }
2847                                 pthread_attr_init (&attr);
2848                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2849                                         printf ("pthread_create\n");
2850                                         return;
2851                                 }
2853                                 sleep (100);
2854                         }
2856                         int
2857                         main ()
2858                         {
2859                                 pid_t son;
2860                                 int status;
2861                                 int i;
2863                                 son = fork ();
2864                                 if (son == -1) {
2865                                         return 1;
2866                                 }
2868                                 if (son == 0) {
2869                                         child ();
2870                                         return 0;
2871                                 }
2873                                 for (i = 0; i < 300; ++i) {
2874                                         waitpid (son, &status, WNOHANG);
2875                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2876                                                 return 0;
2877                                         usleep (10000);
2878                                 }
2880                                 kill (son, SIGKILL);
2881                                 return 1;
2882                         }
2884                 ], [
2885                                 AC_MSG_RESULT(yes)
2886                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2887                 ], [
2888                                 with_sigaltstack=no
2889                                 AC_MSG_RESULT(no)
2890                 ])
2891         fi
2893         dnl ********************************
2894         dnl *** Checks for semaphore lib ***
2895         dnl ********************************
2896         # 'Real Time' functions on Solaris
2897         # posix4 on Solaris 2.6
2898         # pthread (first!) on Linux
2899         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2901         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2902         AC_CHECK_FUNCS(shm_open)
2904         dnl ********************************
2905         dnl ***  Checks for gettext lib  ***
2906         dnl ********************************
2907         # This is needed for some hackery for AIX;
2908         # Mono itself doesn't use it, but DllMap includes it
2909         AC_SEARCH_LIBS([gettext], [intl])
2911         dnl ********************************
2912         dnl *** Checks for timezone stuff **
2913         dnl ********************************
2914         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2915                 AC_TRY_COMPILE([
2916                         #include <time.h>
2917                         ], [
2918                         struct tm tm;
2919                         tm.tm_gmtoff = 1;
2920                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2921         if test $ac_cv_struct_tm_gmtoff = yes; then
2922                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2923         else
2924                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2925                         AC_TRY_COMPILE([
2926                                 #include <time.h>
2927                         ], [
2928                                 timezone = 1;
2929                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2930                 if test $ac_cv_var_timezone = yes; then
2931                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2932                 else
2933                         AC_ERROR(unable to find a way to determine timezone)
2934                 fi
2935         fi
2937         dnl *********************************
2938         dnl *** Checks for math functions ***
2939         dnl *********************************
2940         AC_SEARCH_LIBS(sqrtf, m)
2942         dnl ****************************************************************
2943         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2944         dnl *** have it in the library (duh))                            ***
2945         dnl ****************************************************************
2946         AC_CHECK_FUNCS(poll)
2948         dnl **********************************
2949         dnl *** epoll                      ***
2950         dnl **********************************
2951         AC_CHECK_HEADERS(sys/epoll.h)
2952         haveepoll=no
2953         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2954         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2955                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2956         fi
2958         havekqueue=no
2960         AC_CHECK_HEADERS(sys/event.h)
2961         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2963         dnl **************************************
2964         dnl * Darwin has a race that prevents us from using reliably:
2965         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2966         dnl * Since kqueue is mostly used for scaling large web servers, 
2967         dnl * and very few folks run Mono on large web servers on OSX, falling
2968         dnl * back 
2969         dnl **************************************
2970         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2971                 if test "x$host_darwin" = "xno"; then
2972                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2973                 fi
2974         fi
2976         dnl ******************************
2977         dnl *** Checks for SIOCGIFCONF ***
2978         dnl ******************************
2979         AC_CHECK_HEADERS(sys/ioctl.h)
2980         AC_CHECK_HEADERS(net/if.h, [], [],
2981            [
2982            #ifdef HAVE_SYS_TYPES_H
2983            # include <sys/types.h>
2984            #endif
2985            #ifdef HAVE_SYS_SOCKET_H
2986            # include <sys/socket.h>
2987            #endif
2988            ])
2989         AC_MSG_CHECKING(for ifreq)
2990         AC_TRY_COMPILE([
2991                 #include <stdio.h>
2992                 #include <sys/ioctl.h>
2993                 #include <net/if.h>
2994                 ], [
2995                 struct ifconf ifc;
2996                 struct ifreq *ifr;
2997                 void *x;
2998                 ifc.ifc_len = 0;
2999                 ifc.ifc_buf = NULL;
3000                 x = (void *) &ifr->ifr_addr;
3001                 ],[
3002                         AC_MSG_RESULT(yes)
3003                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
3004                 ], [
3005                         AC_MSG_RESULT(no)
3006                 ])
3007         dnl **********************************
3008         dnl ***     Checks for sin_len     ***
3009         dnl **********************************
3010         AC_MSG_CHECKING(for sockaddr_in.sin_len)
3011         AC_TRY_COMPILE([
3012                 #include <netinet/in.h>
3013                 ], [
3014                 struct sockaddr_in saddr;
3015                 saddr.sin_len = sizeof (saddr);
3016                 ],[
3017                         AC_MSG_RESULT(yes)
3018                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
3019                 ], [
3020                         AC_MSG_RESULT(no)
3021                 ])      
3022         dnl **********************************
3023         dnl ***    Checks for sin6_len     ***
3024         dnl **********************************
3025         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
3026         AC_TRY_COMPILE([
3027                 #include <netinet/in.h>
3028                 ], [
3029                 struct sockaddr_in6 saddr6;
3030                 saddr6.sin6_len = sizeof (saddr6);
3031                 ],[
3032                         AC_MSG_RESULT(yes)
3033                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
3034                 ], [
3035                         AC_MSG_RESULT(no)
3036                 ])
3037         dnl **********************************
3038         dnl *** Check for getifaddrs       ***
3039         dnl **********************************
3040         AC_MSG_CHECKING(for getifaddrs)
3041                 AC_TRY_LINK([
3042                 #include <stdio.h>
3043                 #include <sys/types.h>
3044                 #include <sys/socket.h>
3045                 #ifdef HAVE_NET_IF_H
3046                 #include <net/if.h>
3047                 #endif
3048                 #include <ifaddrs.h>
3049         ], [
3050                 getifaddrs(NULL);
3051         ], [
3052                 # Yes, we have it...
3053                 AC_MSG_RESULT(yes)
3054                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
3055         ], [
3056                 AC_MSG_RESULT(no)
3057         ])
3058         dnl **********************************
3059         dnl *** Check for if_nametoindex   ***
3060         dnl **********************************
3061         AC_MSG_CHECKING(for if_nametoindex)
3062                 AC_TRY_LINK([
3063                 #include <stdio.h>
3064                 #include <sys/types.h>
3065                 #include <sys/socket.h>
3066                 #include <net/if.h>
3067         ], [
3068                 if_nametoindex(NULL);
3069         ], [
3070                 # Yes, we have it...
3071                 AC_MSG_RESULT(yes)
3072                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
3073         ], [
3074                 AC_MSG_RESULT(no)
3075         ])
3076         dnl **********************************
3077         dnl *** Check for access ***
3078         dnl **********************************
3079         AC_MSG_CHECKING(for access)
3080                 AC_TRY_LINK([
3081                 #include <unistd.h>
3082         ], [
3083                 access(NULL,0);
3084         ], [
3085                 # Yes, we have it...
3086                 AC_MSG_RESULT(yes)
3087                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
3088         ], [
3089                 AC_MSG_RESULT(no)
3090         ])
3091                         
3092         dnl **********************************
3093         dnl *** Checks for proclib         ***
3094         dnl **********************************
3095         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.)])
3096         dnl **********************************
3097         dnl *** Checks for MonoPosixHelper ***
3098         dnl **********************************
3099         AC_CHECK_HEADERS(checklist.h)
3100         AC_CHECK_HEADERS(pathconf.h)
3101         AC_CHECK_HEADERS(fstab.h)
3102         AC_CHECK_HEADERS(attr/xattr.h)
3103         AC_CHECK_HEADERS(sys/extattr.h)
3104         AC_CHECK_HEADERS(sys/sendfile.h)
3105         AC_CHECK_HEADERS(sys/statvfs.h)
3106         AC_CHECK_HEADERS(sys/statfs.h)
3107         AC_CHECK_HEADERS(sys/vfstab.h)
3108         AC_CHECK_HEADERS(sys/xattr.h)
3109         AC_CHECK_HEADERS(sys/mman.h)
3110         AC_CHECK_HEADERS(sys/param.h)
3111         AC_CHECK_HEADERS(sys/mount.h, [], [],
3112                 [
3113                 #ifdef HAVE_SYS_PARAM_H
3114                 # include <sys/param.h>
3115                 #endif
3116                 ])
3117         AC_CHECK_HEADERS(sys/mount.h)
3118         AC_CHECK_FUNCS(confstr)
3119         AC_CHECK_FUNCS(seekdir telldir)
3120         AC_CHECK_FUNCS(getdomainname)
3121         AC_CHECK_FUNCS(setdomainname)
3122         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
3123         AC_CHECK_FUNCS(setgroups)
3124         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
3125         AC_CHECK_FUNCS(getfsstat)
3126         AC_CHECK_FUNCS(lutimes futimes)
3127         AC_CHECK_FUNCS(mremap)
3128         AC_CHECK_FUNCS(remap_file_pages)
3129         AC_CHECK_FUNCS(posix_fadvise)
3130         AC_CHECK_FUNCS(posix_fallocate)
3131         AC_CHECK_FUNCS(posix_madvise)
3132         AC_CHECK_FUNCS(vsnprintf)
3133         AC_CHECK_FUNCS(sendfile)
3134         AC_CHECK_FUNCS(gethostid sethostid)
3135         AC_CHECK_FUNCS(sethostname)
3136         AC_CHECK_FUNCS(statfs)
3137         AC_CHECK_FUNCS(fstatfs)
3138         AC_CHECK_FUNCS(statvfs)
3139         AC_CHECK_FUNCS(fstatvfs)
3140         AC_CHECK_FUNCS(stime)
3141         AC_CHECK_FUNCS(ttyname_r)
3142         AC_CHECK_FUNCS(psignal)
3143         AC_CHECK_FUNCS(getlogin_r)
3144         AC_CHECK_FUNCS(lockf)
3145         AC_CHECK_FUNCS(swab)
3146         AC_CHECK_FUNCS(setusershell endusershell)
3147         AC_CHECK_FUNCS(futimens utimensat)
3148         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
3149         AC_CHECK_FUNCS(readv writev preadv pwritev)
3150         AC_CHECK_FUNCS(setpgid)
3151         AC_CHECK_FUNCS(system)
3152         AC_CHECK_FUNCS(fork execv execve)
3153         AC_CHECK_FUNCS(waitpid)
3154         AC_CHECK_FUNCS(accept4)
3155         AC_CHECK_FUNCS(localtime_r)
3156         AC_CHECK_FUNCS(mkdtemp)
3157         AC_CHECK_SIZEOF(size_t)
3158         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
3159                 [#include <sys/types.h>
3160                  #include <sys/stat.h>
3161                  #include <unistd.h>])
3162         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
3163                 [#include <sys/types.h>
3164                  #include <sys/stat.h>
3165                  #include <unistd.h>])
3166         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
3167                 [#include <sys/time.h>])
3168         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
3169                 [#include <sys/socket.h>])
3170         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
3171                 [#include <unistd.h>
3172                  #include <fcntl.h>])
3173         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
3174                 [#include <sys/uio.h>])
3175         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
3176                 [#include <sys/socket.h>])
3177         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3178                 [#include <sys/poll.h>])
3179         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3180                 [#include <sys/socket.h>])
3181         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3182                 [#include <sys/socket.h>])
3183         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3184                 [#include <netinet/in.h>])
3185         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3186                 [#include <netinet/in.h>])
3187         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3188                 [#include <sys/un.h>])
3189         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3190                 [#include <sys/types.h>
3191                  #include <sys/stat.h>
3192                  #include <unistd.h>])
3193         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3194                 [#include <time.h>])
3195         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3196                 [#include <sys/time.h>
3197                  #include <sys/types.h>
3198                  #include <utime.h>])
3199         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3200                 [#include <sys/time.h>])
3201         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3202                 [#include <sys/types.h>
3203                  #include <utime.h>])
3204         AC_CHECK_MEMBERS(
3205                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3206                 [#include <sys/types.h>
3207                  #include <dirent.h>])
3208         AC_CHECK_MEMBERS(
3209                 [struct passwd.pw_gecos],,, 
3210                 [#include <sys/types.h>
3211                  #include <pwd.h>])
3212         AC_CHECK_MEMBERS(
3213                 [struct statfs.f_flags],,, 
3214                 [#include <sys/types.h>
3215                  #include <sys/vfs.h>])
3216         AC_CHECK_MEMBERS(
3217                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3218                 [#include <sys/types.h>
3219                  #include <sys/stat.h>
3220                  #include <unistd.h>])
3222         dnl Favour xattr through glibc, but use libattr if we have to
3223         AC_CHECK_FUNC(lsetxattr, ,
3224                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3225         )
3226         AC_SUBST(XATTR_LIB)
3228         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3229         AC_CHECK_MEMBERS(
3230                 [struct kinfo_proc.kp_proc],,, 
3231                 [#include <sys/types.h>
3232                  #include <sys/param.h>
3233                  #include <sys/sysctl.h>
3234                  #include <sys/proc.h>
3235                  ])
3237         dnl *********************************
3238         dnl *** Checks for Windows compilation ***
3239         dnl *********************************
3240         AC_CHECK_HEADERS(sys/time.h)
3241         AC_CHECK_HEADERS(sys/param.h)
3242         AC_CHECK_HEADERS(dirent.h)
3244         dnl ******************************************
3245         dnl *** Checks for OSX and iOS compilation ***
3246         dnl ******************************************
3247         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3249         dnl *********************************
3250         dnl *** Check for Console 2.0 I/O ***
3251         dnl *********************************
3252         AC_CHECK_HEADERS([curses.h])
3253         AC_CHECK_HEADERS([term.h], [], [],
3254         [#if HAVE_CURSES_H
3255          #include <curses.h>
3256          #endif
3257         ])
3258         AC_CHECK_HEADERS([termios.h])
3260         dnl *********************************
3261         dnl *** Checks for random         ***
3262         dnl *********************************
3263         if test x$host_darwin = xno; then
3264                 AC_CHECK_HEADERS(sys/random.h)
3265                 AC_CHECK_FUNCS(getrandom getentropy)
3266         fi
3268         dnl *********************************
3269         dnl *** Checks for Mono.Native    ***
3270         dnl *********************************
3272         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3273         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3275         AC_MSG_CHECKING(for linux/in.h)
3276         AC_TRY_COMPILE([
3277                 #include <sys/socket.h>
3278                 #include <linux/in.h>
3279         ], [
3280         ],[
3281                 AC_MSG_RESULT(yes)
3282                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3283         ], [
3284                 AC_MSG_RESULT(no)
3285         ])
3287         AC_CHECK_HEADERS([linux/if_packet.h])
3289         AC_MSG_CHECKING(for struct in_pktinfo)
3290         AC_TRY_COMPILE([
3291                 #ifdef HAVE_LINUX_IN_H
3292                 #include <sys/socket.h>
3293                 #include <linux/in.h>
3294                 #else
3295                 #include <netinet/in.h>
3296                 #endif
3297         ], [
3298                 struct in_pktinfo pktinfo;
3299         ],[
3300                 AC_MSG_RESULT(yes)
3301                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3302         ], [
3303                 AC_MSG_RESULT(no)
3304         ])
3306         AC_MSG_CHECKING(for struct ip_mreqn)
3307         AC_TRY_COMPILE([
3308                 #if HAVE_LINUX_IN_H
3309                 #include <sys/socket.h>
3310                 #include <linux/in.h>
3311                 #else
3312                 #include <netinet/in.h>
3313                 #endif
3314         ], [
3315                 struct ip_mreqn mreqn;
3316         ],[
3317                 AC_MSG_RESULT(yes)
3318                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3319         ], [
3320                 AC_MSG_RESULT(no)
3321         ])
3323         if test x$host_darwin = xno; then
3324                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3325         fi
3327         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3328         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3330         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3332         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3333         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3334         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3335         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3337         if test "x$mono_native_platform_ios" = "xno"; then
3338                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3339                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3340                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3341         fi
3343         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3344         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3345         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3346         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3347         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
3348         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3349         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3350         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3352         if test "x$platform_android" != "xyes"; then
3353                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3354         fi
3356         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3357         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3358         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3359         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3360         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3361         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3363         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>]])
3364         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>]])
3365         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>]])
3366         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>]])
3367         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3368         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3369         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3371         AC_MSG_CHECKING(for struct statfs)
3372         AC_TRY_COMPILE([
3373                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3374                 #include <sys/mount.h>
3375                 #else
3376                 #include <sys/statfs.h>
3377                 #endif
3378         ], [
3379                 struct statfs;
3380         ],[
3381                 AC_MSG_RESULT(yes)
3382                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3383         ], [
3384                 AC_MSG_RESULT(no)
3385         ])
3387         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3388                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3389         fi
3391         AC_MSG_CHECKING(for readdir_r)
3392         AC_TRY_LINK([
3393                 #include <dirent.h>
3394         ], [
3395                 DIR* dir;
3396                 struct dirent* entry;
3397                 struct dirent* result;
3398                 readdir_r(dir, entry, &result);
3399         ],[
3400                 AC_MSG_RESULT(yes)
3401                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3402         ], [
3403                 AC_MSG_RESULT(no)
3404         ])
3406         AC_MSG_CHECKING(for kevent with void *data)
3407         AC_TRY_LINK([
3408                 #include <sys/types.h>
3409                 #include <sys/event.h>
3410         ], [
3411                 struct kevent event;
3412                 void* data;
3413                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3414         ],[
3415                 AC_MSG_RESULT(yes)
3416                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3417         ], [
3418                 AC_MSG_RESULT(no)
3419         ])
3421         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3422         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3424         AC_MSG_CHECKING(for sendfile with 4 arguments)
3425         AC_TRY_LINK([
3426                 #include <sys/sendfile.h>
3427         ], [
3428                 #if defined(TARGET_ANDROID)
3429                 #if !defined(__ANDROID_API__)
3430                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3431                 #elif __ANDROID_API__ < 21
3432                 #error sendfile is not supported on this Android API level
3433                 #endif
3434                 #endif
3436                 int result = sendfile(0, 0, 0, 0);
3437         ],[
3438                 AC_MSG_RESULT(yes)
3439                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3440         ], [
3441                 AC_MSG_RESULT(no)
3442         ])
3444         ORIG_CFLAGS="$CFLAGS"
3445         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3447         AC_MSG_CHECKING(for sendfile with 6 arguments)
3448         AC_TRY_LINK([
3449                 #include <stdlib.h>
3450                 #include <sys/types.h>
3451                 #include <sys/socket.h>
3452                 #include <sys/uio.h>
3453         ], [
3454                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3455         ],[
3456                 AC_MSG_RESULT(yes)
3457                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3458         ], [
3459                 AC_MSG_RESULT(no)
3460         ])
3462         CFLAGS="$ORIG_CFLAGS"
3464         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3465         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3466         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3467         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3469         ORIG_CFLAGS="$CFLAGS"
3470         CFLAGS="$CFLAGS -Werror=sign-conversion"
3472         AC_MSG_CHECKING(for getnameinfo with signed flags)
3473         AC_TRY_LINK([
3474                 #include <sys/types.h>
3475                 #include <netdb.h>
3476         ], [
3477                 const struct sockaddr *addr;
3478                 socklen_t addrlen;
3479                 char *host;
3480                 socklen_t hostlen;
3481                 char *serv;
3482                 socklen_t servlen;
3483                 int flags;
3484                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3485         ],[
3486                 AC_MSG_RESULT(yes)
3487                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3488         ], [
3489                 AC_MSG_RESULT(no)
3490         ])
3492         CFLAGS="$ORIG_CFLAGS"
3494         if test "x$host_linux" = "xyes"; then
3495                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3496         else
3497                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3498         fi
3500         # HAVE_CLOCK_MONOTONIC check already done above
3501         # HAVE_CLOCK_REALTIME check already done above
3502         # HAVE_MACH_ABSOLUTE_TIME check already done above
3503         # HAVE_MACH_TIMEBASE_INFO check already done above
3504         # HAVE_FUTIMES check already done above
3505         # HAVE_FUTIMENS check already done above
3507         ORIG_CFLAGS="$CFLAGS"
3508         CFLAGS="$CFLAGS -Werror=sign-conversion"
3510         AC_MSG_CHECKING(for bind with unsigned addrlen)
3511         AC_TRY_LINK([
3512                 #include <sys/socket.h>
3513         ], [
3514                 int fd;
3515                 struct sockaddr* addr;
3516                 socklen_t addrLen;
3517                 bind(fd, addr, addrLen);
3518         ],[
3519                 AC_MSG_RESULT(yes)
3520                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3521         ], [
3522                 AC_MSG_RESULT(no)
3523         ])
3525         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3526         AC_TRY_LINK([
3527                 #include <netinet/in.h>
3528                 #include <netinet/tcp.h>
3529         ], [
3530                 struct ipv6_mreq opt;
3531                 unsigned int index = 0;
3532                 opt.ipv6mr_interface = index;
3533         ],[
3534                 AC_MSG_RESULT(yes)
3535                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3536         ], [
3537                 AC_MSG_RESULT(no)
3538         ])
3540         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3541         AC_TRY_LINK([
3542                 #include <sys/inotify.h>
3543         ], [
3544                 intptr_t fd;
3545                 uint32_t wd;
3546                 int result = inotify_rm_watch(fd, wd);
3547         ],[
3548                 AC_MSG_RESULT(yes)
3549                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3550         ], [
3551                 AC_MSG_RESULT(no)
3552         ])
3554         CFLAGS="$ORIG_CFLAGS"
3556         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3557         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3558                 AC_MSG_RESULT(no)
3559         elif test "x$cross_compiling" = "xyes"; then
3560                 AC_MSG_RESULT(cross compiling, assuming yes)
3561                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3562         else
3563                 AC_TRY_RUN([
3564                         #include <sys/mman.h>
3565                         #include <fcntl.h>
3566                         #include <unistd.h>
3568                         int main ()
3569                         {
3570                         #ifdef __PASE__
3571                                 /* IBM i doesn't implement this and returns SIGILL */
3572                                 return -1;
3573                         #endif
3574                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3575                                 if (fd == -1)
3576                                         return -1;
3578                                 shm_unlink("/mono_configure_shm_open");
3580                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3581                                 //       on at least the current version of Mac OS X
3583                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3584                                         return -1;
3586                                 return 0;
3587                         }
3588                 ],[
3589                         AC_MSG_RESULT(yes)
3590                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3591                 ], [
3592                         AC_MSG_RESULT(no)
3593                 ])
3594         fi
3596         AC_MSG_CHECKING(for getpriority with int who)
3597         AC_TRY_LINK([
3598                 #include <sys/resource.h>
3599         ], [
3600                 int which;
3601                 int who;
3602                 int result = getpriority(which, who);
3603         ],[
3604                 AC_MSG_RESULT(yes)
3605                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3606         ], [
3607                 AC_MSG_RESULT(no)
3608         ])
3610         AC_MSG_CHECKING(for kevent with int parameters)
3611         AC_TRY_LINK([
3612                 #include <sys/types.h>
3613                 #include <sys/event.h>
3614         ], [
3615                 int kg;
3616                 const struct kevent* chagelist;
3617                 int nchanges;
3618                 struct kevent* eventlist;
3619                 int nevents;
3620                 const struct timespec* timeout;
3621                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3622         ],[
3623                 AC_MSG_RESULT(yes)
3624                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3625         ], [
3626                 AC_MSG_RESULT(no)
3627         ])
3629         AC_CHECK_FUNCS(mkstemps)
3630         # AC_CHECK_FUNCS(mkstemp) # already done above
3632         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3633                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3634         fi
3636         AC_MSG_CHECKING(for tcp/var.h)
3637         AC_TRY_LINK([
3638                 #include <sys/types.h>
3639                 #include <sys/socketvar.h>
3640                 #include <netinet/ip.h>
3641                 #include <netinet/tcp.h>
3642                 #include <netinet/tcp_var.h>
3643         ], [
3644         ],[
3645                 AC_MSG_RESULT(yes)
3646                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3647         ], [
3648                 AC_MSG_RESULT(no)
3649         ])
3651         AC_CHECK_HEADERS([sys/cdefs.h])
3653         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3654         AC_TRY_LINK([
3655                 #ifdef HAVE_SYS_CDEFS_H
3656                 #include <sys/cdefs.h>
3657                 #endif
3658                 #include <netinet/tcp.h>
3659         ], [
3660                 int result = TCP_ESTABLISHED;
3661         ],[
3662                 AC_MSG_RESULT(yes)
3663                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3664         ], [
3665                 AC_MSG_RESULT(no)
3666         ])
3668         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3670         AC_MSG_CHECKING(for struct rt_msghdr)
3671         AC_TRY_COMPILE([
3672                 #include <sys/types.h>
3673                 #include <net/route.h>
3674         ], [
3675                 struct rt_msghdr;
3676         ],[
3677                 AC_MSG_RESULT(yes)
3678                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3679         ], [
3680                 AC_MSG_RESULT(no)
3681         ])
3683         AC_CHECK_HEADERS([sys/sysctl.h])
3684         AC_CHECK_HEADERS([linux/rtnetlink.h])
3686         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3687         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3688         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3690         ORIG_CFLAGS="$CFLAGS"
3691         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3693         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3694         AC_TRY_LINK([
3695                 #include <unistd.h>
3696         ], [
3697                 size_t namelen = 20;
3698                 char name[20];
3699                 int result = getdomainname(name, namelen);
3700         ],[
3701                 AC_MSG_RESULT(yes)
3702                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3703         ], [
3704                 AC_MSG_RESULT(no)
3705         ])
3707         CFLAGS="$ORIG_CFLAGS"
3709         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3710         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3711         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3713         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
3714                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3715         elif test "x$host_linux" = "xyes"; then
3716                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3717         fi
3719         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3720         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3721         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3722         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3724         enable_gss=no;
3725         AC_MSG_CHECKING(for GSS/GSS.h)
3726         AC_TRY_COMPILE([
3727                         #include <GSS/GSS.h>
3728         ], [
3729         ],[
3730                         AC_MSG_RESULT(yes)
3731                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3732                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3733                         enable_gss=yes
3734         ], [
3735                         AC_MSG_RESULT(no)
3736         ])
3738         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3739         AC_TRY_COMPILE([
3740                         #include <gssapi/gssapi_ext.h>
3741         ], [
3742         ],[
3743                         AC_MSG_RESULT(yes)
3744                         enable_gss=yes
3745         ], [
3746                         AC_MSG_RESULT(no)
3747         ])
3749         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3750         AC_TRY_COMPILE([
3751                         #include <gssapi/gssapi_ext.h>
3752                         #include <gssapi/gssapi_krb5.h>
3753                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3754         ], [
3755         ],[
3756                         AC_MSG_RESULT(yes)
3757                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3758         ], [
3759                         AC_MSG_RESULT(no)
3760         ])
3762         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3764         AC_CHECK_HEADERS([crt_externs.h])
3766         AC_MSG_CHECKING(for _NSGetEnviron)
3767         AC_TRY_LINK([
3768                 #include <crt_externs.h>
3769         ], [
3770                 char **result = *(_NSGetEnviron());
3771         ],[
3772                 AC_MSG_RESULT(yes)
3773                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3774         ], [
3775                 AC_MSG_RESULT(no)
3776         ])
3778         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3780         # *** End of Mono.Native checks ***
3781 else
3782         AM_CONDITIONAL(ENABLE_GSS, false)
3784         dnl *********************************
3785         dnl *** Checks for Windows compilation ***
3786         dnl *********************************
3787         AC_CHECK_HEADERS(winternl.h)
3789         jdk_headers_found=no
3790         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3791         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3792         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3793         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3794         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3795         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3796         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3798         dnl *********************************
3799         dnl *** Check for struct ip_mreqn ***
3800         dnl *********************************
3801         AC_MSG_CHECKING(for struct ip_mreqn)
3802         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3803                 struct ip_mreqn mreq;
3804                 mreq.imr_address.s_addr = 0;
3805         ], [
3806                 # Yes, we have it...
3807                 AC_MSG_RESULT(yes)
3808                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3809         ], [
3810                 # We'll just have to try and use struct ip_mreq
3811                 AC_MSG_RESULT(no)
3812                 AC_MSG_CHECKING(for struct ip_mreq)
3813                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3814                         struct ip_mreq mreq;
3815                         mreq.imr_interface.s_addr = 0;
3816                 ], [
3817                         # Yes, we have it...
3818                         AC_MSG_RESULT(yes)
3819                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3820                 ], [
3821                         # No multicast support
3822                         AC_MSG_RESULT(no)
3823                 ])
3824         ])
3826         dnl **********************************
3827         dnl *** Check for getaddrinfo ***
3828         dnl **********************************
3829         AC_MSG_CHECKING(for getaddrinfo)
3830                 AC_TRY_LINK([
3831                 #include <stdio.h>
3832                 #include <winsock2.h>
3833                 #include <ws2tcpip.h>
3834         ], [
3835                 getaddrinfo(NULL,NULL,NULL,NULL);
3836         ], [
3837                 # Yes, we have it...
3838                 AC_MSG_RESULT(yes)
3839                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3840         ], [
3841                 AC_MSG_RESULT(no)
3842         ])
3844         dnl **********************************
3845         dnl *** Check for gethostbyname ***
3846         dnl **********************************
3847         AC_MSG_CHECKING(for gethostbyname)
3848                 AC_TRY_LINK([
3849                 #include <stdio.h>
3850                 #include <winsock2.h>
3851                 #include <ws2tcpip.h>
3852         ], [
3853                 gethostbyname(NULL);
3854         ], [
3855                 # Yes, we have it...
3856                 AC_MSG_RESULT(yes)
3857                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3858         ], [
3859                 AC_MSG_RESULT(no)
3860         ])
3862         dnl **********************************
3863         dnl *** Check for getprotobyname ***
3864         dnl **********************************
3865         AC_MSG_CHECKING(for getprotobyname)
3866                 AC_TRY_LINK([
3867                 #include <stdio.h>
3868                 #include <winsock2.h>
3869                 #include <ws2tcpip.h>
3870         ], [
3871                 getprotobyname(NULL);
3872         ], [
3873                 # Yes, we have it...
3874                 AC_MSG_RESULT(yes)
3875                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3876         ], [
3877                 AC_MSG_RESULT(no)
3878         ])
3880         dnl **********************************
3881         dnl *** Check for getnameinfo ***
3882         dnl **********************************
3883         AC_MSG_CHECKING(for getnameinfo)
3884                 AC_TRY_LINK([
3885                 #include <stdio.h>
3886                 #include <winsock2.h>
3887                 #include <ws2tcpip.h>
3888         ], [
3889                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3890         ], [
3891                 # Yes, we have it...
3892                 AC_MSG_RESULT(yes)
3893                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3894         ], [
3895                 AC_MSG_RESULT(no)
3896         ])
3898         dnl **********************************
3899         dnl *** Check for inet_ntop ***
3900         dnl **********************************
3901         AC_MSG_CHECKING(for inet_ntop)
3902                 AC_TRY_LINK([
3903                 #include <stdio.h>
3904                 #include <winsock2.h>
3905                 #include <ws2tcpip.h>
3906         ], [
3907                 inet_ntop (0, NULL, NULL, 0);
3908         ], [
3909                 # Yes, we have it...
3910                 AC_MSG_RESULT(yes)
3911                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3912         ], [
3913                 AC_MSG_RESULT(no)
3914         ])
3916         dnl **********************************
3917         dnl *** Check for inet_pton ***
3918         dnl **********************************
3919         AC_MSG_CHECKING(for inet_pton)
3920                 AC_TRY_LINK([
3921                 #include <stdio.h>
3922                 #include <winsock2.h>
3923                 #include <ws2tcpip.h>
3924         ], [
3925                 #ifndef inet_pton
3926                 (void) inet_pton;
3927                 #endif
3928                 inet_pton (0, NULL, NULL);
3929         ], [
3930                 # Yes, we have it...
3931                 AC_MSG_RESULT(yes)
3932                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3933         ], [
3934                 AC_MSG_RESULT(no)
3935         ])
3937         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3938         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3939         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3940         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3941         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3942         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3943         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3946 dnl socklen_t check
3947 AC_MSG_CHECKING(for socklen_t)
3948 AC_TRY_COMPILE([
3949 #include <sys/types.h>
3950 #include <sys/socket.h>
3952   socklen_t foo;
3954 ac_cv_c_socklen_t=yes
3955         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3956         AC_MSG_RESULT(yes)
3958         AC_MSG_RESULT(no)
3961 AC_CHECK_FUNCS(execvp)
3963 dnl ****************************
3964 dnl *** Look for /dev/random ***
3965 dnl ****************************
3967 AC_MSG_CHECKING([if usage of random device is requested])
3968 AC_ARG_ENABLE(dev-random,
3969 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3970 try_dev_random=$enableval, try_dev_random=yes)
3972 AC_MSG_RESULT($try_dev_random)
3974 case "{$build}" in
3976 dnl IBM i does not have /dev/random, use unblocking only
3978     *-*-os400*)
3979     NAME_DEV_RANDOM="/dev/urandom"
3980     ;;
3982 dnl Win32 does not have /dev/random, they have their own method...
3984     *-mingw*|*-*-cygwin*)
3985     ac_cv_have_dev_random=no
3986     ;;
3988 dnl Everywhere else, it's /dev/random
3990     *)
3991     NAME_DEV_RANDOM="/dev/random"
3992     ;;
3993 esac
3995 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3997 dnl Now check if the device actually exists
3999 if test "x$try_dev_random" = "xyes"; then
4000     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
4001     [if test -r "$NAME_DEV_RANDOM" ; then
4002         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
4003     if test "x$ac_cv_have_dev_random" = "xyes"; then
4004         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
4005     fi
4006 else
4007     AC_MSG_CHECKING(for random device)
4008     ac_cv_have_dev_random=no
4009     AC_MSG_RESULT(has been disabled)
4012 if test "x$host_win32" = "xyes"; then
4013     AC_DEFINE(HAVE_CRYPT_RNG)
4016 if test "x$ac_cv_have_dev_random" = "xno" \
4017     && test "x$host_win32" = "xno"; then
4018     AC_MSG_WARN([[
4020 *** A system-provided entropy source was not found on this system.
4021 *** Because of this, the System.Security.Cryptography random number generator
4022 *** will throw a NotImplemented exception.
4024 *** If you are seeing this message, and you know your system DOES have an
4025 *** entropy collection in place, please report an issue on GitHub and
4026 *** provide information about the system and how to access the random device.
4028 *** Otherwise you can install either egd or prngd and set the environment
4029 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
4030 ***]])
4033 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)
4035 AC_MSG_CHECKING([if big-arrays are to be enabled])
4036 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)
4037 if test "x$enable_big_arrays" = "xyes" ; then
4038     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
4039         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
4040     else
4041         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
4042     fi
4044 AC_MSG_RESULT($enable_big_arrays)
4046 dnl **************
4047 dnl *** DTRACE ***
4048 dnl **************
4050 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
4052 if test "x$enable_dtrace" = "xyes"; then
4053    if test "x$has_dtrace" = "xno"; then
4054           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
4055    fi
4056    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
4057    if test "x$DTRACE" = "xno"; then
4058           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
4059           enable_dtrace=no
4060    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
4061           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
4062           enable_dtrace=no
4063    fi
4066 dtrace_g=no
4067 if test "x$enable_dtrace" = "xyes"; then
4068         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
4069         DTRACEFLAGS=
4070         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4071                 case "$host" in
4072                         powerpc-*-darwin*)
4073                         DTRACEFLAGS="-arch ppc64"
4074                         ;;
4075                         i*86-*-darwin*)
4076                         DTRACEFLAGS="-arch x86_64"
4077                         ;;
4078                         *)
4079                         DTRACEFLAGS=-64
4080                         ;;
4081                 esac
4082         else
4083                 case "$host" in
4084                         powerpc-*-darwin*)
4085                         DTRACEFLAGS="-arch ppc"
4086                         ;;
4087                         i*86-*-darwin*)
4088                         DTRACEFLAGS="-arch i386"
4089                         ;;
4090                         *)
4091                         DTRACEFLAGS=-32
4092                         ;;
4093                 esac
4094         fi
4095         AC_SUBST(DTRACEFLAGS)
4096         case "$host" in
4097                 *-*-solaris*)
4098                 dtrace_g=yes
4099                 ;;
4100         esac
4101         AC_CHECK_HEADERS([sys/sdt.h])
4103 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
4104 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
4106 dnl **************************
4107 dnl *** AOT cross offsets  ***
4108 dnl **************************
4110 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
4111     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
4113 dnl **************
4114 dnl ***  LLVM  ***
4115 dnl **************
4117 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
4118 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
4119 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)
4120 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
4121 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
4123 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
4125 if test "x$enable_llvm" = "xdefault"; then
4126    enable_llvm=$enable_llvm_default
4129 enable_llvm_msvc_only="no"
4130 if test "x$enable_llvm" = "xyes"; then
4131         if test "x$host_win32" = "xyes"; then
4132                 if test "x$cross_compiling" = "xno"; then
4133                         case "$target" in
4134                         x86_64*)
4135                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
4136                                 enable_llvm_msvc_only="yes"
4137                                 ;;
4138                         i686*)
4139                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
4140                                 ;;
4141                         esac
4142                 fi
4143                 if test "x$enable_loadedllvm" = "xyes"; then
4144                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
4145                         enable_loadedllvm=no
4146                 fi
4147         fi
4150 internal_llvm="no"
4151 if test "x$enable_llvm" = "xyes"; then
4152         if test "x$with_llvm" != "x"; then
4153                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
4154                 if test x$host_win32 = xyes; then
4155                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
4156                 fi
4157                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
4158                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
4159                 fi
4160         else
4161                 if test x$host_win32 = xyes; then
4162                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
4163                 else
4164                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
4165                 fi
4166                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
4167                         internal_llvm=yes
4168                 fi
4169         fi
4171         LLVM_CODEGEN_LIBS="x86codegen"
4172         case "$target" in
4173         arm*)
4174                 LLVM_CODEGEN_LIBS="armcodegen"
4175                 ;;
4176         aarch64*)
4177                 LLVM_CODEGEN_LIBS="aarch64codegen"
4178                 ;;
4179         powerpc*)
4180                 LLVM_CODEGEN_LIBS="powerpccodegen"
4181                 ;;
4182         esac
4183         if test "x$host" != "x$target"; then
4184                 # No need for jit libs
4185                 LLVM_CODEGEN_LIBS=
4186         fi
4188         AC_SUBST(LLVM_CODEGEN_LIBS)
4189         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4191         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4192                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4193                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4194         fi
4195         if test "x$enable_llvm_msvc_only" != "xyes"; then
4196                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4197         else
4198                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4199         fi
4200 fi # ENABLE_LLVM
4202 # AC_DEFINE necessary for correct restore behavior on Linux
4203 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4204 if test "x$internal_llvm" != "xno"; then
4205         if test "x$enable_llvm_msvc_only" != "xyes"; then
4206                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4207         else
4208                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4209         fi
4212 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4213 if test "x$enable_llvm_asserts" != "xno"; then
4214         if test "x$enable_llvm_msvc_only" != "xyes"; then
4215                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4216         else
4217                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4218         fi
4221 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4223 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4224 if test "x$enable_loadedllvm" = "xyes"; then
4225         if test "x$enable_llvm_msvc_only" != "xyes"; then
4226                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4227         fi
4230 if test "x$enable_llvm" = "xyes"; then
4231         enable_llvm_runtime=yes
4234 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4235 if test "x$enable_llvm_runtime" = "xyes"; then
4236         if test "x$enable_llvm_msvc_only" != "xyes"; then
4237                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4238         else
4239                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4240         fi
4243 TARGET="unknown"
4244 ACCESS_UNALIGNED="yes"
4246 LIBC="libc.so.6"
4247 INTL="libc.so.6"
4248 SQLITE="libsqlite.so.0"
4249 SQLITE3="libsqlite3.so.0"
4250 ODBC="libodbc.so.2"
4251 X11="libX11.so"
4252 GDKX11="libgdk-x11-2.0.so.0"
4253 GTKX11="libgtk-x11-2.0.so.0"
4254 XINERAMA="libXinerama.so.1"
4256 sizeof_register="SIZEOF_VOID_P"
4258 jit_wanted=true
4259 boehm_supported=true
4260 BTLS_SUPPORTED=no
4261 BTLS_PLATFORM=
4263 case "$host" in
4264         wasm32*)
4265                 TARGET=WASM
4266                 arch_target=wasm
4267                 BTLS_SUPPORTED=no
4268                 ACCESS_UNALIGNED="no"
4269                 with_tls=pthread
4270                 target_wasm=yes
4271                 ;;
4272         mips*)
4273                 TARGET=MIPS;
4274                 arch_target=mips;
4275                 with_tls=pthread;
4276                 ACCESS_UNALIGNED="no"
4278                 AC_MSG_CHECKING(for mips n32)
4279                 AC_TRY_COMPILE([],[
4280                 #if _MIPS_SIM != _ABIN32
4281                 #error Not mips n32
4282                 #endif
4283                 ],[
4284                 AC_MSG_RESULT(yes)
4285                 sizeof_register=8
4286                 ],[
4287                 AC_MSG_RESULT(no)
4288                 ])
4289                 ;;
4290         i*86-*-*)
4291                 TARGET=X86;
4292                 arch_target=x86;
4293                 case $host_os in
4294                   solaris*)
4295                         LIBC="libc.so"
4296                         INTL="libintl.so"
4297                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4298                                 TARGET=AMD64
4299                                 arch_target=amd64
4300                         fi
4302                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4303                         # int astruct __attribute__ ((visibility ("hidden")));
4304                         # void foo ()
4305                         # {
4306                         #       void *p = &astruct;
4307                         # }
4308                         # gcc -fPIC --shared -o libfoo.so foo.c
4309                         # yields:
4310                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4311                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4312                         have_visibility_hidden=no
4313                         ;;
4314                   mingw*|cygwin*)
4315                         have_visibility_hidden=no
4316                         BTLS_SUPPORTED=no
4317                         BTLS_PLATFORM=i386
4318                         ;;
4319                   haiku*)
4320                         LIBC=libroot.so
4321                         ;;
4322                   linux*)
4323                         AOT_SUPPORTED="yes"
4324                         BTLS_SUPPORTED=yes
4325                         BTLS_PLATFORM=i386
4326                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4327                         ;;
4328                   darwin*)
4329                         AOT_SUPPORTED="yes"
4330                         BTLS_SUPPORTED=yes
4331                         BTLS_PLATFORM=i386
4332                         ;;
4333                   openbsd*|freebsd*|kfreebsd-gnu*)
4334                         AOT_SUPPORTED="yes"
4335                         BTLS_SUPPORTED=yes
4336                         BTLS_PLATFORM=i386
4337                         ;;
4338                 esac
4339                 ;;
4340         x86_64-*-* | amd64-*-*)
4341                 TARGET=AMD64;
4342                 arch_target=amd64;
4343                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4344                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4345                         sizeof_register=8
4346                 fi
4347                 case $host_os in
4348                   linux*)
4349                         AOT_SUPPORTED="yes"
4350                         BTLS_SUPPORTED=yes
4351                         BTLS_PLATFORM=x86_64
4352                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4353                         ;;
4354                   darwin*)
4355                         AOT_SUPPORTED="yes"
4356                         BTLS_SUPPORTED=yes
4357                         BTLS_PLATFORM=x86_64
4358                         boehm_supported=false
4359                         ;;
4360                   openbsd*|freebsd*|kfreebsd-gnu*)
4361                         AOT_SUPPORTED="yes"
4362                         BTLS_SUPPORTED=yes
4363                         BTLS_PLATFORM=x86_64
4364                         ;;
4365                   mingw*|cygwin*)
4366                         BTLS_SUPPORTED=no
4367                         BTLS_PLATFORM=x86_64
4368                         ;;
4369                 esac
4370                 ;;
4371         sparc*-*-*)
4372                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4373                    TARGET=SPARC64
4374                 else
4375                         TARGET=SPARC
4376                 fi
4377                 arch_target=sparc;
4378                 ACCESS_UNALIGNED="no"
4379                 case $host_os in
4380                   linux*) ;;
4381                   *)
4382                         LIBC="libc.so"
4383                         INTL="libintl.so"
4384                 esac
4385                 if test x"$GCC" = xyes; then
4386                         # We don't support v8 cpus
4387                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4388                 fi
4389                 if test x"$AR" = xfalse; then
4390                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4391                 fi
4392                 ;;
4393         *-mingw*|*-*-cygwin*)
4394                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4395                 have_visibility_hidden=no
4396                 INTL="intl"
4397                 case "$host" in
4398                         x86_64*mingw*)
4399                                 # Old Boehm fails to compile for x86_64-mingw.
4400                                 # It is trivial to fix, but just silently drop it.
4401                                 boehm_supported=false
4402                                 ;;
4403                 esac
4404                 ;;
4405         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4406         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4407         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4408                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4409                         TARGET=POWERPC64;
4410                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4411                         if ! (echo $CC | grep -q -- 'clang'); then
4412                                 CFLAGS="$CFLAGS -mminimal-toc"
4413                         fi
4414                 else
4415                         TARGET=POWERPC;
4416                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4417                 fi
4418                 arch_target=ppc;
4419                 case $host_os in
4420                   aix*|os400*)
4421                         BTLS_SUPPORTED=yes
4422                         BTLS_PLATFORM=powerpc
4423                         ;;
4424                   linux*)
4425                         BTLS_SUPPORTED=yes
4426                         BTLS_PLATFORM=powerpc
4427                         ;;
4428                 esac
4429                 ;;
4430         armv7k-*-darwin*)
4431                 TARGET=ARM;
4432                 TARGET_SYS=WATCHOS
4433                 arch_target=arm;
4434                 arm_fpu=VFP_HARD
4435                 ACCESS_UNALIGNED="no"
4436                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4437                 ;;
4439         arm*-darwin*)
4440                 TARGET=ARM;
4441                 arch_target=arm;
4442                 ACCESS_UNALIGNED="no"
4443                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4444                 ;;
4445         arm*-linux*)
4446                 TARGET=ARM;
4447                 arch_target=arm;
4448                 ACCESS_UNALIGNED="no"
4449                 AOT_SUPPORTED="yes"
4450                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4451                 BTLS_SUPPORTED=yes
4452                 BTLS_PLATFORM=arm
4453                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4454                 case "$target" in
4455                 arm*-linux*-gnueabi)
4456                         BTLS_PLATFORM=armsoft
4457                         ;;
4458                 esac
4459                 ;;
4460         arm*-netbsd*-eabi*)
4461                 TARGET=ARM;
4462                 arch_target=arm;
4463                 ACCESS_UNALIGNED="no"
4464                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4465                 ;;
4466         aarch64-*darwin*ilp32)
4467                 TARGET=ARM6432
4468                 arch_target=arm64
4469                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4470                 sizeof_register=8
4471                 # assuming no other target other than watchOS is using aarch64*darwin triple
4472                 TARGET_SYS=WATCHOS
4473                 ;;
4474         aarch64-*)
4475                 # https://lkml.org/lkml/2012/7/15/133
4476                 TARGET=ARM64
4477                 arch_target=arm64
4478                 boehm_supported=false
4479                 AOT_SUPPORTED="yes"
4480                 BTLS_SUPPORTED=yes
4481                 BTLS_PLATFORM=aarch64
4482                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4483                 ;;
4484         s390x-*-linux*)
4485                 TARGET=S390X;
4486                 arch_target=s390x;
4487                 ACCESS_UNALIGNED="yes"
4488                 BTLS_SUPPORTED=yes
4489                 BTLS_PLATFORM=s390x
4490                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4491                 ;;
4492         riscv32-*)
4493                 TARGET=RISCV32
4494                 ACCESS_UNALIGNED=no
4495                 AOT_SUPPORTED=no
4496                 BTLS_SUPPORTED=yes
4497                 BTLS_PLATFORM=riscv32
4498                 arch_target=riscv32
4499                 boehm_supported=false
4500                 ;;
4501         riscv64*)
4502                 TARGET=RISCV64
4503                 ACCESS_UNALIGNED=no
4504                 AOT_SUPPORTED=no
4505                 BTLS_SUPPORTED=yes
4506                 BTLS_PLATFORM=riscv64
4507                 arch_target=riscv64
4508                 boehm_supported=false
4509                 ;;
4510 esac
4512 HOST=$TARGET
4514 if test "x$host" != "x$target"; then
4515    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4516    enable_mcs_build=no
4517    enable_support_build=no
4518    BTLS_SUPPORTED=no
4519    # Can't use tls, since it depends on the runtime detection of tls offsets
4520    # in mono-compiler.h
4521    with_tls=pthread
4522    target_mach=no
4523    case "$target" in
4524    wasm32*)
4525                 TARGET=WASM
4526                 arch_target=wasm
4527                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4528                 ;;
4529    arm*-darwin*)
4530                 TARGET=ARM;
4531                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4532                 case "$target" in
4533                 armv7k-*)
4534                         arm_fpu=VFP_HARD
4535                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4536                         ;;
4537                 esac            
4538                 ;;
4539    powerpc64-ps3-linux-gnu)
4540                 TARGET=POWERPC64
4541                 arch_target=powerpc64
4542                 AC_DEFINE(TARGET_PS3, 1, [...])
4543                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4544                 # uses this define
4545                 AC_DEFINE(__mono_ppc64__, 1, [...])
4546                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4547                 sizeof_register=8
4548                 target_byte_order=G_BIG_ENDIAN
4549                 ;;
4550    powerpc64-xbox360-linux-gnu)
4551                 TARGET=POWERPC64
4552                 arch_target=powerpc64
4553                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4554                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4555                 # uses this define
4556                 sizeof_register=8
4557                 target_byte_order=G_BIG_ENDIAN
4558                 ;;
4559    arm*-linux-*)
4560                 TARGET=ARM;
4561                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4562                 ;;
4563    arm*-netbsd*-eabi*)
4564                 TARGET=ARM;
4565                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4566                 ;;
4567    i686*-linux-*)
4568                 TARGET=X86;
4569                 ;;
4570    i*86-apple-*)
4571                 TARGET=X86;
4572                 ;;
4573    x86_64*-linux-*)
4574                 TARGET=AMD64;
4575                 ;;
4576    x86_64-ps4-freebsd)
4577                 TARGET=AMD64;
4578                 AC_DEFINE(TARGET_PS4, 1, [...])
4579                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4580                 CPPFLAGS="$CPPFLAGS"
4581                 target_win32=no
4582                 ;;
4583         aarch64*darwin*_ilp32)
4584                 TARGET=ARM6432;
4585                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4586                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4587                 ;;
4588         aarch64-*)
4589                 TARGET=ARM64
4590                 ;;
4591         riscv32*)
4592                 TARGET=RISCV32
4593                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4594                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4595                 arch_target=riscv32
4596                 target_mach=no
4597                 with_tls=pthread
4598                 ;;
4599         riscv64*)
4600                 TARGET=RISCV64
4601                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4602                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4603                 arch_target=riscv64
4604                 target_mach=no
4605                 with_tls=pthread
4606                 ;;
4607         x86_64-google-fuchsia)
4608                 TARGET=AMD64
4609                 target_win32=nop
4610                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
4611                 ;;
4612         *)
4613                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4614         esac
4616         case "$target" in
4617         *-darwin*)
4618                 target_mach=yes
4619                 ;;
4620         *-linux-android*)
4621                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4622                 ;;
4623         esac
4626 case "$TARGET" in
4627 WASM)
4628         AC_DEFINE(TARGET_WASM, 1, [...])
4629         arch_target=wasm
4630         ;;
4631 X86)
4632         AC_DEFINE(TARGET_X86, 1, [...])
4633         arch_target=x86
4634         ;;
4635 AMD64)
4636         AC_DEFINE(TARGET_AMD64, 1, [...])
4637         arch_target=amd64
4638         ;;
4639 ARM)
4640         AC_DEFINE(TARGET_ARM, 1, [...])
4641         arch_target=arm
4642         ACCESS_UNALIGNED="no"
4643         ;;
4644 ARM64|ARM6432)
4645         AC_DEFINE(TARGET_ARM64, 1, [...])
4646         arch_target=arm64
4647         ;;
4648 POWERPC)
4649         AC_DEFINE(TARGET_POWERPC, 1, [...])
4650         ;;
4651 POWERPC64)
4652         AC_DEFINE(TARGET_POWERPC, 1, [...])
4653         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4654         ;;
4655 S390X)
4656         AC_DEFINE(TARGET_S390X, 1, [...])
4657         ;;
4658 MIPS)
4659         AC_DEFINE(TARGET_MIPS, 1, [...])
4660         ;;
4661 SPARC)
4662         AC_DEFINE(TARGET_SPARC, 1, [...])
4663         ;;
4664 SPARC64)
4665         AC_DEFINE(TARGET_SPARC64, 1, [...])
4666         ;;
4667 RISCV32)
4668         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4669         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4670         ;;
4671 RISCV64)
4672         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4673         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4674         ;;
4675 esac
4677 case "$TARGET" in
4678 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4679     target_sizeof_void_p=4
4680     ;;
4681 *64* | S390X)
4682     target_sizeof_void_p=8
4683     ;;
4685     AC_MSG_ERROR([unknown target])
4686     ;;
4687 esac
4689 case "$HOST" in
4690 WASM)
4691         AC_DEFINE(HOST_WASM, 1, [...])
4692         ;;
4693 X86)
4694         AC_DEFINE(HOST_X86, 1, [...])
4695         ;;
4696 AMD64)
4697         AC_DEFINE(HOST_AMD64, 1, [...])
4698         ;;
4699 ARM)
4700         AC_DEFINE(HOST_ARM, 1, [...])
4701         ;;
4702 ARM64)
4703         AC_DEFINE(HOST_ARM64, 1, [...])
4704         ;;
4705 POWERPC)
4706         AC_DEFINE(HOST_POWERPC, 1, [...])
4707         ;;
4708 POWERPC64)
4709         AC_DEFINE(HOST_POWERPC, 1, [...])
4710         AC_DEFINE(HOST_POWERPC64, 1, [...])
4711         ;;
4712 S390X)
4713         AC_DEFINE(HOST_S390X, 1, [...])
4714         ;;
4715 MIPS)
4716         AC_DEFINE(HOST_MIPS, 1, [...])
4717         ;;
4718 SPARC)
4719         AC_DEFINE(HOST_SPARC, 1, [...])
4720         ;;
4721 SPARC64)
4722         AC_DEFINE(HOST_SPARC64, 1, [...])
4723         ;;
4724 RISCV32)
4725         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4726         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4727         ;;
4728 RISCV64)
4729         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4730         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4731         ;;
4732 esac
4734 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4735 case "$HOST" in
4736 X86 | AMD64 | ARM | ARM64)
4737         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4738         ;;
4739 esac
4741 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4742 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4744 dnl *************
4745 dnl *** VTUNE ***
4746 dnl *************
4748 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4749 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4751 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4753 if test "x$enable_vtune" = "xyes"; then
4754         if test "x$with_vtune" = "x"; then
4755                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4756         else
4757                 VTUNE_PATH=$with_vtune
4758         fi
4759         VTUNE_INCLUDE=$VTUNE_PATH/include
4760         case "$TARGET" in
4761         X86)
4762                 VTUNE_LIB=$VTUNE_PATH/lib32
4763                 ;;
4764         AMD64)
4765                 VTUNE_LIB=$VTUNE_PATH/lib64
4766                 ;;
4767         *)
4768                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4769                 ;;
4770         esac
4771         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4772                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4773         fi
4774         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4775                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4776         fi
4778         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4779         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4781         AC_SUBST(VTUNE_LIBS)
4782         AC_SUBST(VTUNE_CFLAGS)
4784 dnl Use GCC atomic ops if they work on the target.
4785 if test x$GCC = "xyes"; then
4786         case $TARGET in
4787         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4788                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4789                 ;;
4790         esac
4793 if test "x$target_mach" = "xyes"; then
4795    if test "x$TARGET_SYS" = "xWATCHOS"; then
4796           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4797           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4798           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4799           BTLS_SUPPORTED=no
4800    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4801           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4802           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4803           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4804           BTLS_SUPPORTED=no
4805           target_ios=yes
4806    else
4807        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4808        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4809        #error fail this for ios
4810        #endif
4811        ], [
4812                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4813           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4814           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4815           target_osx=yes
4816        ], [
4817           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4818           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4819           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4820           BTLS_SUPPORTED=no
4821                   target_ios=yes
4822        ])
4823         fi
4824    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4827 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4829 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4831 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4832    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4833 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4834    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4835 else
4836    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4839 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4841 if test "x$sizeof_register" = "x4"; then
4842   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4843 elif test "x$sizeof_register" = "x8"; then
4844   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4845 else
4846   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4849 if test "x$have_visibility_hidden" = "xyes"; then
4850    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4853 if test "x$have_deprecated" = "xyes"; then
4854    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4857 dnl 
4858 dnl Simple Generational checks (sgen)
4860 SGEN_DEFINES=
4861 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4862 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4863 if test x$buildsgen = xyes; then
4864    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4865    SGEN_DEFINES="-DHAVE_SGEN_GC"
4867         conc_gc_msg=""
4868    if test x$with_sgen_default_concurrent != xno; then
4869        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4870            conc_gc_msg=" (concurrent by default)"
4871    fi
4873    if test "x$gc_msg" = "x"; then
4874       gc_msg="sgen$conc_gc_msg"
4875    else
4876       gc_msg="sgen$conc_gc_msg and $gc_msg"
4877    fi
4879 AC_SUBST(SGEN_DEFINES)
4880 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4882 jit_status="Building and using the JIT"
4884 libsuffix=".so"
4886 case "$host" in
4887      *-*-aix*)
4888         dnl on AIX/PASE, shared libraries can be and usually are inside archives
4889         dnl so, we specify them by libfoo.a(libfoo.so.0) for libtool's conventions,
4890         dnl or libfoo.a(shr[_64].o) for the AIX system convention,
4891         dnl or lib.so[.0](shr[_64].o) for libtool's hybrid convention
4892         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX
4893         LIBC="libc.a(shr_64.o)"
4894         # Thanks, I hate it! This is crumbly, especially the one-liner.
4895         AC_MSG_CHECKING([how to dlopen libintl])
4896         AC_LINK_IFELSE([AC_LANG_SOURCE([
4897                 /* XXX: Check for libintl header/gettext func better? */
4898                 #include <libintl.h>
4900                 int main (void) {
4901                         gettext("Dummy for autoconf");
4902                         return 1;
4903                 }
4904         ])],
4905         [
4906         INTL="$(dump -X64 -Hp conftest$EXEEXT | grep libintl | cut -c 38- | tr -s " " | awk '{print $1"("$2")"}')"
4907         AC_MSG_RESULT([yes, $INTL])
4908         ],
4909         [
4910         INTL="libintl.a(libintl.so.8)"
4911         AC_MSG_RESULT([no, falling back to $INTL])
4912         ])
4913         SQLITE3="libsqlite3.a(libsqlite3.so.0)"
4914         # it's very tempting to set a libsuffix, but it depends on the soname value
4915         ;;
4916      *-*-os400*)
4917         dnl However, IBM's packages for i try to be more "normal" than the AIX world, naming wise.
4918         dnl The library archives has "normal" .so names, but they're members with predictable "shr" names for fat libraries.
4919         LIBC="libc.a(shr_64.o)"
4920         INTL="libintl.so(shr_64.o)"
4921         SQLITE3="libsqlite3.so(shr_64.o)"
4922         # likewise, it's safer to assume ".so(shr_64.o)" due to official IBM packages being built this way, but as with AIX, others may not be guaranteed
4923         # it may be worth revisiting this in the future
4924         ;;
4925      *-*-darwin*)
4926         libsuffix=".dylib"
4927         LIBC="libc.dylib"
4928         INTL="libintl.dylib"
4929         SQLITE="libsqlite.0.dylib"
4930         SQLITE3="libsqlite3.0.dylib"
4931         X11="libX11.dylib"
4932         GDKX11="libgdk-x11-2.0.dylib"
4933         GTKX11="libgtk-x11-2.0.dylib"
4934         ;;
4935      *-*-*netbsd*)
4936         LIBC="libc.so"
4937         INTL="libintl.so"
4938         SQLITE="libsqlite.so"
4939         SQLITE3="libsqlite3.so"
4940         ;;
4941      *-*-kfreebsd*-gnu)
4942         LIBC="libc.so.0.1"
4943         INTL="libc.so.0.1"
4944         X11="libX11.so.6"
4945         ;;
4946     *-*-*freebsd*)
4947         LIBC="libc.so.7"
4948         INTL="libintl.so"
4949         SQLITE="libsqlite.so"
4950         SQLITE3="libsqlite3.so"
4951         ;;
4952     *-*-*openbsd*)
4953         LIBC="libc.so"
4954         INTL="libintl.so"
4955         SQLITE="libsqlite.so"
4956         SQLITE3="libsqlite3.so"
4957         ;;
4958     *-*-*linux*)
4959         AC_PATH_X
4960         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4961         AC_MSG_CHECKING(for the soname of libX11.so)
4962         for i in $x_libraries $dlsearch_path; do
4963                 for r in 4 5 6; do
4964                         if test -f $i/libX11.so.$r; then
4965                                 X11=libX11.so.$r
4966                                 AC_MSG_RESULT($X11)
4967                         fi
4968                 done
4969         done
4970         
4971         if test "x$X11" = "xlibX11.so"; then
4972                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4973                 X11=libX11.so.6
4974         fi
4975         ;;
4976 esac
4978 AC_SUBST(libsuffix)
4980 ######################################
4981 # EGLIB CHECKS
4982 ######################################
4984 GNUC_PRETTY=
4985 GNUC_UNUSED=
4986 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4987 if test x$GCC = xyes; then
4988    GNUC_UNUSED='__attribute__((__unused__))'
4989    GNUC_NORETURN='__attribute__((__noreturn__))'
4990    case $host_cpu in
4991      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4992    esac
4994 AC_SUBST(GNUC_PRETTY)
4995 AC_SUBST(GNUC_UNUSED)
4996 AC_SUBST(GNUC_NORETURN)
4997 AC_SUBST(BREAKPOINT)
4999 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
5001 case $host in
5002 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
5003     PATHSEP='\\'
5004     SEARCHSEP=';'
5005     OS="WIN32"
5006     PIDTYPE='void *'
5007     ;;
5009     PATHSEP='/'
5010     SEARCHSEP=':'
5011     OS="UNIX"
5012     PIDTYPE='int'
5013     ;;
5014 esac
5016 case $host in
5017         *-*-solaris*)
5018         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
5019         ;;
5020 esac
5022 case $target in
5023 arm*-darwin*|aarch64*-*|riscv*)
5024     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
5025     ;;
5026 i*86-*-darwin*)
5027     ORDER=G_LITTLE_ENDIAN
5028     ;;
5029 *-*-haiku*)
5030     LDFLAGS="$LDFLAGS -ltextencoding"
5031     ;;
5032 *-*-openbsd*)
5033     CFLAGS="$CFLAGS -pthread"
5034     LDFLAGS="$LDFLAGS -pthread"
5035     ;;
5036 esac
5038 AC_SUBST(ORDER)
5039 AC_SUBST(PATHSEP)
5040 AC_SUBST(SEARCHSEP)
5041 AC_SUBST(OS)
5042 AC_SUBST(PIDTYPE)
5044 # Defined for all targets/platforms using classic Windows API support.
5045 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
5046 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
5048 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
5049 AC_CHECK_FUNCS(getrlimit)
5050 AC_CHECK_FUNCS(fork execv execve)
5051 AC_CHECK_FUNCS(waitpid)
5053 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
5055 if test x$with_overridable_allocators = xyes; then
5056         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5057   AC_MSG_NOTICE([Overridable allocator support enabled])
5058 else
5059   AC_MSG_NOTICE([Overridable allocator support disabled])
5063 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
5064 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
5065 # removed once support for 10.6 is dropped.
5067 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
5069 if test x$target_osx = xyes; then
5070 AC_CHECK_FUNCS(getpwuid_r)
5071 elif test x$target_ios = xno; then
5072 AC_CHECK_FUNCS(strndup getpwuid_r)
5075 AC_SEARCH_LIBS(sqrtf, m)
5077 # nanosleep may not be part of libc, also search it in other libraries
5078 AC_SEARCH_LIBS(nanosleep, rt)
5080 AC_SEARCH_LIBS(dlopen, dl)
5081 old_ldflags="${LDFLAGS}"
5082 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
5083 if test $lt_cv_prog_gnu_ld = yes; then
5084         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic,-Bsymbolic"
5085 else
5086         case $host in
5087         *-*-aix*|*-*-os400*)
5088                 LDFLAGS="${LDFLAGS} -bsymbolic"
5089                 ;;
5090         *)
5091                 dnl Try to use export-dynamic anyways
5092                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic,-Bsymbolic"
5093                 ;;
5094         esac
5096 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
5097 if test $found_export_dynamic = no; then
5098         LDFLAGS="${old_ldflags}"
5101 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
5102 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
5103 AC_CHECK_LIB(iconv, iconv_open)
5104 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
5105 AC_SUBST(HAVE_ALLOCA_H)
5107 # Get the exact type of size_t, not just its size.
5108 # This is so we can find an exact printf format among u, lu, llu, I64u.
5109 # To avoid warnings about slight mismatches.
5110 # C99 runtime "zu" dependency is being avoided here.
5112 # We have to compile as C++ because C is too lenient
5113 # and lets the wrong thing compile, with warnings.
5115 # Note: "zu" or ifdef <something> have the advantage
5116 # of producing installable "biarch" headers. i.e. one Mac header
5117 # for Mac/x86 and Mac/amd64.
5119 AC_LANG_PUSH(C++)
5121 # Check long before int because it is the overwhelming Unix answer,
5122 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
5124 # long ahead of int also tends to produce biarch-compatible headers except Windows.
5126 AC_MSG_CHECKING(if size_t is unsigned long)
5127 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5128         #include <stddef.h>
5129         unsigned long *a = (size_t*)0;
5130 ])], [
5131         AC_MSG_RESULT(yes)
5132         AC_SUBST(GSIZE_FORMAT, '"lu"')
5133 ], [
5134         AC_MSG_RESULT(no)
5135         AC_MSG_CHECKING(if size_t is unsigned int)
5136         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5137                 #include <stddef.h>
5138                 unsigned *a = (size_t*)0;
5139         ])], [
5140                 AC_MSG_RESULT(yes)
5141                 AC_SUBST(GSIZE_FORMAT, '"u"')
5142         ], [
5143 # At this point the majority of systems have their answer,
5144 # and we descend into non-standard or new-standard territory.
5146 # Check __int64 first because I64 on some systems predates ll, enabling
5147 # new compiler/old runtime interop, and the types always have the same size.
5148                 AC_MSG_RESULT(no)
5149                 AC_MSG_CHECKING(if size_t is unsigned __int64)
5150                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5151                         #include <stddef.h>
5152                         unsigned __int64 *a = (size_t*)0;
5153                 ])], [
5154                         AC_MSG_RESULT(yes)
5155                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
5156                 ], [
5157                         AC_MSG_RESULT(no)
5158                         AC_MSG_CHECKING(if size_t is unsigned long long)
5159                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5160                                 #include <stddef.h>
5161                                 unsigned long long *a = (size_t*)0;
5162                         ])], [
5163                                 AC_MSG_RESULT(yes)
5164                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
5165                         ], [
5166                                 AC_MSG_RESULT(no)
5167                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
5168                         ] )
5169                 ] )
5170         ] )
5171 ] )
5173 AC_LANG_POP
5175 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
5176 # This provides for an exact match with functions that
5177 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
5178 # uintptr_t is not necessarily the same.
5180 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
5181 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
5183 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
5184    GSIZE="size_t"
5185    GSSIZE="ptrdiff_t"
5186 else
5187    GSIZE="uintptr_t"
5188    GSSIZE="intptr_t"
5191 AC_SUBST(GSIZE)
5192 AC_SUBST(GSSIZE)
5193 AC_SUBST(GSIZE_FORMAT)
5196 # END OF EGLIB CHECKS
5199 AC_ARG_WITH([libgdiplus],
5200         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
5201         [], [with_libgdiplus=installed])
5203 # default install location
5204 libgdiplus_install_loc=libgdiplus${libsuffix}
5205 case "$host" in
5206     *-*-*linux*)
5207     libgdiplus_install_loc=libgdiplus${libsuffix}.0
5208     ;;
5209 esac
5211 case $with_libgdiplus in
5212     no)
5213     libgdiplus_loc=
5214     ;;
5216     installed)
5217     libgdiplus_loc=
5218     if test x$cross_compiling = xno; then
5219         if test x$host_darwin = xyes; then
5220             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
5221             if test -x $a; then
5222               libgdiplus_install_loc=$a
5223               libgdiplus_loc=$a
5224             fi
5225         fi
5226     fi
5227     ;;
5229     yes|sibling)
5230     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5231     ;;
5233     /*) # absolute path, assume it is an install location
5234     libgdiplus_loc=$with_libgdiplus
5235     libgdiplus_install_loc=$with_libgdiplus
5236     ;;
5238     *)
5239     libgdiplus_loc=`pwd`/$with_libgdiplus
5240     ;;
5241 esac
5242 AC_SUBST(libgdiplus_loc)
5243 AC_SUBST(libgdiplus_install_loc)
5245 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)
5246 if test "x$icall_symbol_map" = "xyes"; then
5247    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5250 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5251 if test "x$icall_export" = "xyes"; then
5252    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5255 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5256 if test "x$icall_tables" = "xno"; then
5257    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5260 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5262 if test "x$with_tls" = "x__thread"; then
5263         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5264         # Pass the information to libgc
5265         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5266         AC_MSG_CHECKING(if the tls_model attribute is supported)
5267         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5268                 ], [
5269                         AC_MSG_RESULT(yes)
5270                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5271                 ], [
5272                         AC_MSG_RESULT(no)
5273         ])
5276 if test ${TARGET} = ARM; then
5277         dnl ******************************************
5278         dnl *** Check to see what FPU is available ***
5279         dnl ******************************************
5280         AC_MSG_CHECKING(which FPU to use)
5282         #
5283         # This is a bit tricky:
5284         #
5285         # if (__ARM_PCS_VFP) {
5286         #       /* mfloat-abi=hard == VFP with hard ABI */
5287         # } elif (!__SOFTFP__) {
5288         #       /* mfloat-abi=softfp == VFP with soft ABI */
5289         # } else {
5290         #       /* mfloat-abi=soft == no VFP */
5291         # }
5292         #
5293         # The exception is iOS (w/ GCC) where none of the above
5294         # are defined (but iOS always uses the 'softfp' ABI).
5295         #
5296         # No support for FPA.
5297         #
5299         fpu=NONE
5301         # iOS GCC always uses the 'softfp' ABI.
5302         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5303                 fpu=VFP
5304         fi
5306         # Are we using the 'hard' ABI?
5307         if test x$fpu = xNONE; then
5308                 AC_TRY_COMPILE([], [
5309                         #ifndef __ARM_PCS_VFP
5310                         #error "Float ABI is not 'hard'"
5311                         #endif
5312                 ], [
5313                         fpu=VFP_HARD
5314                 ], [
5315                         fpu=NONE
5316                 ])
5317         fi
5319         # No 'hard' ABI. 'soft' or 'softfp'?
5320         if test x$fpu = xNONE; then
5321                 AC_TRY_COMPILE([], [
5322                         #ifdef __SOFTFP__
5323                         #error "Float ABI is not 'softfp'"
5324                         #endif
5325                 ], [
5326                         fpu=VFP
5327                 ], [
5328                         fpu=NONE
5329                 ])
5330         fi
5332         if test x$arm_fpu != x; then
5333            fpu=$arm_fpu
5334         fi
5336         AC_MSG_RESULT($fpu)
5337         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5338         unset fpu
5340         dnl *********************************************
5341         dnl *** Check which ARM version(s) we can use ***
5342         dnl *********************************************
5343         AC_MSG_CHECKING(which ARM version to use)
5345         AC_TRY_COMPILE([], [
5346                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5347                 #error Not on ARM v5.
5348                 #endif
5349         ], [
5350                 arm_v5=yes
5352                 arm_ver=ARMv5
5353         ], [])
5355         AC_TRY_COMPILE([], [
5356                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5357                 #error Not on ARM v6.
5358                 #endif
5359         ], [
5360                 arm_v5=yes
5361                 arm_v6=yes
5363                 arm_ver=ARMv6
5364         ], [])
5366         AC_TRY_COMPILE([], [
5367                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5368                 #error Not on ARM v7.
5369                 #endif
5370         ], [
5371                 arm_v5=yes
5372                 arm_v6=yes
5373                 arm_v7=yes
5375                 arm_ver=ARMv7
5376         ], [])
5378         AC_MSG_RESULT($arm_ver)
5380         if test x$arm_v5 = xyes; then
5381                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5382                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5383         fi
5385         if test x$arm_v6 = xyes; then
5386                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5387                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5388         fi
5390         if test x$arm_v7 = xyes; then
5391                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5392                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5393         fi
5395         if test x$host_linux = xyes; then
5396                 RID="linux-arm"
5397                 COREARCH="arm"
5398                 if test x$fpu = xNONE; then
5399                         RID="linux-armel"
5400                         COREARCH="armel"
5401                 fi
5402         fi
5405 AC_SUBST(RID)
5406 AC_SUBST(COREARCH)
5407 AC_SUBST(CORETARGETS)
5409 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5410         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5412         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5414         if test x$fpabi = xauto; then
5415                 AC_TRY_COMPILE([], [
5416                         #ifdef __riscv_float_abi_double
5417                         #error "double"
5418                         #endif
5419                 ], [
5420                         fpabi=auto
5421                 ], [
5422                         fpabi=double
5423                 ])
5424         fi
5426         if test x$fpabi = xauto; then
5427                 AC_TRY_COMPILE([], [
5428                         #ifdef __riscv_float_abi_single
5429                         #error "single"
5430                         #endif
5431                 ], [
5432                         fpabi=auto
5433                 ], [
5434                         fpabi=single
5435                 ])
5436         fi
5438         if test x$fpabi = xauto; then
5439                 AC_TRY_COMPILE([], [
5440                         #ifdef __riscv_float_abi_soft
5441                         #error "soft"
5442                         #endif
5443                 ], [
5444                         fpabi=auto
5445                 ], [
5446                         fpabi=soft
5447                 ])
5448         fi
5450         case $fpabi in
5451         double)
5452                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5453                 AC_MSG_RESULT([double-precision])
5454                 ;;
5455         single)
5456                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5457                 AC_MSG_ERROR([single-precision, not supported])
5458                 ;;
5459         soft)
5460                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5461                 AC_MSG_RESULT([soft float])
5462                 ;;
5463         auto)
5464                 AC_MSG_ERROR([unknown])
5465                 ;;
5466         *)
5467                 AC_MSG_ERROR([invalid option: $fpabi])
5468                 ;;
5469         esac
5472 if test ${TARGET} = unknown; then
5473         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5474         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5477 if test "x$platform_android" = "xyes"; then
5478         case "x${TARGET}" in
5479         xARM)
5480                 case "x$arm_ver" in
5481                 xARMv5)
5482                         BTLS_SUPPORTED=yes
5483                         BTLS_PLATFORM=android-armv5
5484                         ;;
5485                 xARMv6)
5486                         BTLS_SUPPORTED=yes
5487                         BTLS_PLATFORM=android-armv6
5488                         ;;
5489                 xARMv7)
5490                         BTLS_SUPPORTED=yes
5491                         BTLS_PLATFORM=android-armv7
5492                         ;;
5493                 *)
5494                         BTLS_SUPPORTED=no
5495                         ;;
5496                 esac
5497                 ;;
5498         xARM64)
5499                 BTLS_SUPPORTED=yes
5500                 BTLS_PLATFORM=android-v8a
5501                 ;;
5502         xX86)
5503                 BTLS_SUPPORTED=yes
5504                 BTLS_PLATFORM=android-x86
5505                 ;;
5506         xAMD64)
5507                 BTLS_SUPPORTED=yes
5508                 BTLS_PLATFORM=android-x64
5509                 ;;
5510         *)
5511                 BTLS_SUPPORTED=no
5512                 ;;
5513         esac
5516 if test ${ACCESS_UNALIGNED} = no; then
5517         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5520 if test x$host_darwin = xyes; then
5521         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5522         AS_IF(
5523                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5524                 [AC_MSG_RESULT([no])],
5525                 [
5526                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5527                         AR_FLAGS="Scru"
5528                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5529                         AC_MSG_RESULT([yes])
5530                 ]
5531         )
5534 case "x$libgc" in
5535         xincluded)
5536                 # Pass CPPFLAGS to libgc configure
5537                 # We should use a separate variable for this to avoid passing useless and
5538                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5539                 # This should be executed late so we pick up the final version of CPPFLAGS
5540                 # The problem with this approach, is that during a reconfigure, the main
5541                 # configure scripts gets invoked with these arguments, so we use separate
5542                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5543                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5544                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5545                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5546                 fi
5547                 # Don't pass -finstrument-for-thread-suspension in, 
5548                 # if these are instrumented it will be very bad news 
5549                 # (infinite recursion, undefined parking behavior, etc)
5550                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5551                 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\""
5552                 if test "x$support_boehm" = "xyes"; then
5553                         AC_CONFIG_SUBDIRS(libgc)
5554                 fi
5555                 ;;
5556 esac
5558 MALLOC_MEMPOOLS=no
5559 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5560         if test x$with_malloc_mempools = xyes; then
5561                 MALLOC_MEMPOOLS=yes
5562                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5563         fi
5567 DISABLE_MCS_DOCS=default
5568 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5569         if test x$with_mcs_docs != xyes; then
5570                 DISABLE_MCS_DOCS=yes
5571         fi
5573 if test -n "$INSTALL_4_x_TRUE"; then :
5574         DISABLE_MCS_DOCS=yes
5576 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5577    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5580 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)],[
5581         if test x$with_lazy_gc_thread_creation != xno ; then
5582                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5583         fi
5584 ], [with_lazy_gc_thread_creation=no])
5586 dnl *****************************
5587 dnl *** Thread suspend policy ***
5588 dnl *****************************
5590 dnl Set a default hybrid or cooperative suspend on some platforms
5592 dnl Coop default is set by the bitcode preset.
5594 dnl If coop isn't on by default, maybe hybrid should be?
5595 if test x$enable_cooperative_suspend_default != xyes; then
5596         case $HOST in
5597         X86 | AMD64)
5598                 dnl Some host/target confusion, there's no host_osx (and
5599                 dnl host_darwin would be true on iOS not just macOS).
5600                 if test x$target_osx = xyes; then
5601                         enable_hybrid_suspend_default=yes
5602                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5603                         enable_hybrid_suspend_default=yes
5604                 fi
5605                 ;;
5606         esac
5609 dnl Now check if there were flags overriding the defaults
5611 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])
5612 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5614 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5615         enable_cooperative_suspend=$with_cooperative_gc
5618 if test x$enable_cooperative_suspend = xdefault; then
5619         enable_cooperative_suspend=$enable_cooperative_suspend_default
5622 if test x$enable_cooperative_suspend != xno; then
5623         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5626 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5628 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])
5630 if test x$enable_hybrid_suspend = xdefault; then
5631    enable_hybrid_suspend=$enable_hybrid_suspend_default
5634 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5635         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5638 if test x$enable_hybrid_suspend != xno ; then
5639         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5642 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5644 dnl End of thread suspend policy
5646 dnl *******************************
5647 dnl *** Copy stack data support ***
5648 dnl *******************************
5650 dnl Disable copy_stack_data on platforms supporting full context and
5651 dnl having access to full stack of running threads.
5652 if test x$enable_copy_stack_data_default != xno; then
5653         case $HOST in
5654         X86 | AMD64)
5655                 if test x$target_osx = xyes; then
5656                         dnl Some host/target confusion, there's no host_osx (and
5657                         dnl host_darwin would be true on iOS not just macOS).
5658                         enable_copy_stack_data_default=no
5659                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5660                         enable_copy_stack_data_default=no
5661                 fi
5662                 ;;
5663         esac
5666 AC_ARG_ENABLE(copy_stack_data, [ --enable-copy-stack-data     Enable copy_stack_data feature for hybrid/cooperative suspend scenarios, (defaults to yes)], [], [enable_copy_stack_data=default])
5668 if test x$enable_copy_stack_data = xdefault; then
5669    enable_copy_stack_data=$enable_copy_stack_data_default
5672 if test x$enable_copy_stack_data != xno ; then
5673         AC_DEFINE(ENABLE_COPY_STACK_DATA,1,[Enable copy_stack_data feature for hybrid/cooperative suspend scenarios])
5676 dnl End of Copy stack data support
5678 dnl ***************************
5679 dnl *** feature experiments ***
5680 dnl ***************************
5682 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5683 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5685         if test x$enable_experiment != x ; then
5686                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5687         fi
5688         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5689                 eval "mono_experiment_test_enable_$feature='yes'"
5690         done
5692         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5693                 eval "mono_experiment_test_enable_null='yes'"
5694                 true
5695         fi
5697         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5698                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5699         fi
5700 ],[])
5702 dnl **********************
5703 dnl *** checked builds ***
5704 dnl **********************
5706 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],[
5708         if test x$enable_checked_build != x ; then
5709                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5710         fi
5711         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5712                 eval "mono_checked_build_test_enable_$feature='yes'"
5713         done
5715         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5716                 eval "mono_checked_build_test_enable_gc='yes'"
5717                 eval "mono_checked_build_test_enable_metadata='yes'"
5718                 eval "mono_checked_build_test_enable_thread='yes'"
5719                 eval "mono_checked_build_test_enable_private_types='yes'"
5720                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5721         fi
5723         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5724                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5725         fi
5727         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5728                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5729         fi
5731         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5732                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5733         fi
5735         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5736                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5737         fi
5739         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5740                 # Required
5741                 with_overridable_allocators=yes
5742                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5744                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5745         fi
5746 ], [])
5748 dnl End of checked builds
5750 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5752 AC_CHECK_HEADER([malloc.h], 
5753                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5754                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5756 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5757 # instead of libmono-static.a
5758 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5759    LIBMONO_LA=libmini-static.la
5760 else
5761    if test x$buildsgen = xyes; then
5762       LIBMONO_LA=libmonosgen-$API_VER.la
5763    else
5764       LIBMONO_LA=libmonoboehm-$API_VER.la
5765    fi
5767 AC_SUBST(LIBMONO_LA)
5769 dnl **************
5770 dnl ***  Btls  ***
5771 dnl **************
5773 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5774 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5775 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5776 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5777 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5778 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])
5780 if test "x$with_btls_android_api" = "x" ; then
5781         case "$BTLS_PLATFORM" in
5782                 android-armv5)
5783                         with_btls_android_api=16" ;;
5784                 android-armv6)
5785                         with_btls_android_api=16" ;;
5786                 android-armv7)
5787                         with_btls_android_api=16 ;;
5788                 android-v8a)
5789                         with_btls_android_api=21 ;;
5790                 android-x86)
5791                         with_btls_android_api=16 ;;
5792                 android-x64)
5793                         with_btls_android_api=21 ;;
5794         esac
5797 if test "x$enable_btls" = "xno"; then
5798    enable_btls_lib=no
5801 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5803 btls_android=no
5804 if test "x$enable_btls" = "xyes"; then
5805         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5806         if test "x$CMAKE" = "xno"; then
5807                 AC_MSG_ERROR("cmake not found")
5808         fi
5810         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5811         AC_SUBST(BTLS_ROOT)
5813         btls_arch=
5814         btls_cflags=
5815         BTLS_CMAKE_ARGS=
5817         if test "x$host_win32" = "xyes"; then
5818                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5819         fi
5821         case "$BTLS_PLATFORM" in
5822         i386)
5823                 btls_arch=i386
5824                 btls_cflags="-m32"
5825                 case $host_os in
5826                         darwin*)
5827                                 btls_cflags="$btls_cflags -arch i386"
5828                                 ;;
5829                         mingw*|cygwin*)
5830                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5831                                 if test "x$HAVE_YASM" != "xyes"; then
5832                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5833                                 fi
5834                                 ;;
5835                 esac
5836                 ;;
5837         x86_64)
5838                 btls_arch=x86_64
5839                 case $host_os in
5840                         mingw*|cygwin*)
5841                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5842                                 if test "x$HAVE_YASM" != "xyes"; then
5843                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5844                                 fi
5845                                 ;;
5846                 esac
5847                 ;;
5848         arm)
5849                 btls_arch=arm
5850                 btls_cflags="-DOPENSSL_NO_ASM=1"
5851                 ;;
5852         armsoft)
5853                 btls_arch=arm
5854                 btls_cflags="-DOPENSSL_NO_ASM=1"
5855                 ;;
5856         aarch64)
5857                 btls_arch=aarch64
5858                 btls_cflags="-march=armv8-a+crypto"
5859                 ;;
5860         s390x)
5861                 btls_arch=s390x
5862                 ;;
5863         powerpc)
5864                 btls_arch=powerpc
5865                 case $host_os in
5866                         aix*|os400*)
5867                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5868                                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5869                 esac
5870                 ;;
5871         android-armv5)
5872                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5873                 ;;
5874         android-armv6)
5875                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5876                 ;;
5877         android-armv7)
5878                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5879                 ;;
5880         android-v8a)
5881                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5882                 ;;
5883         android-x86)
5884                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5885                 ;;
5886         android-x64)
5887                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5888                 ;;
5889         riscv32)
5890                 btls_arch=riscv32
5891                 ;;
5892         riscv64)
5893                 btls_arch=riscv64
5894                 ;;
5895         *)
5896                 AC_MSG_ERROR(Invalid BTLS platform)
5897         esac
5899         if test "x$platform_android" = "xyes"; then
5900                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5901                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5902                 fi
5904                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5905                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5906                 fi
5908                 btls_android=yes
5909                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5910                 if test "x$with_btls_android_ndk" != "x"; then
5911                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5912                 else
5913                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5914                 fi
5915         fi
5917         if test "x$btls_arch" != "x"; then
5918                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5919         fi
5921         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5922         AC_SUBST(BTLS_ARCH)
5923         AC_SUBST(BTLS_CFLAGS)
5924         AC_SUBST(BTLS_PLATFORM)
5925         AC_SUBST(BTLS_CMAKE_ARGS)
5927         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5928 else
5929         enable_btls=no
5932 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5934 if test x$DISABLE_MCS_DOCS = xyes; then
5935    docs_dir=""
5936 else
5937    docs_dir=docs
5939 AC_SUBST(docs_dir)
5941 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5942 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5943 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5945 libmono_ldflags="$libmono_ldflags $LIBS"
5947 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5948 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5949 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5950 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5951 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5952 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5953 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5954 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5955 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5956 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5957 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5958 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5959 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5960 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5961 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5962 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5963 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5964 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5965 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5966 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5967 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5968 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5969 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5970 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5972 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5974 AC_SUBST(LIBC)
5975 AC_SUBST(INTL)
5976 AC_SUBST(SQLITE)
5977 AC_SUBST(SQLITE3)
5978 AC_SUBST(ODBC)
5979 AC_SUBST(X11)
5980 AC_SUBST(GDKX11)
5981 AC_SUBST(GTKX11)
5982 AC_SUBST(XINERAMA)
5983 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5984 AC_SUBST(arch_target)
5986 #This must always be defined when building the runtime
5987 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5989 mono_build_root=`pwd`
5990 AC_SUBST(mono_build_root)
5992 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5993 if test x$host_win32 = xno; then
5994         if test x$enable_msvc = xyes; then
5995                 echo "Error, --enable-msvc only supported for Windows builds."
5996                 exit 1
5997         fi
5999 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
6001 if test "x$enable_msvc" = "xyes"; then
6002         if test "x$support_boehm" = "xyes"; then
6003                 echo "Error, Boehm GC is not supported when using --enable-msvc."
6004                 exit 1
6005         fi
6006         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
6007         if test "x$host_cpu" = "xi686"; then
6008                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
6009                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
6010                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
6011                 mono_runtime_wrapper=$mono_runtime
6012         else
6013                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
6014                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
6015                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
6016                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
6017         fi
6018         AC_SUBST(mono_msvc_build_dir)
6019         AC_SUBST(mono_msvc_build_lib_dir)
6020         AC_SUBST(mono_msvc_build_bin_dir)
6021 else
6022         mono_runtime=mono/mini/mono
6023         mono_runtime_wrapper=$mono_runtime
6026 AC_SUBST(mono_runtime)
6027 AC_SUBST(mono_runtime_wrapper)
6029 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.1.0-release/csc.exe
6030 VBCS_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.1.0-release/VBCSCompiler.exe
6032 if test $csc_compiler = mcs; then
6033   CSC=$mcs_topdir/class/lib/build/mcs.exe
6034 else
6035   CSC=$CSC_LOCATION
6038 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
6040 mono_cfg_root=$mono_build_root/runtime
6041 if test x$host_win32 = xyes; then
6042   if test "x$cross_compiling" = "xno"; then
6043     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
6044     CSC=`cygpath -m -a $CSC`
6045     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
6046     VBCS_LOCATION=`cygpath -m -a $VBCS_LOCATION`
6047   else
6048     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
6049   fi
6050 else
6051   mono_cfg_dir=$mono_cfg_root/etc
6054 if test "x$platform_android" = "xyes"; then
6055   mono_cfg_dir=
6058 AC_SUBST(mono_cfg_dir)
6060 AC_SUBST(CSC)
6062 AC_CONFIG_FILES([po/mcs/Makefile.in])
6064 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
6065 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
6066 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
6068 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
6069 [   depth=../../../..
6070     case $srcdir in
6071     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6072     .) reldir=$depth ;;
6073     *) reldir=$depth/$srcdir ;;
6074     esac
6075     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
6076     cd runtime/etc/mono/1.0
6077     rm -f machine.config
6078     $LN_S $reldir/data/net_1_1/machine.config machine.config
6079     cd $depth
6080 ],[LN_S='$LN_S'])
6082 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
6083 [   depth=../../../..
6084     case $srcdir in
6085     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6086     .) reldir=$depth ;;
6087     *) reldir=$depth/$srcdir ;;
6088     esac
6089     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6090     cd runtime/etc/mono/2.0
6091     rm -f machine.config
6092     $LN_S $reldir/data/net_2_0/machine.config machine.config
6093     cd $depth
6094 ],[LN_S='$LN_S'])
6096 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
6097 [   depth=../../../..
6098     case $srcdir in
6099     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6100     .) reldir=$depth ;;
6101     *) reldir=$depth/$srcdir ;;
6102     esac
6103     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6104     cd runtime/etc/mono/2.0
6105     rm -f web.config
6106     $LN_S $reldir/data/net_2_0/web.config web.config
6107     cd $depth
6108 ],[LN_S='$LN_S'])
6110 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
6111 [   depth=../../..
6112     case $srcdir in
6113     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6114     .) reldir=$depth ;;
6115     *) reldir=$depth/$srcdir ;;
6116     esac
6117     $ac_aux_dir/install-sh -d runtime/etc/mono/
6118     cd runtime/etc/mono/
6119     rm -f browscap.ini
6120     $LN_S $reldir/data/browscap.ini browscap.ini
6121     cd $depth
6122 ],[LN_S='$LN_S'])
6124 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
6125 [   depth=../../../../..
6126     case $srcdir in
6127     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6128     .) reldir=$depth ;;
6129     *) reldir=$depth/$srcdir ;;
6130     esac
6131     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
6132     cd runtime/etc/mono/2.0/Browsers
6133     rm -f Compat.browser
6134     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6135     cd $depth
6136 ],[LN_S='$LN_S'])
6138 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
6139 [   depth=../../../../..
6140     case $srcdir in
6141     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6142     .) reldir=$depth ;;
6143     *) reldir=$depth/$srcdir ;;
6144     esac
6145     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
6146     cd runtime/etc/mono/4.0/Browsers
6147     rm -f Compat.browser
6148     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6149     cd $depth
6150 ],[LN_S='$LN_S'])
6152 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
6153 [   depth=../../../../..
6154     case $srcdir in
6155     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6156     .) reldir=$depth ;;
6157     *) reldir=$depth/$srcdir ;;
6158     esac
6159     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
6160     cd runtime/etc/mono/4.5/Browsers
6161     rm -f Compat.browser
6162     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6163     cd $depth
6164 ],[LN_S='$LN_S'])
6166 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
6167 [   depth=../../../..
6168     case $srcdir in
6169     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6170     .) reldir=$depth ;;
6171     *) reldir=$depth/$srcdir ;;
6172     esac
6173     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6174     cd runtime/etc/mono/4.0
6175     rm -f machine.config
6176     $LN_S $reldir/data/net_4_0/machine.config machine.config
6177     cd $depth
6178 ],[LN_S='$LN_S'])
6180 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
6181 [   depth=../../../..
6182     case $srcdir in
6183     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6184     .) reldir=$depth ;;
6185     *) reldir=$depth/$srcdir ;;
6186     esac
6187     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6188     cd runtime/etc/mono/4.0
6189     rm -f web.config
6190     $LN_S $reldir/data/net_4_0/web.config web.config
6191     cd $depth
6192 ],[LN_S='$LN_S'])
6194 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
6195 [   depth=../../../..
6196     case $srcdir in
6197     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6198     .) reldir=$depth ;;
6199     *) reldir=$depth/$srcdir ;;
6200     esac
6201     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6202     cd runtime/etc/mono/4.5
6203     rm -f machine.config
6204     $LN_S $reldir/data/net_4_5/machine.config machine.config
6205     cd $depth
6206 ],[LN_S='$LN_S'])
6208 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
6209 [   depth=../../../..
6210     case $srcdir in
6211     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6212     .) reldir=$depth ;;
6213     *) reldir=$depth/$srcdir ;;
6214     esac
6215     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6216     cd runtime/etc/mono/4.5
6217     rm -f web.config
6218     $LN_S $reldir/data/net_4_5/web.config web.config
6219     cd $depth
6220 ],[LN_S='$LN_S'])
6222 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])
6223 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])
6224 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
6227 # Mono.Native Support
6228 # -------------------
6229 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
6230 # It is built as a stand-alone shared library and not bundled with the runtime because we
6231 # may need to build two different versions of it.
6233 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
6234 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
6236 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
6237 # implementation accordingly.  We build a single `libmono-native` shared library.
6239 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
6241 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
6242 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
6243 # depending on platform.
6245 # We build two versions of the shared library:
6246 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
6247 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
6249 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
6250 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
6251 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
6253 # This can be called by automated tests both to ensure that the library has been correctly installed and also
6254 # to verify that it's the correct version of it.
6257 AC_MSG_CHECKING([Mono.Native support])
6258 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
6259 if test x$disable_mono_native = xyes; then
6260         mono_native=no
6261 elif test x$target_osx = xyes; then
6262         MONO_NATIVE_CC=$CC
6263         MONO_NATIVE_CXX=$CXX
6264         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6265         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6266         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6267         MONO_NATIVE_CFLAGS=$CFLAGS
6268         MONO_NATIVE_LDFLAGS=$LDFLAGS
6270         mono_native=yes
6271         MONO_NATIVE_PLATFORM=macos
6272         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6274         if test x$enable_gss = xyes; then
6275                 MONO_NATIVE_LDFLAGS="$MONO_NATIVE_LDFLAGS -framework GSS"
6276         fi
6278         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6279                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6281         if test x$mono_native_compat = xyes; then
6282                 mono_native_compat=yes
6283                 mono_native_text="Mac OSX (compat + unified v10.12)"
6284                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6285                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6286                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6287                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6288                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6290                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6291                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6292                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6293                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6294                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6295                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6296         else
6297                 mono_native_compat=no
6298                 mono_native_text="Mac OSX"
6299         fi
6300 elif test x$mono_native_platform_ios = xyes; then
6301         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6303         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6304                 if test x$mono_native_ios_sim = xyes; then
6305                         mono_native_ios_target=ios-simulator
6306                         mono_native_text="iOS Simulator"
6307                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6308                 else
6309                         mono_native_ios_target=iphoneos
6310                         mono_native_text="iOS Device"
6311                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6312                 fi
6313                 mono_native_unified_version="10.0"
6314                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6315         ], [
6316                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6317                         if test x$mono_native_ios_sim = xyes; then
6318                                 mono_native_ios_target=tvos-simulator
6319                                 mono_native_text="AppleTV Simulator"
6320                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6321                         else
6322                                 mono_native_ios_target=tvos
6323                                 mono_native_text="AppleTV Device"
6324                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6325                         fi
6326                         mono_native_unified_version="10.0"
6327                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6328                 ], [
6329                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6330                                 if test x$mono_native_ios_sim = xyes; then
6331                                         mono_native_ios_target=watchos-simulator
6332                                         mono_native_text="Apple Watch Simulator"
6333                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6334                                 else
6335                                         mono_native_ios_target=watchos
6336                                         mono_native_text="Apple Watch Device"
6337                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6338                                 fi
6339                                 mono_native_unified_version="5.0"
6340                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6341                         ], [
6342                                 AC_MSG_ERROR([Unknown iOS Target])
6343                         ])
6344                 ])
6345         ])
6347         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6349         if test x$with_bitcode = xyes; then
6350                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6351                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6352         else
6353                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6354         fi
6356         if test x$enable_gss = xyes; then
6357                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6358         fi
6360         MONO_NATIVE_CC=$CC
6361         MONO_NATIVE_CXX=$CXX
6362         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6363         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6364         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6365         MONO_NATIVE_CFLAGS=$CFLAGS
6366         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6368         if test x$mono_native_compat = xyes; then
6369                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6370                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6371                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6372                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6373                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6374                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6376                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6377                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6378                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6379                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6380                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6381                 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"
6382         fi
6384         mono_native=yes
6385         MONO_NATIVE_PLATFORM=ios
6386 elif test x$host_linux = xyes; then
6387         mono_native_text="Linux"
6388         MONO_NATIVE_CC=$CC
6389         MONO_NATIVE_CXX=$CXX
6390         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6391         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6392         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6393         MONO_NATIVE_CFLAGS=$CFLAGS
6394         MONO_NATIVE_LDFLAGS=$LDFLAGS
6396         mono_native=yes
6397         mono_native_compat=no
6398         MONO_NATIVE_PLATFORM=linux
6400         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6401 elif test x$target_wasm = xyes; then
6402         mono_native_text="wasm"
6403         MONO_NATIVE_CC=$CC
6404         MONO_NATIVE_CXX=$CXX
6405         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6406         # The system.native code uses _WASM_ to check for wasm
6407         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6408         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6409         MONO_NATIVE_CFLAGS=$CFLAGS
6410         MONO_NATIVE_LDFLAGS=$LDFLAGS
6412         mono_native=yes
6413         mono_native_compat=no
6414         MONO_NATIVE_PLATFORM=linux
6416         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6417 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6418         mono_native_text="AIX"
6419         MONO_NATIVE_CC=$CC
6420         MONO_NATIVE_CXX=$CXX
6421         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6422         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6423         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6424         MONO_NATIVE_CFLAGS=$CFLAGS
6425         dnl nosymbolic- is a hack in case -G for linking is used, as -G seems
6426         dnl to change the way unresolved symbols work on library load in an
6427         dnl incompatible manner. (as references to runtime functions are
6428         dnl resolved later) Default params otherwise are that, so seems OK.
6429         dnl Likewise, we don't seem to need to cover the entire runtime with
6430         dnl it either, on both AIX and PASE. -brtl from -G does seem to spew
6431         dnl Big Scary TOC Warnings (tm) from the linker, but it doesn't seem
6432         dnl problematic with gcc's -mminimal-toc.
6433         dnl ----
6434         dnl flock in AIX exists in libbsd (not the same as freedesktop.org
6435         dnl libbsd) which Mono.Native needs.
6436         dnl Because of the way that the library is built by default, unresolved
6437         dnl references are kept and resolved at runtime. Often, the dependency
6438         dnl chain means libbsd is loaded anyways, but not necessarily. It's
6439         dnl better to explicitly link it, even though it has it shadows libc's
6440         dnl ioctl with its own. (As for the other unresolved imports, those
6441         dnl should be provided by the Mono runtime loaded.)
6442         MONO_NATIVE_LDFLAGS="$LDFLAGS -lbsd -Wl,-bnosymbolic-"
6444         mono_native=yes
6445         mono_native_compat=no
6446         MONO_NATIVE_PLATFORM=aix
6448         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6449 elif case $host_os in freebsd*) true;; *) false;; esac; then
6450         mono_native_text="FreeBSD"
6451         MONO_NATIVE_CC=$CC
6452         MONO_NATIVE_CXX=$CXX
6453         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6454         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6455         MONO_NATIVE_CFLAGS=$CFLAGS
6456         MONO_NATIVE_LDFLAGS=$LDFLAGS
6458         mono_native=yes
6459         mono_native_compat=no
6460         MONO_NATIVE_PLATFORM=freebsd
6461         AC_MSG_CHECKING([Mono.Native support])
6462         AC_MSG_RESULT(freebsd)
6464         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_FREEBSD"
6465 elif test x$platform_android = xyes; then
6466         mono_native_text="Android"
6467         MONO_NATIVE_CC=$CC
6468         MONO_NATIVE_CXX=$CXX
6469         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6470         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6471         MONO_NATIVE_CFLAGS=$CFLAGS
6472         MONO_NATIVE_LDFLAGS=$LDFLAGS
6473         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6475         mono_native=yes
6476         mono_native_compat=no
6477         MONO_NATIVE_PLATFORM=android
6479         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6480 else
6481         mono_native=no
6482         mono_native_text="no"
6485 AC_MSG_RESULT($mono_native_text)
6487 if test x$mono_native_compat = xyes; then
6488         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6489 else
6490         MONO_NATIVE_LIBRARY_NAME=libmono-native
6493 AC_SUBST(MONO_NATIVE_PLATFORM)
6494 AC_SUBST(MONO_NATIVE_CC)
6495 AC_SUBST(MONO_NATIVE_CXX)
6496 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6497 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6498 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6499 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6500 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6501 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6502 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6503 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6504 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6505 AC_SUBST(MONO_NATIVE_CFLAGS)
6506 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6507 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6508 AC_SUBST(MONO_NATIVE_LDFLAGS)
6509 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6510 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6511 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6512 AC_SUBST(MONO_NATIVE_LIBADD)
6514 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6515 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6516 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6517 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6518 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6519 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6520 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6521 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_FREEBSD, test x$MONO_NATIVE_PLATFORM = xfreebsd)
6523 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6524 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6525 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6526 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6527 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6529 ### C++ Linker selection
6531 # We have to lie to autotools, sometimes.
6533 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6534 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6535 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6536 # except if we're linking with LLVM which relies on it.
6538 # Explanation of the hack:
6540 # According to
6541 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6542 # automake chooses the linker that it used to compile a target based on the
6543 # _SOURCES for that target.  If the target is comprised of only C code, it
6544 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6545 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6546 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6548 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6549 # or libc++) linked in - even when Mono is written in C++, we take care not to
6550 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6551 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6552 # C++ linker - LLVM doesn't have the same restrictions.
6554 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6555 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6556 #  automake's autodetection and lets us use the linker that we want.
6558 if test "x$enable_llvm_runtime" = "xyes"; then
6559         AC_SUBST(MONO_CXXLD, [$CXX])
6560 else
6561         AC_SUBST(MONO_CXXLD, [$CC])
6564 ### Set -Werror options
6566 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6568 if test x"$GCC" = xyes; then
6570         if test "x$with_jemalloc" != "xyes"; then
6572                 # incompatible-pointer-types requires gcc circa 5.x
6574                 ORIG_CFLAGS=$CFLAGS
6575                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6576                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6577                 AC_TRY_COMPILE([],[
6578                 ], [
6579                         AC_MSG_RESULT(yes)
6580                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6581                 ], [
6582                         AC_MSG_RESULT(no)
6583                         CFLAGS=$ORIG_CFLAGS
6584                 ])
6586                 CFLAGS="$CFLAGS -Werror=return-type"
6587         fi
6589         # Implicit function declarations are not 64 bit safe
6590         # Do this late, since this causes lots of configure tests to fail
6591         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6592         # jay has a lot of implicit declarations
6593         JAY_CFLAGS="-Wno-implicit-function-declaration"
6596 AC_SUBST(CFLAGS)
6597 AC_SUBST(CPPFLAGS)
6598 AC_SUBST(LDFLAGS)
6600 # Update all submodules recursively to ensure everything is checked out
6601 if test "x$with_core" != "xonly"; then
6602         (cd $srcdir && scripts/update_submodules.sh)
6605 AC_OUTPUT([
6606 Makefile
6607 mono-uninstalled.pc
6608 acceptance-tests/Makefile
6609 llvm/Makefile
6610 scripts/mono-find-provides
6611 scripts/mono-find-requires
6612 mk/Makefile
6613 mono/Makefile
6614 mono/btls/Makefile
6615 mono/native/Makefile
6616 mono/utils/Makefile
6617 mono/utils/jemalloc/Makefile
6618 mono/metadata/Makefile
6619 mono/dis/Makefile
6620 mono/cil/Makefile
6621 mono/arch/Makefile
6622 mono/arch/x86/Makefile
6623 mono/arch/amd64/Makefile
6624 mono/arch/ppc/Makefile
6625 mono/arch/sparc/Makefile
6626 mono/arch/s390x/Makefile
6627 mono/arch/arm/Makefile
6628 mono/arch/arm64/Makefile
6629 mono/arch/mips/Makefile
6630 mono/arch/riscv/Makefile
6631 mono/sgen/Makefile
6632 mono/native/platform-type.c
6633 mono/native/platform-type-compat.c
6634 mono/native/platform-type-unified.c
6635 mono/tests/Makefile
6636 mono/tests/assembly-load-reference/Makefile
6637 mono/tests/tests-config
6638 mono/tests/gc-descriptors/Makefile
6639 mono/tests/testing_gac/Makefile
6640 mono/tests/fullaot-mixed/Makefile
6641 mono/tests/llvmonly-mixed/Makefile
6642 mono/unit-tests/Makefile
6643 mono/benchmark/Makefile
6644 mono/mini/Makefile
6645 mono/profiler/Makefile
6646 mono/eglib/Makefile
6647 mono/eglib/eglib-config.h
6648 mono/eglib/test/Makefile
6649 m4/Makefile
6650 ikvm-native/Makefile
6651 scripts/Makefile
6652 man/Makefile
6653 docs/Makefile
6654 data/Makefile
6655 data/net_2_0/Makefile
6656 data/net_4_0/Makefile
6657 data/net_4_5/Makefile
6658 data/net_2_0/Browsers/Makefile
6659 data/net_4_0/Browsers/Makefile
6660 data/net_4_5/Browsers/Makefile
6661 data/mint.pc
6662 data/mono-2.pc
6663 data/monosgen-2.pc
6664 data/mono.pc
6665 data/mono-cairo.pc
6666 data/mono-options.pc
6667 data/mono-lineeditor.pc
6668 data/monodoc.pc
6669 data/dotnet.pc
6670 data/dotnet35.pc
6671 data/wcf.pc
6672 data/cecil.pc
6673 data/system.web.extensions_1.0.pc
6674 data/system.web.extensions.design_1.0.pc
6675 data/system.web.mvc.pc
6676 data/system.web.mvc2.pc
6677 data/system.web.mvc3.pc
6678 data/aspnetwebstack.pc
6679 data/reactive.pc
6680 samples/Makefile
6681 support/Makefile
6682 data/config
6683 tools/Makefile
6684 tools/locale-builder/Makefile
6685 tools/sgen/Makefile
6686 tools/pedump/Makefile
6687 runtime/Makefile
6688 msvc/Makefile
6689 po/Makefile
6692 if test x$host_win32 = xyes; then
6693    # Get rid of 'cyg' prefixes in library names
6694    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6695    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6696    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6697    # executable doesn't work...
6698    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6701 if test x$host_darwin = xyes; then
6702    # This doesn't seem to be required and it slows down parallel builds
6703    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6706 AC_MSG_CHECKING([compiler server])
6707 AC_ARG_WITH(compiler-server, [  --with-compiler-server=yes,no,default      Enables or disables compiler server],[
6708    if test x$withval = xyes; then
6709        enable_compiler_server=yes;
6710    elif test x$withval = xno; then
6711        enable_compiler_server=no;
6712    elif test x$withval = xdefault; then
6713        enable_compiler_server=yes;
6714    else
6715        AC_MSG_ERROR([You must supply one of "yes", "no" or "default" to the --with-compiler-server option])
6716    fi
6717 ],[enable_compiler_server=yes])
6719 if test x$enable_compiler_server = xyes; then
6720    if test x$csc_compiler = xmcs; then
6721        AC_MSG_WARN([mcs does not support the compiler server])
6722        enable_compiler_server=no;
6723    fi
6727   case $prefix in
6728   NONE) prefix=$ac_default_prefix ;;
6729   esac
6730   case $exec_prefix in
6731   NONE) exec_prefix='${prefix}' ;;
6732   esac
6734   #
6735   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6736   # any existing config.make.  This allows people to share the same source tree
6737   # with different build directories, one native and one cross
6738   #
6739   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6741     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6743     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6744     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6745     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6746     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6747     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6748     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6749     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6750     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6751     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6752     echo "VERSION = $VERSION" >> $mcs_topdir/build/config.make
6754     case $INSTALL in
6755     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6756     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6757     esac
6759     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6761     export VERSION
6762     [myver=$($AWK 'BEGIN {
6763       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6764       if(length(vsplit [1]) > 4) {
6765         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6766       }
6767       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6768     }')]
6770     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6771     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6773     if test x$host_darwin = xyes; then
6774       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6775       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6776       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6777     elif test x$host_win32 = xyes; then
6778       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6779       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6780       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6781     elif test x$host_linux = xyes; then
6782       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6783       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6784       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6785     else
6786       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6787       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6788       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6789     fi
6791     echo "PLATFORM_AOT_PREFIX = $PLATFORM_AOT_PREFIX" >> $mcs_topdir/build/config.make
6792     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6793       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6794     fi
6796         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6797            enable_system_aot=yes
6798         fi
6800     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6801       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6802     fi
6804     if test x$DISABLE_MCS_DOCS = xyes; then
6805       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6806     fi
6808     if test x$has_extension_module != xno; then
6809         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6810     fi
6811     
6812     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6813     
6814     if test "x$test_bcl_opt" = "xyes"; then    
6815       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6816     fi
6818     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6819     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6820     echo "VBCS_LOCATION?=$VBCS_LOCATION" >> $srcdir/$mcsdir/build/config.make
6822     if test $csc_compiler = mcs; then
6823       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6824     fi
6826     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6827       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6828       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6830       if test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" = "xno"; then
6831         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS,$MONO_LLVM_PATH_OPTION" >> $srcdir/$mcsdir/build/config.make
6832       else
6833         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6834       fi
6835     fi
6837     if test "x$AOT_MODE" != "x" ; then
6838       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6839     fi
6841     if test "x$enable_btls" = "xyes"; then
6842       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6843     fi
6845     if test "x$mono_native" = "xyes"; then
6846       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6847     else
6848       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6849     fi
6851     if test x$mono_native_compat = xyes; then
6852       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6853     else
6854       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6855     fi
6857     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6858     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6859     if test x$enable_compiler_server = xyes; then
6860       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6861     else
6862       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6863     fi
6864     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6866   fi
6870 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6872 btls_platform_string=
6873 if test x$enable_btls = xyes; then
6874         if test x$btls_android = xyes; then
6875                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6876         else
6877                 btls_platform_string=" ($BTLS_PLATFORM)"
6878         fi
6881 thread_suspend_msg=
6882 if test x$buildsgen = xyes; then
6883         if test x$enable_cooperative_suspend != xno; then
6884                 thread_suspend_msg="Suspend:       Cooperative"
6885         elif test x$enable_hybrid_suspend != xno; then
6886                 thread_suspend_msg="Suspend:       Hybrid"
6887         else
6888                 thread_suspend_msg="Suspend:       Preemptive"
6889         fi
6892 if test "x$with_core" == "xonly"; then
6893   echo "RID = $RID" >> netcore/config.make
6894   echo "COREARCH = $COREARCH" >> netcore/config.make
6895   echo "CORETARGETS = $CORETARGETS" >> netcore/config.make
6896   echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> netcore/config.make
6898   if test x$host_darwin = xyes; then
6899     echo "HOST_PLATFORM ?= macos" >> netcore/config.make
6900   elif test x$host_win32 = xyes; then
6901     echo "HOST_PLATFORM ?= win32" >> netcore/config.make
6902   elif test x$host_linux = xyes; then
6903     echo "HOST_PLATFORM ?= linux" >> netcore/config.make
6904   else
6905     echo "HOST_PLATFORM ?= unix" >> netcore/config.make
6906   fi
6909         
6910 echo "
6911         mcs source:    $mcsdir
6912         C# Compiler:   $csc_compiler
6913         CompilerServer:$enable_compiler_server
6915    Engine:
6916         Host:          $host
6917         Target:        $target
6918         GC:            $gc_msg 
6919         $thread_suspend_msg
6920         TLS:           $with_tls
6921         SIGALTSTACK:   $with_sigaltstack
6922         Engine:        $jit_status
6923         BigArrays:     $enable_big_arrays
6924         DTrace:        $enable_dtrace
6925         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6926         Spectre:       $spectre_mitigation_status
6927         Mono.Native:   $mono_native_text
6929    Libraries:
6930         .NET 4.x:        $with_profile4_x
6931         Xamarin.Android: $with_monodroid
6932         Xamarin.iOS:     $with_monotouch
6933         Xamarin.WatchOS: $with_monotouch_watch
6934         Xamarin.TVOS:    $with_monotouch_tv
6935         Xamarin.Mac:     $with_xammac
6936         Windows AOT:     $with_winaot
6937         Orbis:           $with_orbis
6938         Unreal:          $with_unreal
6939         WebAssembly:     $with_wasm
6940         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid), AOT Full Interp ($with_testing_aot_full_interp), Windows Full AOT Interp ($with_testing_winaot_interp)
6941         JNI support:     $jdk_headers_found
6942         libgdiplus:      $libgdiplus_msg
6943         zlib:            $zlib_msg
6944         BTLS:            $enable_btls$btls_platform_string
6945         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6946         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6947         .NET Core:       $with_core
6948         $disabled
6950 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6951    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)