[2019-12] [merp] Capture Environment.FailFast message in crash report (#18921)
[mono-project.git] / configure.ac
blob7064166d65350b2c4251e96db32c6f89fb8c5188
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.10.0],
8         [https://github.com/mono/mono/issues/new])
10 AC_CONFIG_SRCDIR([Makefile.am])
11 AC_CONFIG_MACRO_DIR([m4])
13 AC_CANONICAL_SYSTEM
14 AC_CANONICAL_HOST
16 # Gross hack to enable 'make dist' on automake 1.9+tar 1.14.
17 # The extra brackets are to foil regex-based scans.
18 m4_ifdef([_A][M_PROG_TAR],[_A][M_SET_OPTION([tar-ustar])])
20 AM_INIT_AUTOMAKE([1.9 dist-xz tar-ustar no-dist-gzip foreign subdir-objects]
21                  m4_esyscmd([case `automake --version | head -n 1` in    # parallel-tests is default in automake 1.13+, we need to explicitly enable it
22                              *1.11*|*1.12*) echo parallel-tests;;        # for 1.11 and 1.12 but not below as those versions don't recognize the flag
23                              esac]))                                     # TODO: remove this hack once we require automake 1.11+
25 AC_CONFIG_HEADERS([config.h])
26 AM_MAINTAINER_MODE
27 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test]))
28 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test-bundle]))
30 API_VER=2.0
31 AC_SUBST(API_VER)
33 AC_PROG_LN_S
35 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
37 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
38 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
39 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
42 # This is the version of the corlib-runtime interface. When
43 # making changes to this interface (by changing the layout
44 # of classes the runtime knows about, changing icall signature or
45 # semantics etc), change this variable.
47 # This must be unique relative to corlib interface and semantics.
49 # If you change corlib such that a runtime change is required, or
50 # vice versa, change this string. Examples include removing icalls,
51 # adding icalls, changing icall signatures, and changing type layouts
52 # that both sides know.
54 # It is an arbitrary string and should be parsed as such.
55 # A guid works and is encouraged.
57 # Generate it with uuidgen. For example:
58 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
60 # There is no ordering of corlib versions, no old or new,
61 # an exact match is required between corlib and runtime.
63 # This line is parsed by tools besides autoconf, such as msvc/mono.winconfig.targets.
64 # It should remain in the format they expect.
66 MONO_CORLIB_VERSION=97b07b51-46d8-4084-b48e-77aa5c192654
69 # Put a quoted #define in config.h.
70 # Substitute @MONO_CORLIB_VERSION@ unquoted.
72 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,"$MONO_CORLIB_VERSION",[Version of the corlib-runtime interface])
73 AC_SUBST(MONO_CORLIB_VERSION)
75 case $host_os in
76 *cygwin* )
77                  echo "Run configure using ./configure --host=i686-w64-mingw32 or --host=x86_64-w64-mingw32"
78                  exit 1
79 esac
81 # In case of cygwin, override LN_S, irrespective of what it determines.
82 # The build uses cygwin, but the actual runtime doesn't.
83 case $host_os in
84 *cygwin* ) LN_S='cp -p';;
85 esac
88 # libgc defaults
90 libgc_configure_args=
92 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
93 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
94 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
95 CFLAGS_FOR_LIBGC=$CFLAGS
96 CPPFLAGS_FOR_BTLS=$CPPFLAGS
97 CFLAGS_FOR_BTLS=$CFLAGS
99 # libgc uses some deprecated APIs
100 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
103 # These are the flags that need to be stored in the mono.pc file for 
104 # compiling code that will embed Mono
106 libmono_cflags=""
107 libmono_ldflags=""
108 AC_SUBST(libmono_cflags)
109 AC_SUBST(libmono_ldflags)
111 # Variable to have relocatable .pc files (lib, or lib64)
112 # realpath isn't always available, and requires that all but the tip of the provided
113 # path exists. Fall back to the old behaviour, but realpath allows depth >1
114 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
115 # too deep for the old method to work
116 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
117 AC_SUBST(reloc_libdir)
119 # Set to yes if Unix sockets cannot be created in an anonymous namespace
120 need_link_unlink=no
122 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
123 extra_runtime_ldflags=""
125 # Thread configuration inspired by sleepycat's db
126 AC_MSG_CHECKING([host platform characteristics])
128 libgc_threads=no
129 has_dtrace=no
130 parallel_mark=yes
131 ikvm_native=yes
133 host_win32=no
134 target_win32=no
135 target_wasm=no
136 platform_android=no
137 platform_tizen=no
138 platform_ios=no
139 host_darwin=no
140 host_linux=no
141 build_darwin=no
143 case "$host" in
144         wasm32*)
145                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
146                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
147                 libgc_threads=pthreads
148                 platform_wasm=yes
149                 # FIXME:
150                 RID="osx-x64"
151                 COREARCH="wasm32"
152                 CORETARGETS="-p:TargetsUnix=true -p:TargetsOSX=true"
153                 build_darwin=yes
154                 ;;
155         *-mingw*|*-*-cygwin*)
156                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
157                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
158                 host_win32=yes
159                 mono_cv_clang=no
160                 if test "x$cross_compiling" = "xno"; then
161                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
162                                 target_win32=yes
163                         fi
164                 else
165                         if test "x$host" = "x$target"; then
166                                 target_win32=yes
167                         fi
168                 fi
169                 HOST_CC="gcc"
170                 RID="win-x86"
171                 CORETARGETS="-p:TargetsWindows=true"
172                 COREARCH="x86"
173                 # Boehm not supported on 64-bit Windows.
174                 case "$host" in
175                 x86_64-*-* | amd64-*-*)
176                         with_gc=sgen
177                         RID="win-x64"
178                         COREARCH="x64"
179                         ;;
180                 esac
182                 # Windows 7 or later is required
183                 WIN32_CPPFLAGS="-DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
184                 CPPFLAGS="$CPPFLAGS $WIN32_CPPFLAGS"
185                 WIN32_LDFLAGS="-lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi -static-libgcc"
186                 LDFLAGS="$LDFLAGS $WIN32_LDFLAGS"
187                 libmono_cflags="-mms-bitfields -mwindows"
188                 libmono_ldflags="-mms-bitfields -mwindows"
189                 libgc_threads=win32
190                 with_sigaltstack=no
191                 with_tls=pthread
192                 with_sgen_default_concurrent=yes
193                 LN_S=cp
194                 ;;
195         *-*-*netbsd*)
196                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
197                 libmono_cflags="-D_REENTRANT"
198                 LDFLAGS="$LDFLAGS -pthread"
199                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
200                 libmono_ldflags="-pthread"
201                 need_link_unlink=yes
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                 libgc_threads=pthreads
212                 need_link_unlink=yes
213                 with_sigaltstack=no
214                 use_sigposix=yes
215                 with_sgen_default_concurrent=yes
216                 ;;
217         *-*-*freebsd*)
218                 dnl For close_my_fds
219                 LDFLAGS="$LDFLAGS -lutil"
220                 if test "x$PTHREAD_CFLAGS" = "x"; then
221                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
222                         libmono_cflags=
223                 else
224                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
225                         libmono_cflags="$PTHREAD_CFLAGS"
226                 fi
227                 if test "x$PTHREAD_LIBS" = "x"; then
228                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
229                         libmono_ldflags="-pthread"
230                 else
231                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
232                         libmono_ldflags="$PTHREAD_LIBS"
233                 fi
234                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
235                 need_link_unlink=yes
236                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
237                 libgc_threads=pthreads
238                 use_sigposix=yes
239                 has_dtrace=yes
240                 case "$host" in
241                 aarch64-*)
242                         support_boehm=no
243                         with_gc=sgen
244                         ;;
245                 riscv*)
246                         support_boehm=no
247                         with_gc=sgen
248                         ;;
249                 esac
250                 with_sgen_default_concurrent=yes
251                 ;;
252         *-*-*openbsd*)
253                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
254                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
255                 if test "x$disable_munmap" != "xyes"; then
256                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
257                 fi
258                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
259                 LDFLAGS="$LDFLAGS -pthread"
260                 need_link_unlink=yes
261                 AC_DEFINE(PTHREAD_POINTER_ID)
262                 libgc_threads=pthreads
263                 with_tls=pthread
264                 with_sigaltstack=no
265                 use_sigposix=yes
266                 with_sgen_default_concurrent=yes
267                 ;;
268         *-*-linux-android*)
269                 platform_android=yes
270                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
271                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
273                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
274                 if test "x$disable_munmap" != "xyes"; then
275                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
276                 fi
277                 libmono_cflags="-D_REENTRANT"
278                 libgc_threads=pthreads
279                 use_sigposix=yes
281                 with_tls=pthread
282                 with_sigaltstack=no
283                 with_static_mono=no
285                 # Android doesn't support boehm, as it's missing <link.h>
286                 support_boehm=no
287                 with_gc=sgen
289                 # isinf(3) requires -lm
290                 LDFLAGS="$LDFLAGS -lm"
292                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
293                 # PAGE_SIZE; breaks mono/io-layer/collection.c
294                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
295                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
296                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
298                 # FIXME? Only if __ANDROID_API__ < 24?
299                 # FILE32API means "long", which is stuck at 32bits for 32bit ABI (64bits for 64bit ABI).
300                 # ABI 24 introduces the "o" for "file offset" variations, which can be widened to 64bits for 32bit ABI (and still 64bits for 64bit).
301                 # Android itself uses FILE32API, and mono should use system zlib on Android anyway.
302                 ZLIB_CFLAGS="$ZLIB_CFLAGS -DUSE_FILE32API"
304                 # to bypass the underscore linker check, can't work when cross-compiling
305                 mono_cv_uscore=yes
306                 mono_cv_clang=no
307                 ;;
308         *-*-linux*)
309                 host_linux=yes
310                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
311                 if test "x$disable_munmap" != "xyes"; then
312                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
313                 fi
314                 libmono_cflags="-D_REENTRANT"
315                 libgc_threads=pthreads
316                 CORETARGETS="-p:TargetsUnix=true"
317                 use_sigposix=yes
318                 if test "x$cross_compiling" != "xno"; then
319                         # to bypass the underscore linker check, not
320                         # available during cross-compilation
321                         mono_cv_uscore=no
322                 fi
323                 case "$host" in
324                 *-tizen-linux-*)
325                         platform_tizen=yes
326                         ;;
327                 esac
328                 case "$host" in
329                 ppc64-*)
330                         RID="linux-ppc64"
331                         ;;
332                 ppc64le-*)
333                         RID="linux-ppc64el"
334                         ;;
335                 mipsel-*)
336                         RID="linux-mipsel"
337                         ;;
338                 x86-*)
339                         RID="linux-x86"
340                         COREARCH="x86"
341                         ;;
342                 x86_64-*)
343                         RID="linux-x64"
344                         COREARCH="x64"
345                         ;;
346                 arm-*)
347                         # deal with this in the FPU detection section, since
348                         # we cannot determine FPU from triplet and don't want
349                         # to duplicate the logic
350                         ;;
351                 aarch64-*)
352                         support_boehm=no
353                         with_gc=sgen
354                         RID="linux-arm64"
355                         COREARCH="arm64"
356                         ;;
357                 powerpc*-*-linux*)
358                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
359                         disable_munmap=yes
360                         ;;
361                 riscv*)
362                         support_boehm=no
363                         with_gc=sgen
364                         ;;
365                 esac
366                 with_sgen_default_concurrent=yes
367                 ;;
368         *-*-nacl*)
369                 echo "nacl no longer supported."
370                 exit 1
371                 ;;
372         *-*-hpux*)
373                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
374                 # +ESdbgasm only valid on bundled cc on RISC
375                 # silently ignored for ia64
376                 if test $GCC != "yes"; then
377                         CFLAGS="$CFLAGS +ESdbgasm"
378                         # Arrange for run-time dereferencing of null
379                         # pointers to produce a SIGSEGV signal.
380                         LDFLAGS="$LDFLAGS -z"
381                 fi
382                 CFLAGS="$CFLAGS +ESdbgasm"
383                 LDFLAGS="$LDFLAGS -z"
384                 libmono_cflags="-D_REENTRANT"
385                 libmono_ldflags="-lpthread"
386                 libgc_threads=pthreads
387                 need_link_unlink=yes
388                 use_sigposix=yes
389                 ;;
390         *-*-solaris*)
391                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
392                 need_link_unlink=yes
393                 libmono_cflags="-D_REENTRANT"
394                 libgc_threads=pthreads
395                 has_dtrace=yes
396                 use_sigposix=yes
397                 enable_solaris_tar_check=yes
398                 ;;
399         *-*-darwin*)
400                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
401                 host_darwin=yes
402                 target_mach=yes
403                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
404                 libmono_cflags="-D_THREAD_SAFE"
405                 need_link_unlink=yes
406                 AC_DEFINE(PTHREAD_POINTER_ID)
407                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
408                 CORETARGETS="-p:TargetsUnix=true -p:TargetsOSX=true"
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                 LIBS="$LIBS -lnetwork -ltextencoding"
451                 need_link_unlink=yes
452                 AC_DEFINE(PTHREAD_POINTER_ID)
453                 dnl Haiku does not support static TLS with __thread
454                 with_tls=pthread
455                 libgc_threads=pthreads
456                 use_sigposix=yes
457                 with_sigaltstack=no
458                 ;;
459         *-*-fuchsia*)
460                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
461                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
462                 fuchsia=true
463                 with_tls=pthread
464                 with_sigaltstack=yes
465                 with_static_mono=no
466                 support_boehm=no
467                 with_gc=sgen
468                 mono_cv_uscore=yes
469                 mono_cv_clang=no
470                 ;;
471         *-*-aix*|*-*-os400*)
472                 AC_DEFINE(HOST_AIX,1,[Targeting the AIX and PASE platforms])
473                 host_aix=yes
474                 dnl IMPORTANT: For svr4 sonames on AIX, you should set
475                 dnl `OBJECT_MODE=64` when configuring.
476                 dnl libtool cannot generate functioning svr4 sonames on
477                 dnl 64-bit without it.
478                 dnl Unfortunately, everything is complicated by the fact that
479                 dnl gcc doesn't respect this variable. (otherwise we could set
480                 dnl it for build time for configure and make)
481                 dnl On IBM i PASE using IBM's packages, GCC *does* respect this
482                 dnl variable, and builds are 64-bit by default. svr4 sonames
483                 dnl must still be specified when configuring on i, however.
484                 dnl As such, because Mono doesn't support 32-bit AIX or PASE,
485                 dnl set up a 64-bit build (assming GCC; XLC not supported)
486                 dnl regardless of what variable is used.
487                 case $host_os in
488                         aix*)
489                         if test "x$OBJECT_MODE" = "x64" && test "x$CC" = "x" && test "x$CXX" = "x"; then
490                                 dnl HACK: Set -maix64 at the GCC invocation
491                                 dnl level explicitly to work around the fact
492                                 dnl GCC in default maix32 mode explodes when
493                                 dnl binutils respects OBJECT_MODE.
494                                 dnl When that check occurs, flags are not
495                                 dnl passed to to the compiler, so GCC has no
496                                 dnl chance to change its mode.
497                                 dnl Otherwise, it may enter a state where it
498                                 dnl runs, but uses the libtool "compile"
499                                 dnl wrapper, which subtly breaks other things.
500                                 dnl This should propagate to all uses of CC.
501                                 dnl This is only set if not manually set.
502                                 CC="gcc -maix64"
503                                 CXX="g++ -maix64"
504                                 echo
505                         fi
506                         ;;
507                         dnl Not needed on i because it defaults to 64-bit and
508                         dnl has a GCC smart enough to respect OBJECT_MODE.
509                 esac
510                 dnl We still set this for *FLAGS, however, because we may not
511                 dnl be setting OBJECT_MODE.
512                 LDFLAGS="$LDFLAGS -maix64"
513                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -pthread -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
514                 libmono_cflags="-pthread -D_THREAD_SAFE -D_REENTRANT"
515                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
516                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
517                 dnl specifiy 64-bit mode for tools. (OBJECT_MODE is finicky with cmake.)
518                 dnl XXX: We should stop the hardcoding madness
519                 AR="/usr/bin/ar -X64"
520                 NM="/usr/bin/nm -X64"
521                 STRIP="/usr/bin/strip -X64"
522                 RANLIB="/usr/bin/ranlib -X64"
523                 dnl SGen is the future (changes to Boehm support code would be
524                 dnl required if you wish to re-enable Boehm)
525                 support_boehm=no
526                 with_gc=sgen
527                 need_link_unlink=yes
528                 use_sigposix=yes
529                 dnl Similar limitation to macOS about the first thread and the
530                 dnl guard page, except sometimes the runtime hangs. Disable for
531                 dnl now until cause can be determined or it seems OK enough.
532                 with_sigaltstack=no
533                 dnl use pthread TLS, __thread has issues with the compiler flags we use
534                 with_tls=pthread
535                 dnl ppc Linux is the same? test further
536                 disable_munmap=yes
537                 RID="aix-ppc64"
538                 CORETARGETS="-p:TargetsUnix=true"
539                 ;;
540         *)
541                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
542                 ;;
543 esac
545 AC_MSG_RESULT(ok)
547 if test x$need_link_unlink = xyes; then
548    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
551 if test x$host_win32 = xyes; then
552    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
555 if test x$target_win32 = xyes; then
556    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
559 if test x$host_darwin = xyes; then
560    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
563 # Defined for all targets/platforms using classic Windows API support.
564 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
565 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
567 AC_SUBST(extra_runtime_ldflags)
568 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
569 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
570 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
571 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
572 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
573 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
574 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
575 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
576 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
577 AM_CONDITIONAL(HOST_AIX, test x$host_aix = xyes)
579 if test -z "$HOST_DARWIN_TRUE"; then :
580 PLATFORM_AOT_SUFFIX=.dylib
581 PLATFORM_AOT_PREFIX=lib
584 if test -z "$HOST_LINUX_TRUE"; then :
585 PLATFORM_AOT_SUFFIX=.so
586 PLATFORM_AOT_PREFIX=lib
589 if test -z "$HOST_WIN32_TRUE"; then :
590 PLATFORM_AOT_SUFFIX=.dll
591 PLATFORM_AOT_PREFIX=
594 AC_SUBST(PLATFORM_AOT_SUFFIX)
595 AC_SUBST(PLATFORM_AOT_PREFIX)
597 if test -z "$HOST_WASM_TRUE"; then :
598 AC_DEFINE(HAVE_UTIME)
599 AC_DEFINE(HAVE_UTIMES)
602 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
604 AC_CHECK_TOOL(CC, gcc, gcc)
605 AC_PROG_CC
606 AC_CHECK_TOOL(CXX, g++, g++)
607 AC_PROG_CXX
608 AM_PROG_AS
609 AC_PROG_INSTALL
610 AC_PROG_AWK
611 AM_PROG_CC_C_O
612 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
613 : ${CCAS='$(CC)'}
614 # Set ASFLAGS if not already set.
615 : ${CCASFLAGS='$(CFLAGS)'}
616 AC_SUBST(CCAS)
617 AC_SUBST(CCASFLAGS)
619 if test "x$CXX" = "xno"; then
620         AC_MSG_ERROR([No c++ compiler found. You need to install a c++ compiler])
623 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
624 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
625 if test "x$CXX" = "xg++"; then
626         if test "x$GXX" != "xyes"; then
627                 # automake/libtool is so broken, it requires g++ even if the c++ sources
628                 # are inside automake conditionals
629                 AC_MSG_ERROR([You need to install g++])
630         fi
633 dnl may require a specific autoconf version
634 dnl AC_PROG_CC_FOR_BUILD
635 dnl CC_FOR_BUILD not automatically detected
636 CC_FOR_BUILD=$CC
637 CFLAGS_FOR_BUILD=$CFLAGS
638 BUILD_EXEEXT=
639 if test "x$cross_compiling" = "xyes"; then
640         CC_FOR_BUILD=cc
641         CFLAGS_FOR_BUILD=
642         BUILD_EXEEXT=""
644 AC_SUBST(CC_FOR_BUILD)
645 AC_SUBST(CFLAGS_FOR_BUILD)
646 AC_SUBST(HOST_CC)
647 AC_SUBST(BUILD_EXEEXT)
649 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
650 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
652 # Set STDC_HEADERS
653 AC_HEADER_STDC
654 AC_LIBTOOL_WIN32_DLL
655 # This causes monodis to not link correctly
656 #AC_DISABLE_FAST_INSTALL
658 #lookup makedev() header
659 AC_HEADER_MAJOR
661 AM_PROG_LIBTOOL
662 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
663 DOLT
665 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
666 AC_SUBST(export_ldflags)
668 # Test whenever ld supports -version-script
669 AC_PROG_LD
670 AC_PROG_LD_GNU
672 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 gnu/lib-names.h)
673 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)
675 # zlib/configure checks for unistd.h existance and defines HAVE_UNISTD_H on the compiler
676 # command line (not config.h) if it is present.
677 AC_CHECK_HEADER(unistd.h,
678     [HAVE_UNISTD_H=1
679      ZLIB_CFLAGS="$ZLIB_CFLAGS -DHAVE_UNISTD_H"],
680     [HAVE_UNISTD_H=0])
682 AC_SUBST(HAVE_UNISTD_H)
684 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
685                   [], [], [#include <stddef.h>
686                   #include <sys/socket.h>
687                   #include <linux/socket.h>])
689 AC_CHECK_HEADERS(sys/user.h, [], [],
691 #ifdef HAVE_SYS_PARAM_H
692 # include <sys/param.h>
693 #endif
696 AC_CHECK_HEADERS(linux/serial.h)
698 case "$host" in
699         # Use bundled zlib on Windows to be sure it is static.
700         *-mingw*|*-cygwin*)
701                 have_sys_zlib=no
702                 zlib_msg="bundled zlib"
703                 ;;
704         # Use bundled zlib on RISC-V for now to make cross-compiling easier.
705         riscv*)
706                 have_sys_zlib=no
707                 zlib_msg="bundled zlib"
708                 ;;
709         *)
710                 AC_CHECK_HEADER(zlib.h, [have_sys_zlib=yes], [have_sys_zlib=no])
711                 if test x$have_sys_zlib = xyes; then
712                         AC_TRY_COMPILE([#include <zlib.h>], [
713                                 #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
714                                 #else
715                                 #error No good zlib found
716                                 #endif
717                         ],[
718                                 AC_MSG_RESULT(Using system zlib)
719                                 zlib_msg="system zlib"
720                                 have_sys_zlib=yes
721                         ],[
722                                 AC_MSG_RESULT(zlib too old, using embedded zlib)
723                                 have_sys_zlib=no
724                                 zlib_msg="bundled zlib"
725                         ])
726                 else
727                         AC_MSG_RESULT(zlib not found, using embedded zlib)
728                         have_sys_zlib=no
729                         zlib_msg="bundled zlib"
730                 fi
731                 ;;
732 esac
734 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=])
735 if test "x$STATIC_ZLIB_PATH" != "x"; then
736         have_static_zlib=yes
737         have_sys_zlib=no
738         zlib_msg="static zlib from $STATIC_ZLIB_PATH"
739         AC_SUBST(STATIC_ZLIB_PATH)
742 AM_CONDITIONAL(HAVE_STATIC_ZLIB, test x$have_static_zlib = xyes)
743 AM_CONDITIONAL(HAVE_SYS_ZLIB, test x$have_sys_zlib = xyes)
744 if test x$have_static_zlib = xyes; then
745         AC_DEFINE(HAVE_STATIC_ZLIB, 1, [Use static zlib])
747 if test x$have_sys_zlib = xyes; then
748         AC_DEFINE(HAVE_SYS_ZLIB, 1, [Use OS-provided zlib])
750 # for mono/metadata/debug-symfile.c
751 AC_CHECK_HEADERS(elf.h)
753 # for support
754 AC_CHECK_HEADERS(poll.h)
755 AC_CHECK_HEADERS(sys/poll.h)
756 AC_CHECK_HEADERS(sys/wait.h)
757 AC_CHECK_HEADERS(grp.h)
758 AC_CHECK_HEADERS(syslog.h)
759 AC_CHECK_FUNCS(vsyslog)
761 # for mono/dis
762 AC_CHECK_HEADERS(wchar.h)
764 # for Linux statfs support
765 AC_CHECK_HEADERS(linux/magic.h)
767 # For Android NDK unified headers
768 if test x$platform_android = xyes; then
769         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
770         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
771         AC_CHECK_HEADERS(android/ndk-version.h)
773         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
774         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
775         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
776         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
777         # doesn't contain the required definitions (NDK 14)
778         if test x$have_android_signal_inlines = xyes; then
779                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
780                 AC_COMPILE_IFELSE([
781                         AC_LANG_PROGRAM([#include <signal.h>
782                                 #include <android/legacy_signal_inlines.h>],[
783                                 int i;
784                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
785                                 }
786                         ])],[
787                                 AC_MSG_RESULT(yes)
788                                 android_sigrtminmax_work=yes
789                         ],[
790                                 AC_MSG_RESULT(no)
791                                 android_sigrtminmax_work=no
792                         ]
793                 )
795                 if test x$android_sigrtminmax_work = xno; then
796                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
797                 fi
798         fi
800         # Attempt to detect whether we're using Android NDK unified headers
801         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
802         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
804         android_unified_headers=no
805         if test x$have_android_api_level = xyes; then
806                 if test x$have_android_versioning = xyes; then
807                         AC_MSG_CHECKING([whether using Android NDK unified headers])
809                         # Both macros are defined only in the NDK unified headers
810                         AC_COMPILE_IFELSE([
811                                 AC_LANG_PROGRAM([
812                                         #include <android/api-level.h>
813                                         #include <android/versioning.h>
814                                 ],[
815                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
816                                         #else
817                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
818                                         #endif
819                                 ])],[
820                                         AC_MSG_RESULT(yes)
821                                         android_unified_headers=yes
822                                 ],[
823                                         AC_MSG_RESULT(no)
824                                         android_unified_headers=no
825                                 ]
826                         )
827                 fi
828         fi
830         if test x$android_unified_headers = xyes; then
831                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
832         fi
833 fi # Android
835 # not 64 bit clean in cross-compile
836 AC_CHECK_SIZEOF(void *)
837 AC_CHECK_SIZEOF(long)
839 AC_CHECK_SIZEOF(int)
840 AC_CHECK_SIZEOF(long long)
842 AC_CACHE_CHECK([for clang],
843         mono_cv_clang,[
844         AC_TRY_COMPILE([], [
845                 #ifdef __clang__
846                 #else
847                 #error "FAILED"
848                 #endif
849         ],
850         [mono_cv_clang=yes],
851         [mono_cv_clang=no],
852         [])
855 AC_ARG_ENABLE(visibility-hidden,
856 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
857    disable_visibility_hidden=yes, disable_visibility_hidden=no)
859 WARN=''
860 if test x"$GCC" = xyes; then
861                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
862                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
864                 # We require C99 with some GNU extensions, e.g. `linux` macro
865                 CFLAGS="$CFLAGS -std=gnu99"
867                 # The runtime code does not respect ANSI C strict aliasing rules
868                 CFLAGS="$CFLAGS -fno-strict-aliasing"
870                 # We rely on signed overflow to behave
871                 CFLAGS="$CFLAGS -fwrapv"
873                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
874                 if test x"$disable_visibility_hidden" = xno; then
875                    # Don't export any symbols by default
876                    SHARED_CFLAGS="-fvisibility=hidden"
877                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
878                 fi
880                 ORIG_CFLAGS=$CFLAGS
881                 # Check for the normal version, since gcc ignores unknown -Wno options
882                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
883                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
884                 AC_TRY_COMPILE([],[
885                 ], [
886                    AC_MSG_RESULT(yes)
887                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
888                 ], [
889                    AC_MSG_RESULT(no)
890                    CFLAGS=$ORIG_CFLAGS
891                 ])
893                 if test "x$mono_cv_clang" = "xyes"; then
894                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
895                    WARN="$WARN -Qunused-arguments"
896                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
897                    # We rely on zero length arrays in structs
898                    WARN="$WARN -Wno-zero-length-array"
899                 fi
900 else
901         # The Sun Forte compiler complains about inline functions that access static variables
902         # so disable all inlining.
903         case "$host" in
904         *-*-solaris*)
905                 CFLAGS="$CFLAGS -Dinline="
906                 ;;
907         esac
909 CFLAGS="$WARN $CFLAGS -g"
910 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
911 CPPFLAGS="$WARN $CPPFLAGS -g"
913 # Where's the 'mcs' source tree?
914 if test -d $srcdir/mcs; then
915   mcsdir=mcs
916 else
917   mcsdir=../mcs
920 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
921         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
922                 mcsdir=$with_mcs_path
923         fi
926 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
928 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
929 if test x$with_core = xonly; then
930     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
931     with_runtime_preset=netcore
933 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
936 # A sanity check to catch cases where the package was unpacked
937 # with an ancient tar program (Solaris)
939 AC_ARG_ENABLE(solaris-tar-check,
940 [  --disable-solaris-tar-check    disable solaris tar check],
941    do_solaris_tar_check=no, do_solaris_tar_check=yes)
943 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
944         AC_MSG_CHECKING(integrity of package)
945         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
946         then
947                 AC_MSG_RESULT(ok)
948         else
949                 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"
950                 AC_MSG_ERROR([$errorm])
951         fi
954 if test "x$with_mcs_path" != "x"; then
955 mcs_topdir=$(cd "$mcsdir" && pwd)
956 mcs_topdir_from_srcdir=$mcs_topdir
957 else
958 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
959 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
962 # Convert mcs_topdir* paths to Windows syntax.
963 if test x$cross_compiling$host_win32 = xnoyes; then
964   mcs_topdir=$(cygpath -m $mcs_topdir)
965   case $mcs_topdir_from_srcdir in
966     /cygdrive/*)
967         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
968         ;;
969   esac
972 AC_SUBST([mcs_topdir])
973 AC_SUBST([mcs_topdir_from_srcdir])
975 # gettext: prepare the translation directories. 
976 # we do not configure the full gettext, as we consume it dynamically from C#
977 AM_PO_SUBDIRS
979 if test "x$USE_NLS" = "xyes"; then
980    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
982    if test "x$HAVE_MSGFMT" = "xno"; then
983           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
984    fi
987 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
989 pkg_config_path=
990 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
991         if test x$with_crosspkgdir = "x"; then
992                 if test -s $PKG_CONFIG_PATH; then
993                         pkg_config_path=$PKG_CONFIG_PATH
994                 fi
995         else
996                 pkg_config_path=$with_crosspkgdir
997                 PKG_CONFIG_PATH=$pkg_config_path
998                 export PKG_CONFIG_PATH
999         fi
1002 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
1003 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
1004 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
1006 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
1007 if test x$werror_flag = xyes; then
1008         WERROR_CFLAGS="-Werror"
1010 AC_SUBST([WERROR_CFLAGS])
1011 AC_SUBST([SHARED_CFLAGS])
1013 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
1014   
1015 AC_SUBST(GLIB_CFLAGS)
1017 # Enable support for fast thread-local storage
1018 # Some systems have broken support, so we allow to disable it.
1019 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
1021 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
1022 # This does not work on some platforms (bug #55253)
1023 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
1025 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
1026 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
1027 # Same as --with-shared_mono=no
1028 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
1030 if test "x$enable_static" = "xno"; then
1031    with_static_mono=no
1034 if test "x$enable_shared" = "xno"; then
1035    with_shared_mono=no
1038 if test "x$enable_libraries" = "xno"; then
1039    with_shared_mono=no
1042 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
1044 if test "x$host_win32" = "xyes"; then
1045    # Boehm GC requires the runtime to be in its own dll
1046    with_static_mono=no
1049 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
1050 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
1051 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
1052 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
1054 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
1055 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
1056         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
1057         ORIG_CFLAGS=$CFLAGS
1058         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
1059         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
1060         AC_TRY_COMPILE([], [
1061         ], [
1062            AC_MSG_RESULT(yes)
1063            # Pass it to libgc as well
1064            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
1065         ], [
1066            AC_MSG_RESULT(no)
1067            CFLAGS=$ORIG_CFLAGS
1068         ])
1071 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
1073 if test x$enable_small_config = xyes; then
1074         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
1075         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
1078 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)
1080 DISABLED_FEATURES=none
1081 csc_compiler=default
1082 endian=unknown
1083 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
1084 AC_MSG_CHECKING([CSharp compiler to use])
1085 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
1086    if test x$withval = xmcs; then
1087        csc_compiler=mcs
1088    elif test x$withval = xroslyn; then
1089        csc_compiler=roslyn
1090    elif test x$withval = xdefault; then
1091        :
1092    else
1093        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
1094    fi
1095 ],[csc_compiler=default])
1097 if test $csc_compiler = default; then
1098    if test $endian = big; then
1099       csc_compiler=mcs
1100    elif test $endian = little; then
1101       case "$host" in
1102         powerpc*) csc_compiler=mcs ;;
1103         *) csc_compiler=roslyn ;;
1104       esac
1105    else
1106       csc_compiler=mcs
1107    fi
1109 AC_MSG_RESULT($csc_compiler)
1111 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
1112 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
1113 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])
1116 if test x$target_win32 = xyes; then
1117 with_jemalloc=no
1118 with_jemalloc_assert=no
1119 with_jemalloc_always=no
1122 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
1123 if test "x$with_jemalloc_assert" = "xyes"; then
1124 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
1125 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
1126 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
1129 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
1130 if test "x$with_jemalloc_always" = "xyes"; then
1131 with_jemalloc=yes
1132 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
1133 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
1134 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
1137 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
1138 if test "x$with_jemalloc" = "xyes"; then
1139 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
1140 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
1141 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
1143 if test "x$target_mach" = "xyes"; then
1144         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
1147 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
1148 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
1150 AC_SUBST(JEMALLOC_CFLAGS)
1151 AC_SUBST(JEMALLOC_CPPFLAGS)
1152 AC_SUBST(JEMALLOC_LDFLAGS)
1153 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
1156 # Terminology:
1157 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
1158 # MERP - The MS telemetry profile. Not for general use.
1159 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
1161 # 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.
1163 #--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.
1164 #--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.
1165 #--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.
1166 #--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.
1168 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])
1169 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])
1170 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1172 if test "x$with_crash_privacy" = "xyes"; then
1173 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1176 if test "x$with_structured_crashes" = "xno"; then
1177 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1180 case "$host" in
1181         *-mingw*|*-*-cygwin*)
1182                 crash_reporting=no
1183                 ;;
1184 esac
1186 if test "x$crash_reporting" != "xyes"; then
1187 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1188 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1191 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1192 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1194 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1195 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1197 if test x$enable_monodroid = xyes; then
1198         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1201 if test x$enable_monotouch = xyes; then
1202         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1205 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1207 # mono/corefx/native has a lot of invalid C++98 in its headers
1208 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1209 # use these C99 print macros in the command line, since glib may not win first inttypes include
1210 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1211 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1212 CXXFLAGS_COMMON="$CXXFLAGS_COMMON -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
1213 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1215 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1216 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1217 # and add it whenever we're running clang on Darwin.
1218 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1219         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1222 AC_SUBST(CXXFLAGS_COMMON)
1224 if test "x$enable_cxx" = "xyes"; then
1226         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1228         # -std=gnu99 -xc++ is not allowed and errors.
1229         CXX_REMOVE_CFLAGS=-std=gnu99
1230         # These give warnings and should be removed. They are C-only.
1231         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1232         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1233         # Likewise with CentOS 6 gcc 4.4.
1234         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1236         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1237         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1238         # generates a warning every time we run gcc which is very unsightly.
1239         # The warning is for e.g. sprintf(foo, "") which can just be
1240         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1241         # and completely legal and valid.
1242         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1243         # Alternatively, just run $CXX -xc++ -c /dev/null.
1244         AC_LANG_PUSH(C++)
1245         ORIG_CXXFLAGS=$CXXFLAGS
1246         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1247         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1248         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1249                                  [ AC_MSG_RESULT(no)
1250                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1251         CXXFLAGS=$ORIG_CXXFLAGS
1252         AC_LANG_POP(C++)
1254 AC_SUBST(CXX_ADD_CFLAGS)
1255 AC_SUBST(CXX_REMOVE_CFLAGS)
1258 # Set the build profiles and options before things which use them
1261 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])
1262 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1263 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1264 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])
1265 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])
1266 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1267 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1268 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])
1269 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])
1270 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])
1271 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1272 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])
1273 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1274 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1275 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1278 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])
1279 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])
1280 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])
1281 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])
1284 dnl Spectre compiler mitigation flag checks
1286 if test "x$with_spectre_mitigation" = "xyes"; then
1287    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1288    SPECTRE_CFLAGS=
1289    SPECTRE_INDIRECT_BRANCH_KIND=
1290    case "x$with_spectre_indirect_branch_choice" in
1291        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1292        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1293        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1294        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1295        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1296    esac
1298    SPECTRE_FUNCTION_RETURN_KIND=""
1299    case "x$with_spectre_function_return_choice" in
1300        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1301        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1302        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1303        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1304        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1305    esac
1307    AX_CHECK_COMPILE_FLAG(
1308         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1309         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1310    )
1312    AX_CHECK_COMPILE_FLAG(
1313         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1314         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1315    )
1317    if test "x$SPECTRE_CFLAGS" != "x" ; then
1318         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1319         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1320         spectre_mitigation_status="mitigation enabled"
1321    fi
1322 else
1323         spectre_mitigation_status="no mitigation"
1327 dnl Profile defaults
1329 TEST_PROFILE=default
1330 enable_llvm_default=no
1332 with_profile4_x_default=no
1333 with_monodroid_default=no
1334 with_monotouch_default=no
1335 with_monotouch_watch_default=no
1336 with_monotouch_tv_default=no
1337 with_xammac_default=no
1338 with_testing_aot_full_interp_default=no
1339 with_testing_aot_hybrid_default=no
1340 with_testing_aot_full_default=no
1341 with_winaot_default=no
1342 with_testing_winaot_interp_default=no
1343 with_orbis_default=no
1344 with_unreal_default=no
1345 with_wasm_default=no
1347 with_bitcode_default=no
1348 enable_cooperative_suspend_default=no
1349 enable_hybrid_suspend_default=no
1351 # For the sake of clearer error messages, these numbers should all be different from each other.
1352 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4400,nftnptr-arg-trampolines=4000,nrgctx-trampolines=21000
1354 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1356 MONO_LLVM_PATH_OPTION=llvm-path="`pwd`/llvm/usr/bin"
1358 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1359    DISABLE_MCS_DOCS_default=yes
1360 elif test x$with_runtime_preset = xnetcore; then
1361    # Keep in sync with winconfig.h netcore configuration.
1362    DISABLE_MCS_DOCS_default=yes
1363    BTLS_SUPPORTED=no
1364    enable_mcs_build=no
1365    enable_support_build=no
1367    mono_feature_disable_remoting='yes'
1368    mono_feature_disable_reflection_emit_save='yes'
1369    mono_feature_disable_appdomains='yes'
1370    mono_feature_disable_cleanup='yes'
1371    mono_feature_disable_assembly_remapping='yes'
1372    mono_feature_disable_security='yes'
1373    mono_feature_disable_mdb='yes'
1374    mono_feature_disable_com='yes'
1375    mono_feature_disable_gac='yes'
1376    mono_feature_disable_perfcounters='yes'
1377    mono_feature_disable_attach='yes'
1378    mono_feature_disable_dllmap='yes'
1379    disable_mono_native=yes
1380    support_boehm=no
1381 elif test x$with_runtime_preset = xnet_4_x; then
1382    with_profile4_x_default=yes
1383    TEST_PROFILE=net_4_x
1384 elif test x$with_runtime_preset = xall; then
1385    with_profile4_x_default=yes
1386    with_monodroid_default=yes
1387    with_monotouch_default=yes
1388    with_monotouch_watch_default=yes
1389    with_monotouch_tv_default=yes
1390    with_xammac_default=yes
1391    with_winaot_default=yes
1392    with_testing_winaot_interp_default=yes
1393    with_orbis_default=yes
1394    with_unreal_default=yes
1395    with_wasm_default=yes
1396    with_testing_aot_full_interp_default=yes
1397    with_testing_aot_hybrid_default=yes
1398    with_testing_aot_full_default=yes
1399    TEST_PROFILE=net_4_x
1400 elif test x$with_runtime_preset = xbitcode; then
1401    DISABLE_MCS_DOCS_default=yes
1402    with_testing_aot_full_default=yes
1403    with_bitcode_default=yes
1404    enable_cooperative_suspend_default=yes
1405    # FIXME: use TEST_PROFILE=testing_aot_full
1406    TEST_PROFILE=testing_aot_bitcode
1407    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1408    enable_llvm_default=yes
1410    mono_feature_disable_com='yes'
1411    mono_feature_disable_remoting='yes'
1412    mono_feature_disable_reflection_emit_save='yes'
1413    mono_feature_disable_reflection_emit='yes'
1414    mono_feature_disable_appdomains='yes'
1416    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1417    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1418    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1419    AOT_MODE="llvmonly"
1420 elif test x$with_runtime_preset = xbitcodeinterp; then
1421    with_testing_aot_full_interp_default=yes
1422    with_bitcode_default=yes
1423    enable_cooperative_suspend_default=yes
1424    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1425    TEST_PROFILE=testing_aot_bitcode_interp
1426    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1427    enable_llvm_default=yes
1429    # mscorlib.dll aot compilation crashes
1430    mono_feature_disable_com='yes'
1432    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1433    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1434    AOT_RUN_FLAGS="--llvmonly-interp"
1435 elif test x$with_runtime_preset = xfullaot; then
1436    DISABLE_MCS_DOCS_default=yes
1437    with_testing_aot_full_default=yes
1438    TEST_PROFILE=testing_aot_full
1440    mono_feature_disable_com='yes'
1441    mono_feature_disable_remoting='yes'
1442    mono_feature_disable_reflection_emit_save='yes'
1443    mono_feature_disable_reflection_emit='yes'
1444    mono_feature_disable_appdomains='yes'
1446    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1447    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1448    AOT_MODE="full"
1449 elif test x$with_runtime_preset = xfullaot_llvm; then
1450    DISABLE_MCS_DOCS_default=yes
1451    with_testing_aot_full_default=yes
1452    TEST_PROFILE=testing_aot_full
1454    mono_feature_disable_com='yes'
1455    mono_feature_disable_remoting='yes'
1456    mono_feature_disable_reflection_emit_save='yes'
1457    mono_feature_disable_reflection_emit='yes'
1458    mono_feature_disable_appdomains='yes'
1460    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1461    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1462    AOT_MODE="full"
1463 elif test x$with_runtime_preset = xhybridaot; then
1464    DISABLE_MCS_DOCS_default=yes
1465    with_testing_aot_hybrid_default=yes
1466    TEST_PROFILE=testing_aot_hybrid 
1468    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1469    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1470 elif test x$with_runtime_preset = xhybridaot_llvm; then
1471    DISABLE_MCS_DOCS_default=yes
1472    with_testing_aot_hybrid_default=yes
1473    TEST_PROFILE=testing_aot_hybrid
1475    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1476    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1477 elif test x$with_runtime_preset = xfullaotinterp; then
1478    with_testing_aot_full_interp_default=yes
1479    TEST_PROFILE=testing_aot_full_interp
1481    # mscorlib.dll aot compilation crashes
1482    mono_feature_disable_com='yes'
1484    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1485    AOT_RUN_FLAGS="--full-aot-interp"
1486 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1487    with_testing_aot_full_interp_default=yes
1488    TEST_PROFILE=testing_aot_full_interp
1490    # mscorlib.dll aot compilation crashes
1491    mono_feature_disable_com='yes'
1493    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1494    AOT_RUN_FLAGS="--full-aot-interp"
1495 elif test x$with_runtime_preset = xaot; then
1496    with_profile4_x_default=yes
1498    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1499    AOT_RUN_FLAGS=""
1501    DISABLE_MCS_DOCS_default=yes
1502 elif test x$with_runtime_preset = xaot_llvm; then
1503    with_profile4_x_default=yes
1505    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1506    AOT_RUN_FLAGS=""
1508    DISABLE_MCS_DOCS_default=yes
1509 elif test x$with_runtime_preset = xwinaot; then
1510    DISABLE_MCS_DOCS_default=yes
1511    with_winaot_default=yes
1512    TEST_PROFILE=winaot
1514    mono_feature_disable_com='yes'
1515    mono_feature_disable_remoting='yes'
1516    mono_feature_disable_reflection_emit_save='yes'
1517    mono_feature_disable_reflection_emit='yes'
1518    mono_feature_disable_appdomains='yes'
1520    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1521    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1522    AOT_MODE="full"
1523 elif test x$with_runtime_preset = xwinaotinterp; then
1524    DISABLE_MCS_DOCS_default=yes
1525    with_testing_winaot_interp_default=yes
1526    TEST_PROFILE=testing_winaot_interp
1528    mono_feature_disable_com='yes'
1529    mono_feature_disable_remoting='yes'
1530    mono_feature_disable_appdomains='yes'
1532    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1533    AOT_RUN_FLAGS="--full-aot-interp"
1534 elif test x$with_runtime_preset = xwinaotinterp_llvm; then
1535    DISABLE_MCS_DOCS_default=yes
1536    with_testing_winaot_interp_default=yes
1537    TEST_PROFILE=testing_winaot_interp
1539    mono_feature_disable_com='yes'
1540    mono_feature_disable_remoting='yes'
1541    mono_feature_disable_appdomains='yes'
1543    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1544    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1545    AOT_RUN_FLAGS="--full-aot-interp"
1546 elif test x$with_runtime_preset = xwinaot_llvm; then
1547    DISABLE_MCS_DOCS_default=yes
1548    with_winaot_default=yes
1549    TEST_PROFILE=winaot
1551    mono_feature_disable_com='yes'
1552    mono_feature_disable_remoting='yes'
1553    mono_feature_disable_reflection_emit_save='yes'
1554    mono_feature_disable_reflection_emit='yes'
1555    mono_feature_disable_appdomains='yes'
1557    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1558    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1559    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1560    AOT_MODE="full"
1561 elif test x$with_runtime_preset = xorbis; then
1562    DISABLE_MCS_DOCS_default=yes
1563    with_orbis_default=yes
1564    TEST_PROFILE=orbis
1566    mono_feature_disable_com='yes'
1567    mono_feature_disable_remoting='yes'
1568    mono_feature_disable_reflection_emit_save='yes'
1569    mono_feature_disable_reflection_emit='yes'
1570    mono_feature_disable_appdomains='yes'
1572    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1573    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1574    AOT_MODE="full"
1575 elif test x$with_runtime_preset = xunreal; then
1576    DISABLE_MCS_DOCS_default=yes
1577    with_unreal_default=yes
1578    TEST_PROFILE=unreal
1580    mono_feature_disable_com='yes'
1581    mono_feature_disable_remoting='yes'
1582    mono_feature_disable_appdomains='no'
1584    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1585    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1586 elif test x$with_runtime_preset = xwasm; then
1587    DISABLE_MCS_DOCS_default=yes
1588    with_wasm_default=yes
1589    TEST_PROFILE=wasm
1591    mono_feature_disable_com='yes'
1592    mono_feature_disable_remoting='yes'
1593    mono_feature_disable_reflection_emit_save='yes'
1594    mono_feature_disable_reflection_emit='yes'
1595    mono_feature_disable_appdomains='yes'
1597    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1598    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1599 else
1600    TEST_PROFILE=net_4_x
1601    with_profile4_x_default=yes
1604 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1605    AC_SUBST(AOT_BUILD_FLAGS)
1606    AC_SUBST(AOT_RUN_FLAGS)
1607    # For llvmonlycheck + fullaotcheck
1608    AC_SUBST(INVARIANT_AOT_OPTIONS)
1611 AC_SUBST(TEST_PROFILE)
1613 if test "x$with_profile4_x" = "xdefault"; then
1614    with_profile4_x=$with_profile4_x_default
1616 if test "x$with_monodroid" = "xdefault"; then
1617    with_monodroid=$with_monodroid_default
1619 if test "x$with_monotouch" = "xdefault"; then
1620    with_monotouch=$with_monotouch_default
1622 if test "x$with_monotouch_watch" = "xdefault"; then
1623    with_monotouch_watch=$with_monotouch_watch_default
1625 if test "x$with_monotouch_tv" = "xdefault"; then
1626    with_monotouch_tv=$with_monotouch_tv_default
1628 if test "x$with_bitcode" = "xdefault"; then
1629    with_bitcode=$with_bitcode_default
1631 if test "x$with_xammac" = "xdefault"; then
1632    with_xammac=$with_xammac_default
1634 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1635    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1637 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1638    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1640 if test "x$with_testing_aot_full" = "xdefault"; then
1641    with_testing_aot_full=$with_testing_aot_full_default
1643 if test "x$with_winaot" = "xdefault"; then
1644    with_winaot=$with_winaot_default
1646 if test "x$with_testing_winaot_interp" = "xdefault"; then
1647    with_testing_winaot_interp=$with_testing_winaot_interp_default
1649 if test "x$with_orbis" = "xdefault"; then
1650    with_orbis=$with_orbis_default
1652 if test "x$with_unreal" = "xdefault"; then
1653    with_unreal=$with_unreal_default
1655 if test "x$with_wasm" = "xdefault"; then
1656    with_wasm=$with_wasm_default
1660 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1661 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1662 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1663 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1664 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1665 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1666 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1667 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1668 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1669 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1670 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1671 AM_CONDITIONAL(INSTALL_TESTING_WINAOT_INTERP, [test "x$with_testing_winaot_interp" != "xno"])
1672 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1673 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1674 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1675 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1677 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1678 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"])
1679 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"])
1680 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1682 default_profile=net_4_x
1683 if test -z "$INSTALL_MONODROID_TRUE"; then :
1684    default_profile=monodroid
1686 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1687    default_profile=monotouch
1689 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1690    default_profile=xammac
1692 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1693    default_profile=testing_aot_full_interp
1695 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1696    default_profile=testing_aot_hybrid
1698 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1699    default_profile=testing_aot_full
1701 if test -z "$INSTALL_WINAOT_TRUE"; then :
1702    default_profile=winaot
1704 if test -z "$INSTALL_TESTING_WINAOT_INTERP_TRUE"; then :
1705    default_profile=testing_winaot_interp
1707 if test -z "$INSTALL_ORBIS_TRUE"; then :
1708    default_profile=orbis
1710 if test -z "$INSTALL_UNREAL_TRUE"; then :
1711    default_profile=unreal
1713 if test -z "$INSTALL_WASM_TRUE"; then :
1714    default_profile=wasm
1716 if test -z "$INSTALL_4_x_TRUE"; then :
1717    default_profile=net_4_x
1719 DEFAULT_PROFILE=$default_profile
1720 AC_SUBST(DEFAULT_PROFILE)
1723 # End build profile configuration
1726 if test x$USE_NLS = xprofile_default; then
1728         AC_MSG_CHECKING([NLS used])
1730         # We make the default value for USE_NLS
1731         # "no" on OSX because it isn't available on most
1732         # default OSX installs. The most common configurations will
1733         # all disable it, so this saves us typing.
1734         if test x$host_darwin = xyes; then
1735                 USE_NLS=no;
1736         else
1737                 USE_NLS=yes;
1738         fi
1740         AC_SUBST([USE_NLS])
1741         AC_MSG_RESULT([$USE_NLS])
1744 AC_ARG_ENABLE(static-gcc-libs, [  --enable-static-gcc-libs      Statically link GCC support libs (for MinGW32)])
1745 if test "x$enable_static_gcc_libs" = "xyes"; then
1746         # llvm/build.mk doesn't use automake, so make a regular make variable for it.
1747         AC_SUBST(STATIC_GCC_LIBS,1)
1749 AM_CONDITIONAL(ENABLE_STATIC_GCC_LIBS, test "x$enable_static_gcc_libs" = "xyes")
1751 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1752      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, dllmap,
1753      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1754          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets, gac, threads.],
1756         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1757                 eval "mono_feature_disable_$feature='yes'"
1758         done
1759         DISABLED_FEATURES=$enable_minimal
1760         disabled="Disabled:      $enable_minimal"
1761 ],[])
1763 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1765 if test "x$mono_feature_disable_aot" = "xyes"; then
1766         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1767         enable_system_aot=no
1768         AC_MSG_NOTICE([Disabled AOT compiler])
1771 if test "x$mono_feature_disable_profiler" = "xyes"; then
1772         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1773         AC_MSG_NOTICE([Disabled support for the profiler])
1775 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1777 if test "x$mono_feature_disable_decimal" = "xyes"; then
1778         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1779         AC_MSG_NOTICE([Disabled support for decimal])
1782 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1783         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1784         AC_MSG_NOTICE([Disabled support for P/Invoke])
1787 if test "x$mono_feature_disable_debug" = "xyes"; then
1788         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1789         AC_MSG_NOTICE([Disabled support for runtime debugging])
1792 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1793         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1794         mono_feature_disable_reflection_emit_save=yes
1795         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1798 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1799         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1800         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1803 if test "x$mono_feature_disable_large_code" = "xyes"; then
1804         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1805         AC_MSG_NOTICE([Disabled support for large assemblies])
1808 if test "x$mono_feature_disable_logging" = "xyes"; then
1809         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1810         AC_MSG_NOTICE([Disabled support for logging])
1813 if test "x$mono_feature_disable_com" = "xyes"; then
1814         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1815         AC_MSG_NOTICE([Disabled COM support])
1818 if test "x$mono_feature_disable_ssa" = "xyes"; then
1819         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1820         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1823 if test "x$mono_feature_disable_generics" = "xyes"; then
1824         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1825         AC_MSG_NOTICE([Disabled Generics Support])
1828 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1829         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1830         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1833 if test "x$mono_feature_disable_portability" = "xyes"; then
1834         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1835         AC_MSG_NOTICE([Disabled IO Portability layer])
1838 if test "x$mono_feature_disable_attach" = "xyes"; then
1839         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1840         AC_MSG_NOTICE([Disabled agent attach])
1843 if test "x$mono_feature_disable_verifier" = "xyes"; then
1844         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1845         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1848 if test "x$mono_feature_disable_jit" = "xyes"; then
1849         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1850         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1853 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1855 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1856         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1857         AC_MSG_NOTICE([Disabled the interpreter])
1860 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1862 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1863         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1866 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1868 if test "x$mono_feature_disable_simd" = "xyes"; then
1869         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1870         AC_MSG_NOTICE([Disabled SIMD support])
1873 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1874         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1875         AC_MSG_NOTICE([Disabled Soft Debugger.])
1878 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1880 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1881         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1882         AC_MSG_NOTICE([Disabled Performance Counters.])
1884 if test "x$mono_feature_disable_normalization" = "xyes"; then
1885         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1886         AC_MSG_NOTICE([Disabled String normalization support.])
1889 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1890 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1891         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1892         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1895 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1896         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1897         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1900 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1901         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1902         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1905 if test "x$mono_feature_disable_remoting" = "xyes"; then
1906         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1907         AC_MSG_NOTICE([Disabled remoting])
1910 if test "x$mono_feature_disable_security" = "xyes"; then
1911         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1912         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1915 if test "x$mono_feature_disable_lldb" = "xyes"; then
1916         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1917         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1920 if test "x$mono_feature_disable_mdb" = "xyes"; then
1921         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1922         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1925 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1926         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1927         AC_MSG_NOTICE([Disabled assertion messages.])
1930 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1931         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1932         AC_MSG_NOTICE([Disabled runtime cleanup.])
1935 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1936         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1937         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1941 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1942         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1943         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1946 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1947         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1948         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1951 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1952         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1953         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1956 if test "x$mono_feature_disable_sockets" = "xyes"; then
1957         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1958         AC_MSG_NOTICE([Disabled sockets])
1961 if test "x$mono_feature_disable_gac" = "xyes"; then
1962         AC_DEFINE(DISABLE_GAC, 1, [Disable GAC])
1963         AC_MSG_NOTICE([Disabled GAC support])
1966 if test "x$mono_feature_disable_dllmap" = "xyes"; then
1967     AC_DEFINE(DISABLE_DLLMAP,1,[Disables use of DllMaps in MonoVM])
1968     AC_MSG_NOTICE([Disabled DllMap in the loader.])
1971 if test "x$mono_feature_disable_threads" = "xyes"; then
1972         AC_DEFINE(DISABLE_THREADS, 1, [Disable Threads])
1973         AC_MSG_NOTICE([Disabled threading support])
1976 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1977 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1979 has_extension_module=no
1980 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1982         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1983                 if test x$extension = xdefault ; then
1984                         has_extension_module=yes;
1985                 fi
1986         done
1987         if test x$enable_extension_module = xyes; then
1988                 has_extension_module=yes;
1989         fi
1990 ], [])
1992 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1994 if test x$has_extension_module != xno ; then
1995         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1996         AC_MSG_NOTICE([Enabling mono extension module.])
1999 # Deprecated
2000 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
2002 AC_MSG_CHECKING(for visibility __attribute__)
2003 AC_COMPILE_IFELSE([
2004         AC_LANG_SOURCE([[
2005                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
2006                 int main () { doit (); return 0; }
2007         ]])
2008 ], [
2009    have_visibility_hidden=yes
2010    AC_MSG_RESULT(yes)
2011 ], [
2012    have_visibility_hidden=no
2013    AC_MSG_RESULT(no)
2017 dnl Boehm GC configuration
2020 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
2022 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
2023 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
2025 if test "x$support_boehm" = "xyes"; then
2027         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
2028         if test x$enable_parallel_mark = xyes; then
2029                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
2030         fi
2032         gc_msg=""
2033         LIBGC_CPPFLAGS=
2034         LIBGC_LIBS=
2035         LIBGC_STATIC_LIBS=
2036         case "x$libgc" in
2037                 xincluded)
2038                         LIBGC_CPPFLAGS='-I$(top_srcdir)/external/bdwgc/include -I$(top_srcdir)/external/bdwgc/libatomic_ops/src'
2039                         LIBGC_LIBS='$(top_builddir)/external/bdwgc/libgc.la'
2040                         LIBGC_STATIC_LIBS='$(top_builddir)/external/bdwgc/libgc-static.la'
2042                         BOEHM_DEFINES="-DHAVE_BOEHM_GC -DGC_THREADS"
2044                         if test x$target_win32 = xyes; then
2045                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
2046                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
2047                         fi
2049                         gc_msg="Included Boehm GC with typed GC"
2050                         if test x$enable_parallel_mark = xyes; then
2051                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
2052                                 gc_msg="$gc_msg and parallel mark"
2053                         else
2054                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
2055                         fi
2056                         ;;
2058                 xboehm|xbohem|xyes)
2059                         AC_MSG_WARN("External Boehm is no longer supported")
2060                         ;;
2062                 xsgen)
2063                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
2064                         ;;
2066                 xnone)
2067                         AC_MSG_WARN("Compiling mono without GC.")
2068                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
2069                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
2070                         gc_msg="none"
2071                         ;;
2072                 *)
2073                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
2074                         ;;
2075         esac
2077         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])
2078         if test "x$large_heap" = "xyes"; then
2079            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
2080         fi
2082         AC_SUBST(LIBGC_CPPFLAGS)
2083         AC_SUBST(LIBGC_LIBS)
2084         AC_SUBST(LIBGC_STATIC_LIBS)
2085         AC_SUBST(BOEHM_DEFINES)
2088 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
2091 dnl End of Boehm GC Configuration
2094 dnl *************************************
2095 dnl *** Checks for zero length arrays ***
2096 dnl *************************************
2097 AC_MSG_CHECKING(whether $CC supports zero length arrays)
2098 AC_TRY_COMPILE([
2099         struct s {
2100                 int  length;
2101                 char data [0];
2102         };
2103 ], [], [
2104         AC_MSG_RESULT(yes)
2105         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
2106 ], [
2107         AC_MSG_RESULT(no)
2108         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
2111 dnl ***********************************
2112 dnl *** Checks for signals
2113 dnl ***********************************
2114 AC_CHECK_HEADERS(signal.h)
2115 AC_CHECK_FUNCS(sigaction)
2116 AC_CHECK_FUNCS(kill)
2117 AC_CHECK_FUNCS(signal)
2119 # signal() is declared inline in Android headers
2120 # so we need to workaround it by overriding the check.
2121 if test x$platform_android = xyes; then
2122         AC_DEFINE(HAVE_SIGNAL,1)
2125 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
2126 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
2128 if test x$host_win32 = xno; then
2129         dnl *************************************
2130         dnl *** Checks for time capabilities ***
2131         dnl *************************************
2133         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
2134         AC_TRY_COMPILE([#include <time.h>], [
2135                 const int foo = CLOCK_MONOTONIC;
2136         ],[
2137                 AC_MSG_RESULT(yes)
2138                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
2139         ], [
2140                 AC_MSG_RESULT(no)
2141         ])
2143         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
2144         AC_TRY_COMPILE([#include <time.h>], [
2145                 const int foo = CLOCK_MONOTONIC_COARSE;
2146         ],[
2147                 AC_MSG_RESULT(yes)
2148                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
2149         ], [
2150                 AC_MSG_RESULT(no)
2151         ])
2153         AC_MSG_CHECKING(for CLOCK_REALTIME)
2154         AC_TRY_COMPILE([#include <time.h>], [
2155                 const int foo = CLOCK_REALTIME;
2156         ],[
2157                 AC_MSG_RESULT(yes)
2158                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
2159         ], [
2160                 AC_MSG_RESULT(no)
2161         ])
2163         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
2164         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
2165         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
2166         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
2167         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
2168         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
2170         dnl hires monotonic clock support
2171         AC_SEARCH_LIBS(clock_gettime, rt)
2172         AC_CHECK_FUNCS(clock_nanosleep)
2174         dnl dynamic loader support
2175         AC_CHECK_FUNC(dlopen, DL_LIB="",
2176                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
2177         )
2178         if test x$dl_support = xno; then
2179                 AC_MSG_WARN([No dynamic loading support available])
2180         else
2181                 LIBS="$LIBS $DL_LIB"
2182                 dnl from glib's configure.ac
2183                 if test "x$cross_compiling" = "xyes"; then
2184                    AC_MSG_RESULT(cross compiling, assuming no)
2185                    mono_cv_uscore=no
2186                 else
2187                         AC_CACHE_CHECK([for preceeding underscore in symbols],
2188                           mono_cv_uscore,[
2189                           AC_TRY_RUN([#include <dlfcn.h>
2190                           int mono_underscore_test (void) { return 42; }
2191                           int main() {
2192                             void *f1 = (void*)0, *f2 = (void*)0, *handle;
2193                             handle = dlopen ((void*)0, 0);
2194                             if (handle) {
2195                               f1 = dlsym (handle, "mono_underscore_test");
2196                               f2 = dlsym (handle, "_mono_underscore_test");
2197                             } return (!f2 || f1);
2198                           }],
2199                                 [mono_cv_uscore=yes],
2200                                 [mono_cv_uscore=no],
2201                           [])
2202                   ])
2203                 fi
2204                 if test "x$mono_cv_uscore" = "xyes"; then
2205                         AC_DEFINE(MONO_DL_NEED_USCORE, 1, [Does dlsym require leading underscore.])
2206                 fi
2207                 AC_CHECK_FUNC(dlerror)
2208         fi
2210         dnl ******************************************************************
2211         dnl *** Checks for the IKVM JNI interface library                  ***
2212         dnl ******************************************************************
2213         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])
2215         if test x$with_ikvm_native = xyes; then
2216                 jdk_headers_found="IKVM Native"
2217         fi
2219         AC_CHECK_HEADERS(execinfo.h)
2221         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2223         AC_CHECK_FUNCS(getgrgid_r)
2224         AC_CHECK_FUNCS(getgrnam_r)
2225         AC_CHECK_FUNCS(getresuid)
2226         AC_CHECK_FUNCS(setresuid)
2227         AC_CHECK_FUNCS(kqueue)
2228         # IBM provides a compatibility library for i offering this function.
2229         # BSDs and others, have execinfo in base or packages.
2230         AC_SEARCH_LIBS(backtrace_symbols, execinfo util)
2231         # Two-step so it sets it in config.h
2232         AC_CHECK_FUNCS(backtrace_symbols)
2233         AC_CHECK_FUNCS(mkstemp)
2234         AC_CHECK_FUNCS(mmap)
2235         AC_CHECK_FUNCS(madvise)
2236         AC_CHECK_FUNCS(getrusage)
2237         AC_CHECK_FUNCS(getpriority)
2238         AC_CHECK_FUNCS(setpriority)
2239         AC_CHECK_FUNCS(dl_iterate_phdr)
2240         AC_CHECK_FUNCS(dladdr)
2241         AC_CHECK_FUNCS(sysconf)
2242         AC_CHECK_FUNCS(getrlimit)
2243         AC_CHECK_FUNCS(prctl)
2244         AC_CHECK_FUNCS(arc4random)
2245         AC_CHECK_FUNCS(nl_langinfo)
2247         AC_CHECK_FUNCS(sched_getaffinity)
2248         AC_CHECK_FUNCS(sched_setaffinity)
2249         AC_CHECK_FUNCS(sched_getcpu)
2251         if test x$platform_android != xyes; then
2252                 AC_CHECK_FUNCS(getpwnam_r)
2253                 AC_CHECK_FUNCS(getpwuid_r)
2254         fi
2256         AC_CHECK_FUNCS(readlink)
2257         AC_CHECK_FUNCS(chmod)
2258         AC_CHECK_FUNCS(lstat)
2259         AC_CHECK_FUNCS(getdtablesize)
2261         AC_CHECK_FUNCS(ftruncate)
2262         AC_CHECK_FUNCS(msync)
2264         AC_CHECK_FUNCS(gethostname getpeername)
2265         AC_CHECK_FUNCS(utime utimes)
2267         AC_CHECK_FUNCS(openlog closelog)
2268         AC_CHECK_FUNCS(atexit)
2269         AC_CHECK_FUNCS(popen)
2271         AC_FUNC_STRERROR_R()
2273         dnl ****************************************************************
2274         dnl *** Check for sched_setaffinity from glibc versions before   ***
2275         dnl *** 2.3.4. The older versions of the function only take 2    ***
2276         dnl *** parameters, not 3.                                       ***
2277         dnl ***                                                          ***
2278         dnl *** Because the interface change was not made in a minor     ***
2279         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2280         dnl *** won't always indicate the interface sched_affinity has.  ***
2281         dnl ****************************************************************
2282         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2283         AC_TRY_COMPILE([#include <sched.h>], [
2284             int mask = 1; 
2285             sched_setaffinity(0, &mask);
2286         ], [
2287                 # Yes, we have it...
2288                 AC_MSG_RESULT(yes)
2289                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2290         ], [
2291                 # We have the new, three-parameter version
2292                 AC_MSG_RESULT(no)
2293         ])
2294         AC_TRY_COMPILE([#include <sched.h>], [
2295              CPU_COUNT((void *) 0);
2296         ], [
2297                 AC_MSG_RESULT(yes)
2298                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2299         ], [
2300                 # We have the new, three-parameter version
2301                 AC_MSG_RESULT(no)
2302         ])
2304         dnl ******************************************************************
2305         dnl *** Check for large file support                               ***
2306         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2307         dnl ******************************************************************
2308         
2309         # Check that off_t can represent 2**63 - 1 correctly, working around
2310         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2311         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2312         large_offt=no
2313         AC_DEFUN([LARGE_FILES], [
2314                 large_CPPFLAGS=$CPPFLAGS
2315                 CPPFLAGS="$CPPFLAGS $1"
2316                 AC_TRY_COMPILE([
2317                         #include <sys/types.h>
2318                         #include <limits.h>
2319                 ], [
2320                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2321                         #define COMPILE_TIME_ASSERT(pred) \
2322                                 switch(0){case 0:case pred:;}
2323                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2324                 ], [
2325                         AC_MSG_RESULT(ok)
2326                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2327                         large_CPPFLAGS="$large_CPPFLAGS $1"
2328                         large_offt=yes
2329                 ], [
2330                         AC_MSG_RESULT(no)
2331                 ])
2332                 CPPFLAGS=$large_CPPFLAGS
2333         ])
2335         AC_MSG_CHECKING(if off_t is 64 bits wide)
2336         LARGE_FILES("")
2337         if test $large_offt = no; then
2338                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2339                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2340         fi
2341         if test $large_offt = no; then
2342                 AC_MSG_WARN([No 64 bit file size support available])
2343         fi
2344         
2345         dnl *****************************
2346         dnl *** Checks for libsocket  ***
2347         dnl *****************************
2348         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2350         case "$host" in
2351                 *-*-*freebsd*)
2352                         dnl *****************************
2353                         dnl *** Checks for libinotify ***
2354                         dnl *****************************
2355                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2356         esac
2358         dnl *****************************
2359         dnl *** Checks for IPPROTO_IP ***
2360         dnl *****************************
2361         AC_MSG_CHECKING(for IPPROTO_IP)
2362         AC_TRY_COMPILE([#include <netinet/in.h>], [
2363                 int level = IPPROTO_IP;
2364         ], [
2365                 # Yes, we have it...
2366                 AC_MSG_RESULT(yes)
2367                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2368         ], [
2369                 # We'll have to use getprotobyname
2370                 AC_MSG_RESULT(no)
2371         ])
2373         dnl *******************************
2374         dnl *** Checks for IPPROTO_IPV6 ***
2375         dnl *******************************
2376         AC_MSG_CHECKING(for IPPROTO_IPV6)
2377         AC_TRY_COMPILE([#include <netinet/in.h>], [
2378                 int level = IPPROTO_IPV6;
2379         ], [
2380                 # Yes, we have it...
2381                 AC_MSG_RESULT(yes)
2382                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2383         ], [
2384                 # We'll have to use getprotobyname
2385                 AC_MSG_RESULT(no)
2386         ])
2388         dnl ******************************
2389         dnl *** Checks for IPPROTO_TCP ***
2390         dnl ******************************
2391         AC_MSG_CHECKING(for IPPROTO_TCP)
2392         AC_TRY_COMPILE([#include <netinet/in.h>], [
2393                 int level = IPPROTO_TCP;
2394         ], [
2395                 # Yes, we have it...
2396                 AC_MSG_RESULT(yes)
2397                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2398         ], [
2399                 # We'll have to use getprotobyname
2400                 AC_MSG_RESULT(no)
2401         ])
2403         dnl *****************************
2404         dnl *** Checks for SOL_IP     ***
2405         dnl *****************************
2406         AC_MSG_CHECKING(for SOL_IP)
2407         AC_TRY_COMPILE([#include <netdb.h>], [
2408                 int level = SOL_IP;
2409         ], [
2410                 # Yes, we have it...
2411                 AC_MSG_RESULT(yes)
2412                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2413         ], [
2414                 # We'll have to use getprotobyname
2415                 AC_MSG_RESULT(no)
2416         ])
2418         dnl *****************************
2419         dnl *** Checks for SOL_IPV6     ***
2420         dnl *****************************
2421         AC_MSG_CHECKING(for SOL_IPV6)
2422         AC_TRY_COMPILE([#include <netdb.h>], [
2423                 int level = SOL_IPV6;
2424         ], [
2425                 # Yes, we have it...
2426                 AC_MSG_RESULT(yes)
2427                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2428         ], [
2429                 # We'll have to use getprotobyname
2430                 AC_MSG_RESULT(no)
2431         ])
2433         dnl *****************************
2434         dnl *** Checks for SOL_TCP    ***
2435         dnl *****************************
2436         AC_MSG_CHECKING(for SOL_TCP)
2437         AC_TRY_COMPILE([#include <netdb.h>], [
2438                 int level = SOL_TCP;
2439         ], [
2440                 # Yes, we have it...
2441                 AC_MSG_RESULT(yes)
2442                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2443         ], [
2444                 # We'll have to use getprotobyname
2445                 AC_MSG_RESULT(no)
2446         ])
2448         dnl *****************************
2449         dnl *** Checks for IP_PKTINFO ***
2450         dnl *****************************
2451         AC_MSG_CHECKING(for IP_PKTINFO)
2452         AC_TRY_COMPILE([#include <linux/in.h>], [
2453                 int level = IP_PKTINFO;
2454         ], [
2455                 # Yes, we have it...
2456                 AC_MSG_RESULT(yes)
2457                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2458         ], [
2459                 AC_MSG_RESULT(no)
2460         ])
2462         dnl *****************************
2463         dnl *** Checks for IPV6_PKTINFO ***
2464         dnl *****************************
2465         AC_MSG_CHECKING(for IPV6_PKTINFO)
2466         AC_TRY_COMPILE([#include <netdb.h>], [
2467                 int level = IPV6_PKTINFO;
2468         ], [
2469                 # Yes, we have it...
2470                 AC_MSG_RESULT(yes)
2471                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2472         ], [
2473                 AC_MSG_RESULT(no)
2474         ])
2476         dnl **********************************
2477         dnl *** Checks for IP_DONTFRAG     ***
2478         dnl **********************************
2479         AC_MSG_CHECKING(for IP_DONTFRAG)
2480         AC_TRY_COMPILE([#include <netinet/in.h>], [
2481                 int level = IP_DONTFRAG;
2482         ], [
2483                 # Yes, we have it...
2484                 AC_MSG_RESULT(yes)
2485                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2486         ], [
2487                 AC_MSG_RESULT(no)
2488         ])
2490         dnl **********************************
2491         dnl *** Checks for IP_DONTFRAGMENT ***
2492         dnl **********************************
2493         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2494         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2495                 int level = IP_DONTFRAGMENT;
2496         ], [
2497                 # Yes, we have it...
2498                 AC_MSG_RESULT(yes)
2499                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2500         ], [
2501                 AC_MSG_RESULT(no)
2502         ])
2504         dnl **********************************
2505         dnl *** Checks for IP_MTU_DISCOVER ***
2506         dnl **********************************
2507         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2508         AC_TRY_COMPILE([#include <linux/in.h>], [
2509                 int level = IP_MTU_DISCOVER;
2510         ], [
2511                 # Yes, we have it...
2512                 AC_MSG_RESULT(yes)
2513                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2514         ], [
2515                 AC_MSG_RESULT(no)
2516         ])
2518         dnl **********************************
2519         dnl *** Checks for  IP_PMTUDISC_DO ***
2520         dnl **********************************
2521         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2522         AC_TRY_COMPILE([#include <linux/in.h>], [
2523                 int level = IP_PMTUDISC_DO;
2524         ], [
2525                 # Yes, we have it...
2526                 AC_MSG_RESULT(yes)
2527                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2528         ], [
2529                 AC_MSG_RESULT(no)
2530         ])
2532         dnl *********************************
2533         dnl *** Check for struct ip_mreqn ***
2534         dnl *********************************
2535         AC_MSG_CHECKING(for struct ip_mreqn)
2536         AC_TRY_COMPILE([#include <netinet/in.h>], [
2537                 struct ip_mreqn mreq;
2538                 mreq.imr_address.s_addr = 0;
2539         ], [
2540                 # Yes, we have it...
2541                 AC_MSG_RESULT(yes)
2542                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2543         ], [
2544                 # We'll just have to try and use struct ip_mreq
2545                 AC_MSG_RESULT(no)
2546                 AC_MSG_CHECKING(for struct ip_mreq)
2547                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2548                         struct ip_mreq mreq;
2549                         mreq.imr_interface.s_addr = 0;
2550                 ], [
2551                         # Yes, we have it...
2552                         AC_MSG_RESULT(yes)
2553                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2554                 ], [
2555                         # No multicast support
2556                         AC_MSG_RESULT(no)
2557                 ])
2558         ])
2559         
2560         dnl **********************************
2561         dnl *** Check for getaddrinfo ***
2562         dnl **********************************
2563         AC_MSG_CHECKING(for getaddrinfo)
2564                 AC_TRY_LINK([
2565                 #include <stdio.h>
2566                 #include <netdb.h>
2567         ], [
2568                 getaddrinfo(NULL,NULL,NULL,NULL);
2569         ], [
2570                 # Yes, we have it...
2571                 AC_MSG_RESULT(yes)
2572                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2573         ], [
2574                 AC_MSG_RESULT(no)
2575         ])
2577         dnl **********************************
2578         dnl *** Check for gethostbyname2_r ***
2579         dnl **********************************
2580         AC_MSG_CHECKING(for gethostbyname2_r)
2581                 AC_TRY_LINK([
2582                 #include <stdio.h>
2583                 #include <netdb.h>
2584         ], [
2586                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2587         ], [
2588                 # Yes, we have it...
2589                 AC_MSG_RESULT(yes)
2590                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2591         ], [
2592                 AC_MSG_RESULT(no)
2593         ])
2595         dnl **********************************
2596         dnl *** Check for gethostbyname2 ***
2597         dnl **********************************
2598         AC_MSG_CHECKING(for gethostbyname2)
2599                 AC_TRY_LINK([
2600                 #include <stdio.h>
2601                 #include <netdb.h>
2602         ], [
2603                 gethostbyname2(NULL,0);
2604         ], [
2605                 # Yes, we have it...
2606                 AC_MSG_RESULT(yes)
2607                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2608         ], [
2609                 AC_MSG_RESULT(no)
2610         ])
2612         dnl **********************************
2613         dnl *** Check for gethostbyname ***
2614         dnl **********************************
2615         AC_MSG_CHECKING(for gethostbyname)
2616                 AC_TRY_LINK([
2617                 #include <stdio.h>
2618                 #include <netdb.h>
2619         ], [
2620                 gethostbyname(NULL);
2621         ], [
2622                 # Yes, we have it...
2623                 AC_MSG_RESULT(yes)
2624                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2625         ], [
2626                 AC_MSG_RESULT(no)
2627         ])
2629         dnl **********************************
2630         dnl *** Check for getprotobyname ***
2631         dnl **********************************
2632         AC_MSG_CHECKING(for getprotobyname)
2633                 AC_TRY_LINK([
2634                 #include <stdio.h>
2635                 #include <netdb.h>
2636         ], [
2637                 getprotobyname(NULL);
2638         ], [
2639                 # Yes, we have it...
2640                 AC_MSG_RESULT(yes)
2641                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2642         ], [
2643                 AC_MSG_RESULT(no)
2644         ])
2646         dnl **********************************
2647         dnl *** Check for getprotobyname_r ***
2648         dnl **********************************
2649         AC_MSG_CHECKING(for getprotobyname_r)
2650                 AC_TRY_LINK([
2651                 #include <stdio.h>
2652                 #include <netdb.h>
2653         ], [
2654                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2655         ], [
2656                 # Yes, we have it...
2657                 AC_MSG_RESULT(yes)
2658                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2659         ], [
2660                 AC_MSG_RESULT(no)
2661         ])
2663         dnl **********************************
2664         dnl *** Check for getnameinfo ***
2665         dnl **********************************
2666         AC_MSG_CHECKING(for getnameinfo)
2667                 AC_TRY_LINK([
2668                 #include <stdio.h>
2669                 #include <netdb.h>
2670         ], [
2671                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2672         ], [
2673                 # Yes, we have it...
2674                 AC_MSG_RESULT(yes)
2675                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2676         ], [
2677                 AC_MSG_RESULT(no)
2678         ])
2681         dnl **********************************
2682         dnl *** Check for inet_ntop ***
2683         dnl **********************************
2684         AC_MSG_CHECKING(for inet_ntop)
2685                 AC_TRY_LINK([
2686                 #include <stdio.h>
2687                 #include <arpa/inet.h>
2688         ], [
2689                 inet_ntop (0, NULL, NULL, 0);
2690         ], [
2691                 # Yes, we have it...
2692                 AC_MSG_RESULT(yes)
2693                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2694         ], [
2695                 AC_MSG_RESULT(no)
2696         ])
2698         dnl *****************************
2699         dnl *** Checks for libnsl     ***
2700         dnl *****************************
2701         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2703         AC_CHECK_FUNCS(inet_pton inet_aton)
2705         dnl *****************************
2706         dnl *** Checks for libxnet    ***
2707         dnl *****************************
2708         case "${host}" in
2709                 *solaris* )
2710                         AC_MSG_CHECKING(for Solaris XPG4 support)
2711                         if test -f /usr/lib/libxnet.so; then
2712                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2713                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2714                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2715                                 LIBS="$LIBS -lxnet"
2716                                 AC_MSG_RESULT(yes)
2717                         else
2718                                 AC_MSG_RESULT(no)
2719                         fi
2721                         if test "$GCC" = "yes"; then
2722                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2723                         fi
2724                 ;;
2725         esac
2727         dnl *****************************
2728         dnl *** Checks for libpthread ***
2729         dnl *****************************
2730 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2731 # and libpthread does not exist
2733         case "${host}" in
2734                 *-*-*haiku*)
2735                         dnl Haiku has pthread in libroot (libc equiv)
2736                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2737                 ;;
2738                 *-*-*freebsd*)
2739                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2740                 ;;
2741                 *-*-*openbsd*)
2742                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2743                 ;;
2744                 *)
2745                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2746                 ;;
2747         esac
2748         AC_CHECK_HEADERS(pthread.h)
2749         AC_CHECK_HEADERS(pthread_np.h)
2750         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2751         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2752         AC_CHECK_FUNCS(pthread_kill)
2753         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2754         AC_TRY_COMPILE([ #include <pthread.h>], [
2755                 pthread_mutexattr_t attr;
2756                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2757         ], [
2758                 AC_MSG_RESULT(ok)
2759         ], [
2760                 AC_MSG_RESULT(no)
2761                 AC_ERROR(Posix system lacks support for recursive mutexes)
2762         ])
2763         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2764         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2765         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2766         dnl check that pthread_mutexattr_setprotocol is declared
2767         AC_CHECK_DECLS([pthread_mutexattr_setprotocol], [], [], [[#include <pthread.h>]])
2768         AC_CHECK_FUNCS(mincore mlock munlock)
2770         dnl ***********************************
2771         dnl *** Checks for working __thread ***
2772         dnl ***********************************
2773         AC_MSG_CHECKING(for working __thread)
2774         if test "x$with_tls" != "x__thread"; then
2775                 AC_MSG_RESULT(disabled)
2776         elif test "x$cross_compiling" = "xyes"; then
2777                 AC_MSG_RESULT(cross compiling, assuming yes)
2778         else
2779                 AC_TRY_RUN([
2780                         #if defined(__APPLE__) && defined(__clang__)
2781                         #error "__thread does not currently work with clang on Mac OS X"
2782                         #endif
2783                         
2784                         #include <unistd.h>
2785                         #include <pthread.h>
2786                         __thread int i;
2787                         static int res1, res2;
2789                         void thread_main (void *arg)
2790                         {
2791                                 i = arg;
2792                                 sleep (1);
2793                                 if (arg == 1)
2794                                         res1 = (i == arg);
2795                                 else
2796                                         res2 = (i == arg);
2797                         }
2799                         int main () {
2800                                 pthread_t t1, t2;
2802                                 i = 5;
2804                                 pthread_create (&t1, NULL, thread_main, 1);
2805                                 pthread_create (&t2, NULL, thread_main, 2);
2807                                 pthread_join (t1, NULL);
2808                                 pthread_join (t2, NULL);
2810                                 return !(res1 + res2 == 2);
2811                         }
2812                 ], [
2813                                 AC_MSG_RESULT(yes)
2814                 ], [
2815                                 AC_MSG_RESULT(no)
2816                                 with_tls=pthread
2817                 ])
2818         fi
2820         dnl **************************************
2821         dnl *** Checks for working sigaltstack ***
2822         dnl **************************************
2823         AC_MSG_CHECKING(for working sigaltstack)
2824         if test "x$with_sigaltstack" != "xyes"; then
2825                 AC_MSG_RESULT(disabled)
2826         elif test "x$cross_compiling" = "xyes"; then
2827                 AC_MSG_RESULT(cross compiling, assuming no)
2828                 with_sigaltstack=no
2829         else
2830                 AC_TRY_RUN([
2831                         #include <stdio.h>
2832                         #include <stdlib.h>
2833                         #include <unistd.h>
2834                         #include <signal.h>
2835                         #include <pthread.h>
2836                         #include <sys/wait.h>
2837                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2838                         #define SA_STACK SA_ONSTACK
2839                         #endif
2840                         static void
2841                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2842                         {
2843                                 exit (0);
2844                         }
2846                         volatile char*__ptr = NULL;
2847                         static void *
2848                         loop (void *ignored)
2849                         {
2850                                 *__ptr = 0;
2851                                 return NULL;
2852                         }
2854                         static void
2855                         child ()
2856                         {
2857                                 struct sigaction sa;
2858                                 stack_t sas;
2859                                 pthread_t id;
2860                                 pthread_attr_t attr;
2862                                 sa.sa_sigaction = sigsegv_signal_handler;
2863                                 sigemptyset (&sa.sa_mask);
2864                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2865                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2866                                         perror ("sigaction");
2867                                         return;
2868                                 }
2870                                 /* x86 darwin deliver segfaults using SIGBUS */
2871                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2872                                         perror ("sigaction");
2873                                         return;
2874                                 }
2875                                 sas.ss_sp = malloc (SIGSTKSZ);
2876                                 sas.ss_size = SIGSTKSZ;
2877                                 sas.ss_flags = 0;
2878                                 if (sigaltstack (&sas, NULL) == -1) {
2879                                         perror ("sigaltstack");
2880                                         return;
2881                                 }
2883                                 pthread_attr_init (&attr);
2884                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2885                                         printf ("pthread_create\n");
2886                                         return;
2887                                 }
2889                                 sleep (100);
2890                         }
2892                         int
2893                         main ()
2894                         {
2895                                 pid_t son;
2896                                 int status;
2897                                 int i;
2899                                 son = fork ();
2900                                 if (son == -1) {
2901                                         return 1;
2902                                 }
2904                                 if (son == 0) {
2905                                         child ();
2906                                         return 0;
2907                                 }
2909                                 for (i = 0; i < 300; ++i) {
2910                                         waitpid (son, &status, WNOHANG);
2911                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2912                                                 return 0;
2913                                         usleep (10000);
2914                                 }
2916                                 kill (son, SIGKILL);
2917                                 return 1;
2918                         }
2920                 ], [
2921                                 AC_MSG_RESULT(yes)
2922                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2923                 ], [
2924                                 with_sigaltstack=no
2925                                 AC_MSG_RESULT(no)
2926                 ])
2927         fi
2929         dnl ********************************
2930         dnl *** Checks for semaphore lib ***
2931         dnl ********************************
2932         # 'Real Time' functions on Solaris
2933         # posix4 on Solaris 2.6
2934         # pthread (first!) on Linux
2935         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2937         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2938         AC_CHECK_FUNCS(shm_open)
2940         dnl ********************************
2941         dnl *** Checks for timezone stuff **
2942         dnl ********************************
2943         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2944                 AC_TRY_COMPILE([
2945                         #include <time.h>
2946                         ], [
2947                         struct tm tm;
2948                         tm.tm_gmtoff = 1;
2949                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2950         if test $ac_cv_struct_tm_gmtoff = yes; then
2951                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2952         else
2953                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2954                         AC_TRY_COMPILE([
2955                                 #include <time.h>
2956                         ], [
2957                                 timezone = 1;
2958                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2959                 if test $ac_cv_var_timezone = yes; then
2960                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2961                 else
2962                         AC_ERROR(unable to find a way to determine timezone)
2963                 fi
2964         fi
2966         dnl *********************************
2967         dnl *** Checks for math functions ***
2968         dnl *********************************
2969         AC_SEARCH_LIBS(sqrtf, m)
2971         dnl ****************************************************************
2972         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2973         dnl *** have it in the library (duh))                            ***
2974         dnl ****************************************************************
2975         AC_CHECK_FUNCS(poll)
2977         dnl **********************************
2978         dnl *** epoll                      ***
2979         dnl **********************************
2980         AC_CHECK_HEADERS(sys/epoll.h)
2981         haveepoll=no
2982         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2983         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2984                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2985         fi
2987         havekqueue=no
2989         AC_CHECK_HEADERS(sys/event.h)
2990         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2992         dnl **************************************
2993         dnl * Darwin has a race that prevents us from using reliably:
2994         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2995         dnl * Since kqueue is mostly used for scaling large web servers, 
2996         dnl * and very few folks run Mono on large web servers on OSX, falling
2997         dnl * back 
2998         dnl **************************************
2999         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
3000                 if test "x$host_darwin" = "xno"; then
3001                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
3002                 fi
3003         fi
3005         dnl ******************************
3006         dnl *** Checks for SIOCGIFCONF ***
3007         dnl ******************************
3008         AC_CHECK_HEADERS(sys/ioctl.h)
3009         AC_CHECK_HEADERS(net/if.h, [], [],
3010            [
3011            #ifdef HAVE_SYS_TYPES_H
3012            # include <sys/types.h>
3013            #endif
3014            #ifdef HAVE_SYS_SOCKET_H
3015            # include <sys/socket.h>
3016            #endif
3017            ])
3018         AC_MSG_CHECKING(for ifreq)
3019         AC_TRY_COMPILE([
3020                 #include <stdio.h>
3021                 #include <sys/ioctl.h>
3022                 #include <net/if.h>
3023                 ], [
3024                 struct ifconf ifc;
3025                 struct ifreq *ifr;
3026                 void *x;
3027                 ifc.ifc_len = 0;
3028                 ifc.ifc_buf = NULL;
3029                 x = (void *) &ifr->ifr_addr;
3030                 ],[
3031                         AC_MSG_RESULT(yes)
3032                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
3033                 ], [
3034                         AC_MSG_RESULT(no)
3035                 ])
3036         dnl **********************************
3037         dnl ***     Checks for sin_len     ***
3038         dnl **********************************
3039         AC_MSG_CHECKING(for sockaddr_in.sin_len)
3040         AC_TRY_COMPILE([
3041                 #include <netinet/in.h>
3042                 ], [
3043                 struct sockaddr_in saddr;
3044                 saddr.sin_len = sizeof (saddr);
3045                 ],[
3046                         AC_MSG_RESULT(yes)
3047                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
3048                 ], [
3049                         AC_MSG_RESULT(no)
3050                 ])      
3051         dnl **********************************
3052         dnl ***    Checks for sin6_len     ***
3053         dnl **********************************
3054         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
3055         AC_TRY_COMPILE([
3056                 #include <netinet/in.h>
3057                 ], [
3058                 struct sockaddr_in6 saddr6;
3059                 saddr6.sin6_len = sizeof (saddr6);
3060                 ],[
3061                         AC_MSG_RESULT(yes)
3062                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
3063                 ], [
3064                         AC_MSG_RESULT(no)
3065                 ])
3066         dnl **********************************
3067         dnl *** Check for getifaddrs       ***
3068         dnl **********************************
3069         AC_MSG_CHECKING(for getifaddrs)
3070                 AC_TRY_LINK([
3071                 #include <stdio.h>
3072                 #include <sys/types.h>
3073                 #include <sys/socket.h>
3074                 #ifdef HAVE_NET_IF_H
3075                 #include <net/if.h>
3076                 #endif
3077                 #include <ifaddrs.h>
3078         ], [
3079                 getifaddrs(NULL);
3080         ], [
3081                 # Yes, we have it...
3082                 AC_MSG_RESULT(yes)
3083                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
3084         ], [
3085                 AC_MSG_RESULT(no)
3086         ])
3087         dnl **********************************
3088         dnl *** Check for if_nametoindex   ***
3089         dnl **********************************
3090         AC_MSG_CHECKING(for if_nametoindex)
3091                 AC_TRY_LINK([
3092                 #include <stdio.h>
3093                 #include <sys/types.h>
3094                 #include <sys/socket.h>
3095                 #include <net/if.h>
3096         ], [
3097                 if_nametoindex(NULL);
3098         ], [
3099                 # Yes, we have it...
3100                 AC_MSG_RESULT(yes)
3101                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
3102         ], [
3103                 AC_MSG_RESULT(no)
3104         ])
3105         dnl **********************************
3106         dnl *** Check for access ***
3107         dnl **********************************
3108         AC_MSG_CHECKING(for access)
3109                 AC_TRY_LINK([
3110                 #include <unistd.h>
3111         ], [
3112                 access(NULL,0);
3113         ], [
3114                 # Yes, we have it...
3115                 AC_MSG_RESULT(yes)
3116                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
3117         ], [
3118                 AC_MSG_RESULT(no)
3119         ])
3120                         
3121         dnl **********************************
3122         dnl *** Checks for proclib         ***
3123         dnl **********************************
3124         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.)])
3125         dnl **********************************
3126         dnl *** Checks for MonoPosixHelper ***
3127         dnl **********************************
3128         AC_CHECK_HEADERS(checklist.h)
3129         AC_CHECK_HEADERS(pathconf.h)
3130         AC_CHECK_HEADERS(fstab.h)
3131         AC_CHECK_HEADERS(attr/xattr.h)
3132         AC_CHECK_HEADERS(sys/extattr.h)
3133         AC_CHECK_HEADERS(sys/sendfile.h)
3134         AC_CHECK_HEADERS(sys/statvfs.h)
3135         AC_CHECK_HEADERS(sys/statfs.h)
3136         AC_CHECK_HEADERS(sys/vfstab.h)
3137         AC_CHECK_HEADERS(sys/xattr.h)
3138         AC_CHECK_HEADERS(sys/mman.h)
3139         AC_CHECK_HEADERS(sys/param.h)
3140         AC_CHECK_HEADERS(sys/mount.h, [], [],
3141                 [
3142                 #ifdef HAVE_SYS_PARAM_H
3143                 # include <sys/param.h>
3144                 #endif
3145                 ])
3146         AC_CHECK_HEADERS(sys/mount.h)
3147         AC_CHECK_FUNCS(confstr)
3148         AC_CHECK_FUNCS(seekdir telldir)
3149         AC_CHECK_FUNCS(getdomainname)
3150         AC_CHECK_FUNCS(setdomainname)
3151         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
3152         AC_CHECK_FUNCS(setgroups)
3153         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
3154         AC_CHECK_FUNCS(getfsstat)
3155         AC_CHECK_FUNCS(lutimes futimes)
3156         AC_CHECK_FUNCS(mremap)
3157         AC_CHECK_FUNCS(remap_file_pages)
3158         AC_CHECK_FUNCS(posix_fadvise)
3159         AC_CHECK_FUNCS(posix_fallocate)
3160         AC_CHECK_FUNCS(posix_madvise)
3161         AC_CHECK_FUNCS(vsnprintf)
3162         AC_CHECK_FUNCS(sendfile)
3163         AC_CHECK_FUNCS(gethostid sethostid)
3164         AC_CHECK_FUNCS(sethostname)
3165         AC_CHECK_FUNCS(statfs)
3166         AC_CHECK_FUNCS(fstatfs)
3167         AC_CHECK_FUNCS(statvfs)
3168         AC_CHECK_FUNCS(fstatvfs)
3169         AC_CHECK_FUNCS(stime)
3170         AC_CHECK_FUNCS(ttyname_r)
3171         AC_CHECK_FUNCS(psignal)
3172         AC_CHECK_FUNCS(getlogin_r)
3173         AC_CHECK_FUNCS(lockf)
3174         AC_CHECK_FUNCS(swab)
3175         AC_CHECK_FUNCS(setusershell endusershell)
3176         AC_CHECK_FUNCS(futimens utimensat)
3177         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
3178         AC_CHECK_FUNCS(readv writev preadv pwritev)
3179         AC_CHECK_FUNCS(setpgid)
3180         AC_CHECK_FUNCS(system)
3181         AC_CHECK_FUNCS(fork execv execve)
3182         AC_CHECK_FUNCS(waitpid)
3183         AC_CHECK_FUNCS(accept4)
3184         AC_CHECK_FUNCS(localtime_r)
3185         AC_CHECK_FUNCS(mkdtemp)
3186         AC_CHECK_SIZEOF(size_t)
3187         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
3188                 [#include <sys/types.h>
3189                  #include <sys/stat.h>
3190                  #include <unistd.h>])
3191         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
3192                 [#include <sys/types.h>
3193                  #include <sys/stat.h>
3194                  #include <unistd.h>])
3195         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
3196                 [#include <sys/time.h>])
3197         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
3198                 [#include <sys/socket.h>])
3199         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
3200                 [#include <unistd.h>
3201                  #include <fcntl.h>])
3202         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
3203                 [#include <sys/uio.h>])
3204         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
3205                 [#include <sys/socket.h>])
3206         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3207                 [#include <sys/poll.h>])
3208         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3209                 [#include <sys/socket.h>])
3210         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3211                 [#include <sys/socket.h>])
3212         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3213                 [#include <netinet/in.h>])
3214         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3215                 [#include <netinet/in.h>])
3216         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3217                 [#include <sys/un.h>])
3218         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3219                 [#include <sys/types.h>
3220                  #include <sys/stat.h>
3221                  #include <unistd.h>])
3222         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3223                 [#include <time.h>])
3224         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3225                 [#include <sys/time.h>
3226                  #include <sys/types.h>
3227                  #include <utime.h>])
3228         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3229                 [#include <sys/time.h>])
3230         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3231                 [#include <sys/types.h>
3232                  #include <utime.h>])
3233         AC_CHECK_MEMBERS(
3234                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3235                 [#include <sys/types.h>
3236                  #include <dirent.h>])
3237         AC_CHECK_MEMBERS(
3238                 [struct passwd.pw_gecos],,, 
3239                 [#include <sys/types.h>
3240                  #include <pwd.h>])
3241         AC_CHECK_MEMBERS(
3242                 [struct statfs.f_flags],,, 
3243                 [#include <sys/types.h>
3244                  #include <sys/vfs.h>])
3245         AC_CHECK_MEMBERS(
3246                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3247                 [#include <sys/types.h>
3248                  #include <sys/stat.h>
3249                  #include <unistd.h>])
3251         dnl Favour xattr through glibc, but use libattr if we have to
3252         AC_CHECK_FUNC(lsetxattr, ,
3253                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3254         )
3255         AC_SUBST(XATTR_LIB)
3257         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3258         AC_CHECK_MEMBERS(
3259                 [struct kinfo_proc.kp_proc],,, 
3260                 [#include <sys/types.h>
3261                  #include <sys/param.h>
3262                  #include <sys/sysctl.h>
3263                  #include <sys/proc.h>
3264                  ])
3266         dnl *********************************
3267         dnl *** Checks for Windows compilation ***
3268         dnl *********************************
3269         AC_CHECK_HEADERS(sys/time.h)
3270         AC_CHECK_HEADERS(sys/param.h)
3271         AC_CHECK_HEADERS(dirent.h)
3273         dnl ******************************************
3274         dnl *** Checks for OSX and iOS compilation ***
3275         dnl ******************************************
3276         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3278         dnl *********************************
3279         dnl *** Check for Console 2.0 I/O ***
3280         dnl *********************************
3281         AC_CHECK_HEADERS([curses.h])
3282         AC_CHECK_HEADERS([term.h], [], [],
3283         [#if HAVE_CURSES_H
3284          #include <curses.h>
3285          #endif
3286         ])
3287         AC_CHECK_HEADERS([termios.h])
3289         dnl *********************************
3290         dnl *** Checks for random         ***
3291         dnl *********************************
3292         if test x$host_darwin = xno; then
3293                 AC_CHECK_HEADERS(sys/random.h)
3294                 AC_CHECK_FUNCS(getrandom getentropy)
3295         fi
3297         dnl *********************************
3298         dnl *** Checks for Mono.Native    ***
3299         dnl *********************************
3301         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3302         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3304         AC_MSG_CHECKING(for linux/in.h)
3305         AC_TRY_COMPILE([
3306                 #include <sys/socket.h>
3307                 #include <linux/in.h>
3308         ], [
3309         ],[
3310                 AC_MSG_RESULT(yes)
3311                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3312         ], [
3313                 AC_MSG_RESULT(no)
3314         ])
3316         AC_CHECK_HEADERS([linux/if_packet.h])
3318         AC_MSG_CHECKING(for struct in_pktinfo)
3319         AC_TRY_COMPILE([
3320                 #ifdef HAVE_LINUX_IN_H
3321                 #include <sys/socket.h>
3322                 #include <linux/in.h>
3323                 #else
3324                 #include <netinet/in.h>
3325                 #endif
3326         ], [
3327                 struct in_pktinfo pktinfo;
3328         ],[
3329                 AC_MSG_RESULT(yes)
3330                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3331         ], [
3332                 AC_MSG_RESULT(no)
3333         ])
3335         AC_MSG_CHECKING(for struct ip_mreqn)
3336         AC_TRY_COMPILE([
3337                 #if HAVE_LINUX_IN_H
3338                 #include <sys/socket.h>
3339                 #include <linux/in.h>
3340                 #else
3341                 #include <netinet/in.h>
3342                 #endif
3343         ], [
3344                 struct ip_mreqn mreqn;
3345         ],[
3346                 AC_MSG_RESULT(yes)
3347                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3348         ], [
3349                 AC_MSG_RESULT(no)
3350         ])
3352         if test x$host_darwin = xno; then
3353                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3354         fi
3356         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3357         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3359         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3360         AC_CHECK_FUNC(Qp2getifaddrs,     [AC_DEFINE(HAVE_QP2GETIFADDRS, 1, [Qp2getifaddrs])])
3362         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3363         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3364         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3365         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3367         if test "x$mono_native_platform_ios" = "xno"; then
3368                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3369                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3370                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3371         fi
3373         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3374         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3375         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3376         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3377         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
3378         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3379         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3380         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3382         if test "x$platform_android" != "xyes"; then
3383                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3384         fi
3386         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3387         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3388         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3389         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3390         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3391         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3393         AC_CHECK_DECL(lchflags,          [AC_DEFINE(HAVE_LCHFLAGS, 1, [lchflags])], [], 
3394                 [[#include <sys/types.h> 
3395                 #include <sys/stat.h>]])
3396         AC_CHECK_MEMBER(struct stat.st_flags,
3397                 [AC_DEFINE(HAVE_STAT_FLAGS, 1, [struct stat.st_flags])],
3398                 [],
3399                 [#include <sys/types.h>
3400                 #include <sys/stat.h>])
3402         AC_CHECK_MEMBER(struct stat.st_birthtimespec,
3403                 [AC_DEFINE(HAVE_STAT_BIRTHTIME, 1, [struct stat.st_birthtimespec])],
3404                 [],
3405                 [#include <sys/types.h>
3406                 #include <sys/stat.h>])
3407         AC_CHECK_MEMBER(struct stat.st_atimespec,
3408                 [AC_DEFINE(HAVE_STAT_TIMESPEC, 1, [struct stat.st_atimespec])],
3409                 [],
3410                 [#include <sys/types.h>
3411                 #include <sys/stat.h>])
3412         AC_CHECK_MEMBER(struct stat.st_atim,
3413                 [AC_DEFINE(HAVE_STAT_TIM, 1, [struct stat.st_atim])],
3414                 [],
3415                 [#include <sys/types.h>
3416                 #include <sys/stat.h>])
3417         AC_CHECK_MEMBER(struct stat.st_atimensec,
3418                 [AC_DEFINE(HAVE_STAT_NSEC, 1, [struct stat.st_atimensec])],
3419                 [],
3420                 [#include <sys/types.h>
3421                 #include <sys/stat.h>])
3422         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [#include <dirent.h>])
3423         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [#include <sys/mount.h>])
3424         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [#include <sys/mount.h>])
3426         AC_MSG_CHECKING(for struct statfs)
3427         AC_TRY_COMPILE([
3428                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3429                 #include <sys/mount.h>
3430                 #else
3431                 #include <sys/statfs.h>
3432                 #endif
3433         ], [
3434                 struct statfs;
3435         ],[
3436                 AC_MSG_RESULT(yes)
3437                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3438         ], [
3439                 AC_MSG_RESULT(no)
3440         ])
3442         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3443                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3444         fi
3446         AC_MSG_CHECKING(for readdir_r)
3447         AC_TRY_LINK([
3448                 #include <dirent.h>
3449         ], [
3450                 DIR* dir;
3451                 struct dirent* entry;
3452                 struct dirent* result;
3453                 readdir_r(dir, entry, &result);
3454         ],[
3455                 AC_MSG_RESULT(yes)
3456                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3457         ], [
3458                 AC_MSG_RESULT(no)
3459         ])
3461         AC_MSG_CHECKING(for kevent with void *data)
3462         AC_TRY_LINK([
3463                 #include <sys/types.h>
3464                 #include <sys/event.h>
3465         ], [
3466                 struct kevent event;
3467                 void* data;
3468                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3469         ],[
3470                 AC_MSG_RESULT(yes)
3471                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3472         ], [
3473                 AC_MSG_RESULT(no)
3474         ])
3476         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3477         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3479         AC_MSG_CHECKING(for sendfile with 4 arguments)
3480         AC_TRY_LINK([
3481                 #include <sys/sendfile.h>
3482         ], [
3483                 #if defined(TARGET_ANDROID)
3484                 #if !defined(__ANDROID_API__)
3485                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3486                 #elif __ANDROID_API__ < 21
3487                 #error sendfile is not supported on this Android API level
3488                 #endif
3489                 #endif
3491                 int result = sendfile(0, 0, 0, 0);
3492         ],[
3493                 AC_MSG_RESULT(yes)
3494                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3495         ], [
3496                 AC_MSG_RESULT(no)
3497         ])
3499         ORIG_CFLAGS="$CFLAGS"
3500         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3502         AC_MSG_CHECKING(for sendfile with 6 arguments)
3503         AC_TRY_LINK([
3504                 #include <stdlib.h>
3505                 #include <sys/types.h>
3506                 #include <sys/socket.h>
3507                 #include <sys/uio.h>
3508         ], [
3509                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3510         ],[
3511                 AC_MSG_RESULT(yes)
3512                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3513         ], [
3514                 AC_MSG_RESULT(no)
3515         ])
3517         CFLAGS="$ORIG_CFLAGS"
3519         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3520         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3521         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3522         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3524         ORIG_CFLAGS="$CFLAGS"
3525         CFLAGS="$CFLAGS -Werror=sign-conversion"
3527         AC_MSG_CHECKING(for getnameinfo with signed flags)
3528         AC_TRY_LINK([
3529                 #include <sys/types.h>
3530                 #include <netdb.h>
3531         ], [
3532                 const struct sockaddr *addr;
3533                 socklen_t addrlen;
3534                 char *host;
3535                 socklen_t hostlen;
3536                 char *serv;
3537                 socklen_t servlen;
3538                 int flags;
3539                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3540         ],[
3541                 AC_MSG_RESULT(yes)
3542                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3543         ], [
3544                 AC_MSG_RESULT(no)
3545         ])
3547         CFLAGS="$ORIG_CFLAGS"
3549         if test "x$host_linux" = "xyes"; then
3550                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3551         else
3552                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3553         fi
3555         # HAVE_CLOCK_MONOTONIC check already done above
3556         # HAVE_CLOCK_REALTIME check already done above
3557         # HAVE_MACH_ABSOLUTE_TIME check already done above
3558         # HAVE_MACH_TIMEBASE_INFO check already done above
3559         # HAVE_FUTIMES check already done above
3560         # HAVE_FUTIMENS check already done above
3562         ORIG_CFLAGS="$CFLAGS"
3563         CFLAGS="$CFLAGS -Werror=sign-conversion"
3565         AC_MSG_CHECKING(for bind with unsigned addrlen)
3566         AC_TRY_LINK([
3567                 #include <sys/socket.h>
3568         ], [
3569                 int fd;
3570                 struct sockaddr* addr;
3571                 socklen_t addrLen;
3572                 bind(fd, addr, addrLen);
3573         ],[
3574                 AC_MSG_RESULT(yes)
3575                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3576         ], [
3577                 AC_MSG_RESULT(no)
3578         ])
3580         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3581         AC_TRY_LINK([
3582                 #include <netinet/in.h>
3583                 #include <netinet/tcp.h>
3584         ], [
3585                 struct ipv6_mreq opt;
3586                 unsigned int index = 0;
3587                 opt.ipv6mr_interface = index;
3588         ],[
3589                 AC_MSG_RESULT(yes)
3590                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3591         ], [
3592                 AC_MSG_RESULT(no)
3593         ])
3595         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3596         AC_TRY_LINK([
3597                 #include <sys/inotify.h>
3598         ], [
3599                 intptr_t fd;
3600                 uint32_t wd;
3601                 int result = inotify_rm_watch(fd, wd);
3602         ],[
3603                 AC_MSG_RESULT(yes)
3604                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3605         ], [
3606                 AC_MSG_RESULT(no)
3607         ])
3609         CFLAGS="$ORIG_CFLAGS"
3611         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3612         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3613                 AC_MSG_RESULT(no)
3614         elif test "x$cross_compiling" = "xyes"; then
3615                 AC_MSG_RESULT(cross compiling, assuming yes)
3616                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3617         else
3618                 AC_TRY_RUN([
3619                         #include <sys/mman.h>
3620                         #include <fcntl.h>
3621                         #include <unistd.h>
3623                         int main ()
3624                         {
3625                         #ifdef __PASE__
3626                                 /* IBM i doesn't implement this and returns SIGILL */
3627                                 return -1;
3628                         #endif
3629                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3630                                 if (fd == -1)
3631                                         return -1;
3633                                 shm_unlink("/mono_configure_shm_open");
3635                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3636                                 //       on at least the current version of Mac OS X
3638                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3639                                         return -1;
3641                                 return 0;
3642                         }
3643                 ],[
3644                         AC_MSG_RESULT(yes)
3645                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3646                 ], [
3647                         AC_MSG_RESULT(no)
3648                 ])
3649         fi
3651         AC_MSG_CHECKING(for getpriority with int who)
3652         AC_TRY_LINK([
3653                 #include <sys/resource.h>
3654         ], [
3655                 int which;
3656                 int who;
3657                 int result = getpriority(which, who);
3658         ],[
3659                 AC_MSG_RESULT(yes)
3660                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3661         ], [
3662                 AC_MSG_RESULT(no)
3663         ])
3665         AC_MSG_CHECKING(for kevent with int parameters)
3666         AC_TRY_LINK([
3667                 #include <sys/types.h>
3668                 #include <sys/event.h>
3669         ], [
3670                 int kg;
3671                 const struct kevent* chagelist;
3672                 int nchanges;
3673                 struct kevent* eventlist;
3674                 int nevents;
3675                 const struct timespec* timeout;
3676                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3677         ],[
3678                 AC_MSG_RESULT(yes)
3679                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3680         ], [
3681                 AC_MSG_RESULT(no)
3682         ])
3684         AC_CHECK_FUNCS(mkstemps)
3685         # AC_CHECK_FUNCS(mkstemp) # already done above
3687         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3688                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3689         fi
3691         AC_MSG_CHECKING(for tcp/var.h)
3692         AC_TRY_LINK([
3693                 #include <sys/types.h>
3694                 #include <sys/socketvar.h>
3695                 #include <netinet/ip.h>
3696                 #include <netinet/tcp.h>
3697                 #include <netinet/tcp_var.h>
3698         ], [
3699         ],[
3700                 AC_MSG_RESULT(yes)
3701                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3702         ], [
3703                 AC_MSG_RESULT(no)
3704         ])
3706         AC_CHECK_HEADERS([sys/cdefs.h])
3708         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3709         AC_TRY_LINK([
3710                 #ifdef HAVE_SYS_CDEFS_H
3711                 #include <sys/cdefs.h>
3712                 #endif
3713                 #include <netinet/tcp.h>
3714         ], [
3715                 int result = TCP_ESTABLISHED;
3716         ],[
3717                 AC_MSG_RESULT(yes)
3718                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3719         ], [
3720                 AC_MSG_RESULT(no)
3721         ])
3723         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3725         AC_MSG_CHECKING(for struct rt_msghdr)
3726         AC_TRY_COMPILE([
3727                 #include <sys/types.h>
3728                 #include <net/route.h>
3729         ], [
3730                 struct rt_msghdr;
3731         ],[
3732                 AC_MSG_RESULT(yes)
3733                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3734         ], [
3735                 AC_MSG_RESULT(no)
3736         ])
3738         AC_CHECK_HEADERS([sys/sysctl.h])
3739         AC_CHECK_HEADERS([linux/rtnetlink.h])
3741         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3742         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3743         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3745         ORIG_CFLAGS="$CFLAGS"
3746         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3748         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3749         AC_TRY_LINK([
3750                 #include <unistd.h>
3751         ], [
3752                 size_t namelen = 20;
3753                 char name[20];
3754                 int result = getdomainname(name, namelen);
3755         ],[
3756                 AC_MSG_RESULT(yes)
3757                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3758         ], [
3759                 AC_MSG_RESULT(no)
3760         ])
3762         CFLAGS="$ORIG_CFLAGS"
3764         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3765         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3766         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3768         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
3769                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3770         elif test "x$host_linux" = "xyes"; then
3771                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3772         fi
3774         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3775         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3776         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3777         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3779         enable_gss=no;
3780         AC_MSG_CHECKING(for GSS/GSS.h)
3781         AC_TRY_COMPILE([
3782                         #include <GSS/GSS.h>
3783         ], [
3784         ],[
3785                         AC_MSG_RESULT(yes)
3786                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3787                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3788                         enable_gss=yes
3789                         AC_DEFINE(ENABLE_GSS, 1, [ENABLE_GSS])
3790         ], [
3791                         AC_MSG_RESULT(no)
3792         ])
3794         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3795         AC_TRY_COMPILE([
3796                         #include <gssapi/gssapi_ext.h>
3797         ], [
3798         ],[
3799                         AC_MSG_RESULT(yes)
3800                         enable_gss=yes
3801                         AC_DEFINE(ENABLE_GSS, 1, [ENABLE_GSS])
3802         ], [
3803                         AC_MSG_RESULT(no)
3804         ])
3806         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3807         AC_TRY_COMPILE([
3808                         #include <gssapi/gssapi_ext.h>
3809                         #include <gssapi/gssapi_krb5.h>
3810                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3811         ], [
3812         ],[
3813                         AC_MSG_RESULT(yes)
3814                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3815         ], [
3816                         AC_MSG_RESULT(no)
3817         ])
3819         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3821         AC_CHECK_HEADERS([crt_externs.h])
3823         AC_MSG_CHECKING(for _NSGetEnviron)
3824         AC_TRY_LINK([
3825                 #include <crt_externs.h>
3826         ], [
3827                 char **result = *(_NSGetEnviron());
3828         ],[
3829                 AC_MSG_RESULT(yes)
3830                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3831         ], [
3832                 AC_MSG_RESULT(no)
3833         ])
3835         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3837         # *** End of Mono.Native checks ***
3838 else
3839         AM_CONDITIONAL(ENABLE_GSS, false)
3841         dnl *********************************
3842         dnl *** Checks for Windows compilation ***
3843         dnl *********************************
3844         AC_CHECK_HEADERS(winternl.h)
3846         jdk_headers_found=no
3847         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3848         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3849         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3850         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3851         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3852         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3853         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3855         dnl *********************************
3856         dnl *** Check for struct ip_mreqn ***
3857         dnl *********************************
3858         AC_MSG_CHECKING(for struct ip_mreqn)
3859         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3860                 struct ip_mreqn mreq;
3861                 mreq.imr_address.s_addr = 0;
3862         ], [
3863                 # Yes, we have it...
3864                 AC_MSG_RESULT(yes)
3865                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3866         ], [
3867                 # We'll just have to try and use struct ip_mreq
3868                 AC_MSG_RESULT(no)
3869                 AC_MSG_CHECKING(for struct ip_mreq)
3870                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3871                         struct ip_mreq mreq;
3872                         mreq.imr_interface.s_addr = 0;
3873                 ], [
3874                         # Yes, we have it...
3875                         AC_MSG_RESULT(yes)
3876                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3877                 ], [
3878                         # No multicast support
3879                         AC_MSG_RESULT(no)
3880                 ])
3881         ])
3883         dnl **********************************
3884         dnl *** Check for getaddrinfo ***
3885         dnl **********************************
3886         AC_MSG_CHECKING(for getaddrinfo)
3887                 AC_TRY_LINK([
3888                 #include <stdio.h>
3889                 #include <winsock2.h>
3890                 #include <ws2tcpip.h>
3891         ], [
3892                 getaddrinfo(NULL,NULL,NULL,NULL);
3893         ], [
3894                 # Yes, we have it...
3895                 AC_MSG_RESULT(yes)
3896                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3897         ], [
3898                 AC_MSG_RESULT(no)
3899         ])
3901         dnl **********************************
3902         dnl *** Check for gethostbyname ***
3903         dnl **********************************
3904         AC_MSG_CHECKING(for gethostbyname)
3905                 AC_TRY_LINK([
3906                 #include <stdio.h>
3907                 #include <winsock2.h>
3908                 #include <ws2tcpip.h>
3909         ], [
3910                 gethostbyname(NULL);
3911         ], [
3912                 # Yes, we have it...
3913                 AC_MSG_RESULT(yes)
3914                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3915         ], [
3916                 AC_MSG_RESULT(no)
3917         ])
3919         dnl **********************************
3920         dnl *** Check for getprotobyname ***
3921         dnl **********************************
3922         AC_MSG_CHECKING(for getprotobyname)
3923                 AC_TRY_LINK([
3924                 #include <stdio.h>
3925                 #include <winsock2.h>
3926                 #include <ws2tcpip.h>
3927         ], [
3928                 getprotobyname(NULL);
3929         ], [
3930                 # Yes, we have it...
3931                 AC_MSG_RESULT(yes)
3932                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3933         ], [
3934                 AC_MSG_RESULT(no)
3935         ])
3937         dnl **********************************
3938         dnl *** Check for getnameinfo ***
3939         dnl **********************************
3940         AC_MSG_CHECKING(for getnameinfo)
3941                 AC_TRY_LINK([
3942                 #include <stdio.h>
3943                 #include <winsock2.h>
3944                 #include <ws2tcpip.h>
3945         ], [
3946                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3947         ], [
3948                 # Yes, we have it...
3949                 AC_MSG_RESULT(yes)
3950                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3951         ], [
3952                 AC_MSG_RESULT(no)
3953         ])
3955         dnl **********************************
3956         dnl *** Check for inet_ntop ***
3957         dnl **********************************
3958         AC_MSG_CHECKING(for inet_ntop)
3959                 AC_TRY_LINK([
3960                 #include <stdio.h>
3961                 #include <winsock2.h>
3962                 #include <ws2tcpip.h>
3963         ], [
3964                 inet_ntop (0, NULL, NULL, 0);
3965         ], [
3966                 # Yes, we have it...
3967                 AC_MSG_RESULT(yes)
3968                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3969         ], [
3970                 AC_MSG_RESULT(no)
3971         ])
3973         dnl **********************************
3974         dnl *** Check for inet_pton ***
3975         dnl **********************************
3976         AC_MSG_CHECKING(for inet_pton)
3977                 AC_TRY_LINK([
3978                 #include <stdio.h>
3979                 #include <winsock2.h>
3980                 #include <ws2tcpip.h>
3981         ], [
3982                 #ifndef inet_pton
3983                 (void) inet_pton;
3984                 #endif
3985                 inet_pton (0, NULL, NULL);
3986         ], [
3987                 # Yes, we have it...
3988                 AC_MSG_RESULT(yes)
3989                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3990         ], [
3991                 AC_MSG_RESULT(no)
3992         ])
3995 dnl socklen_t check
3996 AC_MSG_CHECKING(for socklen_t)
3997 AC_TRY_COMPILE([
3998 #include <sys/types.h>
3999 #include <sys/socket.h>
4001   socklen_t foo;
4003 ac_cv_c_socklen_t=yes
4004         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
4005         AC_MSG_RESULT(yes)
4007         AC_MSG_RESULT(no)
4010 AC_CHECK_FUNCS(execvp)
4012 dnl ****************************
4013 dnl *** Look for /dev/random ***
4014 dnl ****************************
4016 AC_MSG_CHECKING([if usage of random device is requested])
4017 AC_ARG_ENABLE(dev-random,
4018 [  --disable-dev-random    disable the use of the random device (enabled by default)],
4019 try_dev_random=$enableval, try_dev_random=yes)
4021 AC_MSG_RESULT($try_dev_random)
4023 case "{$build}" in
4025 dnl IBM i does not have /dev/random, use unblocking only
4027     *-*-os400*)
4028     NAME_DEV_RANDOM="/dev/urandom"
4029     ;;
4031 dnl Win32 does not have /dev/random, they have their own method...
4033     *-mingw*|*-*-cygwin*)
4034     ac_cv_have_dev_random=no
4035     ;;
4037 dnl Everywhere else, it's /dev/random
4039     *)
4040     NAME_DEV_RANDOM="/dev/random"
4041     ;;
4042 esac
4044 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
4046 dnl Now check if the device actually exists
4048 if test "x$try_dev_random" = "xyes"; then
4049     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
4050     [if test -r "$NAME_DEV_RANDOM" ; then
4051         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
4052     if test "x$ac_cv_have_dev_random" = "xyes"; then
4053         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
4054     fi
4055 else
4056     AC_MSG_CHECKING(for random device)
4057     ac_cv_have_dev_random=no
4058     AC_MSG_RESULT(has been disabled)
4061 if test "x$host_win32" = "xyes"; then
4062     AC_DEFINE(HAVE_CRYPT_RNG)
4065 if test "x$ac_cv_have_dev_random" = "xno" \
4066     && test "x$host_win32" = "xno"; then
4067     AC_MSG_WARN([[
4069 *** A system-provided entropy source was not found on this system.
4070 *** Because of this, the System.Security.Cryptography random number generator
4071 *** will throw a NotImplemented exception.
4073 *** If you are seeing this message, and you know your system DOES have an
4074 *** entropy collection in place, please report an issue on GitHub and
4075 *** provide information about the system and how to access the random device.
4077 *** Otherwise you can install either egd or prngd and set the environment
4078 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
4079 ***]])
4082 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)
4084 AC_MSG_CHECKING([if big-arrays are to be enabled])
4085 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)
4086 if test "x$enable_big_arrays" = "xyes" ; then
4087     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
4088         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
4089     else
4090         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
4091     fi
4093 AC_MSG_RESULT($enable_big_arrays)
4095 dnl **************
4096 dnl *** DTRACE ***
4097 dnl **************
4099 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
4101 if test "x$enable_dtrace" = "xyes"; then
4102    if test "x$has_dtrace" = "xno"; then
4103           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
4104    fi
4105    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
4106    if test "x$DTRACE" = "xno"; then
4107           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
4108           enable_dtrace=no
4109    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
4110           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
4111           enable_dtrace=no
4112    fi
4115 dtrace_g=no
4116 if test "x$enable_dtrace" = "xyes"; then
4117         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
4118         DTRACEFLAGS=
4119         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4120                 case "$host" in
4121                         powerpc-*-darwin*)
4122                         DTRACEFLAGS="-arch ppc64"
4123                         ;;
4124                         i*86-*-darwin*)
4125                         DTRACEFLAGS="-arch x86_64"
4126                         ;;
4127                         *)
4128                         DTRACEFLAGS=-64
4129                         ;;
4130                 esac
4131         else
4132                 case "$host" in
4133                         powerpc-*-darwin*)
4134                         DTRACEFLAGS="-arch ppc"
4135                         ;;
4136                         i*86-*-darwin*)
4137                         DTRACEFLAGS="-arch i386"
4138                         ;;
4139                         *)
4140                         DTRACEFLAGS=-32
4141                         ;;
4142                 esac
4143         fi
4144         AC_SUBST(DTRACEFLAGS)
4145         case "$host" in
4146                 *-*-solaris*)
4147                 dtrace_g=yes
4148                 ;;
4149         esac
4150         AC_CHECK_HEADERS([sys/sdt.h])
4152 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
4153 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
4155 dnl **************************
4156 dnl *** AOT cross offsets  ***
4157 dnl **************************
4159 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
4160     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
4162 dnl **************
4163 dnl ***  LLVM  ***
4164 dnl **************
4166 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
4167 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
4168 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)
4169 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
4170 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
4172 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
4174 if test "x$enable_llvm" = "xdefault"; then
4175    enable_llvm=$enable_llvm_default
4178 enable_llvm_msvc_only="no"
4179 if test "x$enable_llvm" = "xyes"; then
4180         if test "x$host_win32" = "xyes"; then
4181                 if test "x$cross_compiling" = "xno"; then
4182                         case "$target" in
4183                         x86_64*)
4184                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
4185                                 enable_llvm_msvc_only="yes"
4186                                 ;;
4187                         i686*)
4188                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
4189                                 ;;
4190                         esac
4191                 fi
4192                 if test "x$enable_loadedllvm" = "xyes"; then
4193                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
4194                         enable_loadedllvm=no
4195                 fi
4196         fi
4199 internal_llvm="no"
4200 if test "x$enable_llvm" = "xyes"; then
4201         if test "x$with_llvm" != "x"; then
4202                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
4203                 if test x$host_win32 = xyes; then
4204                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
4205                 fi
4206                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
4207                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
4208                 fi
4209         else
4210                 internal_llvm=yes
4211         fi
4213         LLVM_CODEGEN_LIBS="x86codegen"
4214         case "$target" in
4215         arm*)
4216                 LLVM_CODEGEN_LIBS="armcodegen"
4217                 ;;
4218         aarch64*)
4219                 LLVM_CODEGEN_LIBS="aarch64codegen"
4220                 ;;
4221         powerpc*)
4222                 LLVM_CODEGEN_LIBS="powerpccodegen"
4223                 ;;
4224         esac
4225         if test "x$host" != "x$target"; then
4226                 # No need for jit libs
4227                 LLVM_CODEGEN_LIBS=
4228         fi
4230         AC_SUBST(LLVM_CODEGEN_LIBS)
4231         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4233         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4234                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4235                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4236         fi
4237         if test "x$enable_llvm_msvc_only" != "xyes"; then
4238                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4239         else
4240                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4241         fi
4242 fi # ENABLE_LLVM
4244 # AC_DEFINE necessary for correct restore behavior on Linux
4245 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4246 if test "x$internal_llvm" != "xno"; then
4247         if test "x$enable_llvm_msvc_only" != "xyes"; then
4248                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4249         else
4250                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4251         fi
4254 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4255 if test "x$enable_llvm_asserts" != "xno"; then
4256         if test "x$enable_llvm_msvc_only" != "xyes"; then
4257                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4258         else
4259                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4260         fi
4263 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4265 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4266 if test "x$enable_loadedllvm" = "xyes"; then
4267         if test "x$enable_llvm_msvc_only" != "xyes"; then
4268                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4269         fi
4272 if test "x$enable_llvm" = "xyes"; then
4273         enable_llvm_runtime=yes
4276 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4277 if test "x$enable_llvm_runtime" = "xyes"; then
4278         if test "x$enable_llvm_msvc_only" != "xyes"; then
4279                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4280         else
4281                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4282         fi
4285 TARGET="unknown"
4286 ACCESS_UNALIGNED="yes"
4288 LIBC="libc.so.6"
4289 INTL="libc.so.6"
4290 SQLITE="libsqlite.so.0"
4291 SQLITE3="libsqlite3.so.0"
4292 ODBC="libodbc.so.2"
4293 X11="libX11.so"
4294 GDKX11="libgdk-x11-2.0.so.0"
4295 GTKX11="libgtk-x11-2.0.so.0"
4296 XINERAMA="libXinerama.so.1"
4298 sizeof_register="SIZEOF_VOID_P"
4300 jit_wanted=true
4301 boehm_supported=true
4302 BTLS_SUPPORTED=no
4303 BTLS_PLATFORM=
4304 INTERP_CFLAGS=""
4306 case "$host" in
4307         wasm32*)
4308                 TARGET=WASM
4309                 arch_target=wasm
4310                 BTLS_SUPPORTED=no
4311                 ACCESS_UNALIGNED="no"
4312                 with_tls=pthread
4313                 target_wasm=yes
4314                 if test "x$mono_cv_clang" = "xyes"; then
4315                    INTERP_CFLAGS="-mllvm -join-liveintervals=false"
4316                    AC_SUBST(INTERP_CFLAGS)
4317                 fi
4318                 ;;
4319         mips*)
4320                 TARGET=MIPS;
4321                 arch_target=mips;
4322                 with_tls=pthread;
4323                 ACCESS_UNALIGNED="no"
4325                 AC_MSG_CHECKING(for mips n32)
4326                 AC_TRY_COMPILE([],[
4327                 #if _MIPS_SIM != _ABIN32
4328                 #error Not mips n32
4329                 #endif
4330                 ],[
4331                 AC_MSG_RESULT(yes)
4332                 sizeof_register=8
4333                 ],[
4334                 AC_MSG_RESULT(no)
4335                 ])
4336                 ;;
4337         i*86-*-*)
4338                 TARGET=X86;
4339                 arch_target=x86;
4340                 case $host_os in
4341                   solaris*)
4342                         LIBC="libc.so"
4343                         INTL="libintl.so"
4344                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4345                                 TARGET=AMD64
4346                                 arch_target=amd64
4347                         fi
4349                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4350                         # int astruct __attribute__ ((visibility ("hidden")));
4351                         # void foo ()
4352                         # {
4353                         #       void *p = &astruct;
4354                         # }
4355                         # gcc -fPIC --shared -o libfoo.so foo.c
4356                         # yields:
4357                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4358                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4359                         have_visibility_hidden=no
4360                         ;;
4361                   mingw*|cygwin*)
4362                         have_visibility_hidden=no
4363                         BTLS_SUPPORTED=no
4364                         BTLS_PLATFORM=i386
4365                         ;;
4366                   haiku*)
4367                         LIBC=libroot.so
4368                         ;;
4369                   linux*)
4370                         AOT_SUPPORTED="yes"
4371                         BTLS_SUPPORTED=yes
4372                         BTLS_PLATFORM=i386
4373                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4374                         ;;
4375                   darwin*)
4376                         AOT_SUPPORTED="yes"
4377                         BTLS_SUPPORTED=yes
4378                         BTLS_PLATFORM=i386
4379                         ;;
4380                   openbsd*|freebsd*|kfreebsd-gnu*)
4381                         AOT_SUPPORTED="yes"
4382                         BTLS_SUPPORTED=yes
4383                         BTLS_PLATFORM=i386
4384                         ;;
4385                 esac
4386                 ;;
4387         x86_64-*-* | amd64-*-*)
4388                 TARGET=AMD64;
4389                 arch_target=amd64;
4390                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4391                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4392                         sizeof_register=8
4393                 fi
4394                 case $host_os in
4395                   linux*)
4396                         AOT_SUPPORTED="yes"
4397                         BTLS_SUPPORTED=yes
4398                         BTLS_PLATFORM=x86_64
4399                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4400                         ;;
4401                   darwin*)
4402                         AOT_SUPPORTED="yes"
4403                         BTLS_SUPPORTED=yes
4404                         BTLS_PLATFORM=x86_64
4405                         boehm_supported=false
4406                         ;;
4407                   openbsd*|freebsd*|kfreebsd-gnu*)
4408                         AOT_SUPPORTED="yes"
4409                         BTLS_SUPPORTED=yes
4410                         BTLS_PLATFORM=x86_64
4411                         ;;
4412                   mingw*|cygwin*)
4413                         BTLS_SUPPORTED=no
4414                         BTLS_PLATFORM=x86_64
4415                         ;;
4416                 esac
4417                 ;;
4418         sparc*-*-*)
4419                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4420                    TARGET=SPARC64
4421                 else
4422                         TARGET=SPARC
4423                 fi
4424                 arch_target=sparc;
4425                 ACCESS_UNALIGNED="no"
4426                 case $host_os in
4427                   linux*) ;;
4428                   *)
4429                         LIBC="libc.so"
4430                         INTL="libintl.so"
4431                 esac
4432                 if test x"$GCC" = xyes; then
4433                         # We don't support v8 cpus
4434                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4435                 fi
4436                 if test x"$AR" = xfalse; then
4437                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4438                 fi
4439                 ;;
4440         *-mingw*|*-*-cygwin*)
4441                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4442                 have_visibility_hidden=no
4443                 INTL="intl"
4444                 case "$host" in
4445                         x86_64*mingw*)
4446                                 # Old Boehm fails to compile for x86_64-mingw.
4447                                 # It is trivial to fix, but just silently drop it.
4448                                 boehm_supported=false
4449                                 ;;
4450                 esac
4451                 ;;
4452         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4453         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4454         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4455                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4456                         TARGET=POWERPC64;
4457                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4458                         if ! (echo $CC | grep -q -- 'clang'); then
4459                                 CFLAGS="$CFLAGS -mminimal-toc"
4460                         fi
4461                 else
4462                         TARGET=POWERPC;
4463                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4464                 fi
4465                 arch_target=ppc;
4466                 case $host_os in
4467                   aix*|os400*)
4468                         BTLS_SUPPORTED=yes
4469                         BTLS_PLATFORM=powerpc
4470                         ;;
4471                   linux*)
4472                         BTLS_SUPPORTED=yes
4473                         BTLS_PLATFORM=powerpc
4474                         ;;
4475                 esac
4476                 ;;
4477         armv7k-*-darwin*)
4478                 TARGET=ARM;
4479                 TARGET_SYS=WATCHOS
4480                 arch_target=arm;
4481                 arm_fpu=VFP_HARD
4482                 ACCESS_UNALIGNED="no"
4483                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4484                 ;;
4486         arm*-darwin*)
4487                 TARGET=ARM;
4488                 arch_target=arm;
4489                 ACCESS_UNALIGNED="no"
4490                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4491                 ;;
4492         arm*-linux*)
4493                 TARGET=ARM;
4494                 arch_target=arm;
4495                 ACCESS_UNALIGNED="no"
4496                 AOT_SUPPORTED="yes"
4497                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4498                 BTLS_SUPPORTED=yes
4499                 BTLS_PLATFORM=arm
4500                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4501                 case "$target" in
4502                 arm*-linux*-gnueabi)
4503                         BTLS_PLATFORM=armsoft
4504                         ;;
4505                 esac
4506                 ;;
4507         arm*-netbsd*-eabi*)
4508                 TARGET=ARM;
4509                 arch_target=arm;
4510                 ACCESS_UNALIGNED="no"
4511                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4512                 ;;
4513         aarch64-*darwin*ilp32)
4514                 TARGET=ARM6432
4515                 arch_target=arm64
4516                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4517                 sizeof_register=8
4518                 # assuming no other target other than watchOS is using aarch64*darwin triple
4519                 TARGET_SYS=WATCHOS
4520                 ;;
4521         aarch64-*)
4522                 # https://lkml.org/lkml/2012/7/15/133
4523                 TARGET=ARM64
4524                 arch_target=arm64
4525                 boehm_supported=false
4526                 AOT_SUPPORTED="yes"
4527                 BTLS_SUPPORTED=yes
4528                 BTLS_PLATFORM=aarch64
4529                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4530                 ;;
4531         s390x-*-linux*)
4532                 TARGET=S390X;
4533                 arch_target=s390x;
4534                 ACCESS_UNALIGNED="yes"
4535                 BTLS_SUPPORTED=yes
4536                 BTLS_PLATFORM=s390x
4537                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4538                 ;;
4539         riscv32-*)
4540                 TARGET=RISCV32
4541                 ACCESS_UNALIGNED=no
4542                 AOT_SUPPORTED=no
4543                 BTLS_SUPPORTED=yes
4544                 BTLS_PLATFORM=riscv32
4545                 arch_target=riscv32
4546                 boehm_supported=false
4547                 ;;
4548         riscv64*)
4549                 TARGET=RISCV64
4550                 ACCESS_UNALIGNED=no
4551                 AOT_SUPPORTED=no
4552                 BTLS_SUPPORTED=yes
4553                 BTLS_PLATFORM=riscv64
4554                 arch_target=riscv64
4555                 boehm_supported=false
4556                 ;;
4557 esac
4559 HOST=$TARGET
4561 if test "x$host" != "x$target"; then
4562    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4563    enable_mcs_build=no
4564    enable_support_build=no
4565    BTLS_SUPPORTED=no
4566    # Can't use tls, since it depends on the runtime detection of tls offsets
4567    # in mono-compiler.h
4568    with_tls=pthread
4569    target_mach=no
4570    case "$target" in
4571    wasm32*)
4572                 TARGET=WASM
4573                 arch_target=wasm
4574                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4575                 ;;
4576    arm*-darwin*)
4577                 TARGET=ARM;
4578                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4579                 case "$target" in
4580                 armv7k-*)
4581                         arm_fpu=VFP_HARD
4582                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4583                         ;;
4584                 esac            
4585                 ;;
4586    powerpc64-ps3-linux-gnu)
4587                 TARGET=POWERPC64
4588                 arch_target=powerpc64
4589                 AC_DEFINE(TARGET_PS3, 1, [...])
4590                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4591                 # uses this define
4592                 AC_DEFINE(__mono_ppc64__, 1, [...])
4593                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4594                 sizeof_register=8
4595                 target_byte_order=G_BIG_ENDIAN
4596                 ;;
4597    powerpc64-xbox360-linux-gnu)
4598                 TARGET=POWERPC64
4599                 arch_target=powerpc64
4600                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4601                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4602                 # uses this define
4603                 sizeof_register=8
4604                 target_byte_order=G_BIG_ENDIAN
4605                 ;;
4606    arm*-linux-*)
4607                 TARGET=ARM;
4608                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4609                 ;;
4610    arm*-netbsd*-eabi*)
4611                 TARGET=ARM;
4612                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4613                 ;;
4614    i686*-linux-*)
4615                 TARGET=X86;
4616                 ;;
4617    i*86-apple-*)
4618                 TARGET=X86;
4619                 ;;
4620    x86_64*-linux-*)
4621                 TARGET=AMD64;
4622                 ;;
4623    x86_64-ps4-freebsd)
4624                 TARGET=AMD64;
4625                 AC_DEFINE(TARGET_PS4, 1, [...])
4626                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4627                 CPPFLAGS="$CPPFLAGS"
4628                 target_win32=no
4629                 ;;
4630         aarch64*darwin*_ilp32)
4631                 TARGET=ARM6432;
4632                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4633                 sizeof_register=8
4634                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4635                 ;;
4636         aarch64-*)
4637                 TARGET=ARM64
4638                 ;;
4639         riscv32*)
4640                 TARGET=RISCV32
4641                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4642                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4643                 arch_target=riscv32
4644                 target_mach=no
4645                 with_tls=pthread
4646                 ;;
4647         riscv64*)
4648                 TARGET=RISCV64
4649                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4650                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4651                 arch_target=riscv64
4652                 target_mach=no
4653                 with_tls=pthread
4654                 ;;
4655         x86_64-google-fuchsia)
4656                 TARGET=AMD64
4657                 target_win32=nop
4658                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
4659                 ;;
4660         *)
4661                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4662         esac
4664         case "$target" in
4665         *-darwin*)
4666                 target_mach=yes
4667                 ;;
4668         *-linux-android*)
4669                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4670                 ;;
4671         esac
4674 case "$TARGET" in
4675 WASM)
4676         AC_DEFINE(TARGET_WASM, 1, [...])
4677         arch_target=wasm
4678         ;;
4679 X86)
4680         AC_DEFINE(TARGET_X86, 1, [...])
4681         arch_target=x86
4682         ;;
4683 AMD64)
4684         AC_DEFINE(TARGET_AMD64, 1, [...])
4685         arch_target=amd64
4686         ;;
4687 ARM)
4688         AC_DEFINE(TARGET_ARM, 1, [...])
4689         arch_target=arm
4690         ACCESS_UNALIGNED="no"
4691         ;;
4692 ARM64|ARM6432)
4693         AC_DEFINE(TARGET_ARM64, 1, [...])
4694         arch_target=arm64
4695         ;;
4696 POWERPC)
4697         AC_DEFINE(TARGET_POWERPC, 1, [...])
4698         ;;
4699 POWERPC64)
4700         AC_DEFINE(TARGET_POWERPC, 1, [...])
4701         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4702         ;;
4703 S390X)
4704         AC_DEFINE(TARGET_S390X, 1, [...])
4705         ;;
4706 MIPS)
4707         AC_DEFINE(TARGET_MIPS, 1, [...])
4708         ;;
4709 SPARC)
4710         AC_DEFINE(TARGET_SPARC, 1, [...])
4711         ;;
4712 SPARC64)
4713         AC_DEFINE(TARGET_SPARC64, 1, [...])
4714         ;;
4715 RISCV32)
4716         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4717         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4718         ;;
4719 RISCV64)
4720         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4721         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4722         ;;
4723 esac
4725 case "$TARGET" in
4726 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4727     target_sizeof_void_p=4
4728     ;;
4729 *64* | S390X)
4730     target_sizeof_void_p=8
4731     ;;
4733     AC_MSG_ERROR([unknown target])
4734     ;;
4735 esac
4737 case "$HOST" in
4738 WASM)
4739         AC_DEFINE(HOST_WASM, 1, [...])
4740         ;;
4741 X86)
4742         AC_DEFINE(HOST_X86, 1, [...])
4743         ;;
4744 AMD64)
4745         AC_DEFINE(HOST_AMD64, 1, [...])
4746         ;;
4747 ARM)
4748         AC_DEFINE(HOST_ARM, 1, [...])
4749         ;;
4750 ARM64)
4751         AC_DEFINE(HOST_ARM64, 1, [...])
4752         ;;
4753 POWERPC)
4754         AC_DEFINE(HOST_POWERPC, 1, [...])
4755         ;;
4756 POWERPC64)
4757         AC_DEFINE(HOST_POWERPC, 1, [...])
4758         AC_DEFINE(HOST_POWERPC64, 1, [...])
4759         ;;
4760 S390X)
4761         AC_DEFINE(HOST_S390X, 1, [...])
4762         ;;
4763 MIPS)
4764         AC_DEFINE(HOST_MIPS, 1, [...])
4765         ;;
4766 SPARC)
4767         AC_DEFINE(HOST_SPARC, 1, [...])
4768         ;;
4769 SPARC64)
4770         AC_DEFINE(HOST_SPARC64, 1, [...])
4771         ;;
4772 RISCV32)
4773         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4774         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4775         ;;
4776 RISCV64)
4777         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4778         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4779         ;;
4780 esac
4782 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4783 case "$HOST" in
4784 X86 | AMD64 | ARM | ARM64)
4785         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4786         ;;
4787 esac
4789 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4790 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4792 dnl *************
4793 dnl *** VTUNE ***
4794 dnl *************
4796 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4797 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4799 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4801 if test "x$enable_vtune" = "xyes"; then
4802         if test "x$with_vtune" = "x"; then
4803                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4804         else
4805                 VTUNE_PATH=$with_vtune
4806         fi
4807         VTUNE_INCLUDE=$VTUNE_PATH/include
4808         case "$TARGET" in
4809         X86)
4810                 VTUNE_LIB=$VTUNE_PATH/lib32
4811                 ;;
4812         AMD64)
4813                 VTUNE_LIB=$VTUNE_PATH/lib64
4814                 ;;
4815         *)
4816                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4817                 ;;
4818         esac
4819         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4820                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4821         fi
4822         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4823                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4824         fi
4826         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4827         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4829         AC_SUBST(VTUNE_LIBS)
4830         AC_SUBST(VTUNE_CFLAGS)
4832 dnl Use GCC atomic ops if they work on the target.
4833 if test x$GCC = "xyes"; then
4834         case $TARGET in
4835         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4836                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4837                 ;;
4838         esac
4841 if test "x$target_mach" = "xyes"; then
4843    if test "x$TARGET_SYS" = "xWATCHOS"; then
4844           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4845           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4846           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4847           BTLS_SUPPORTED=no
4848    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4849           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4850           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4851           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4852           BTLS_SUPPORTED=no
4853           target_ios=yes
4854    else
4855        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4856        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4857        #error fail this for ios
4858        #endif
4859        ], [
4860                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4861           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4862           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4863           target_osx=yes
4864        ], [
4865           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4866           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4867           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4868           BTLS_SUPPORTED=no
4869                   target_ios=yes
4870        ])
4871         fi
4872    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4875 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4877 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4879 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4880    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4881 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4882    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4883 else
4884    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4887 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4889 if test "x$sizeof_register" = "x4"; then
4890   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4891 elif test "x$sizeof_register" = "x8"; then
4892   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4893 else
4894   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4897 # zlib/configure detects visibility support similarly and defines HAVE_HIDDEN
4898 # on the compiler command line (not config.h).
4899 if test "x$have_visibility_hidden" = "xyes"; then
4900    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4901    ZLIB_CFLAGS="$ZLIB_CFLAGS -DHAVE_HIDDEN"
4904 if test "x$have_deprecated" = "xyes"; then
4905    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4908 dnl 
4909 dnl Simple Generational checks (sgen)
4911 SGEN_DEFINES=
4912 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4913 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4914 if test x$buildsgen = xyes; then
4915    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4916    SGEN_DEFINES="-DHAVE_SGEN_GC"
4918         conc_gc_msg=""
4919    if test x$with_sgen_default_concurrent != xno; then
4920        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4921            conc_gc_msg=" (concurrent by default)"
4922    fi
4924    if test "x$gc_msg" = "x"; then
4925       gc_msg="sgen$conc_gc_msg"
4926    else
4927       gc_msg="sgen$conc_gc_msg and $gc_msg"
4928    fi
4930 AC_SUBST(SGEN_DEFINES)
4931 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4933 jit_status="Building and using the JIT"
4935 libsuffix=".so"
4937 case "$host" in
4938      *-*-aix*)
4939         dnl on AIX/PASE, shared libraries can be and usually are inside archives
4940         dnl so, we specify them by libfoo.a(libfoo.so.0) for libtool's conventions,
4941         dnl or libfoo.a(shr[_64].o) for the AIX system convention,
4942         dnl or lib.so[.0](shr[_64].o) for libtool's hybrid convention
4943         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX
4944         LIBC="libc.a(shr_64.o)"
4945         # Thanks, I hate it! This is crumbly, especially the one-liner.
4946         AC_MSG_CHECKING([how to dlopen libintl])
4947         AC_LINK_IFELSE([AC_LANG_SOURCE([
4948                 /* XXX: Check for libintl header/gettext func better? */
4949                 #include <libintl.h>
4951                 int main (void) {
4952                         gettext("Dummy for autoconf");
4953                         return 1;
4954                 }
4955         ])],
4956         [
4957         INTL="$(dump -X64 -Hp conftest$EXEEXT | grep libintl | cut -c 38- | tr -s " " | awk '{print $1"("$2")"}')"
4958         AC_MSG_RESULT([yes, $INTL])
4959         ],
4960         [
4961         INTL="libintl.a(libintl.so.8)"
4962         AC_MSG_RESULT([no, falling back to $INTL])
4963         ])
4964         SQLITE3="libsqlite3.a(libsqlite3.so.0)"
4965         # it's very tempting to set a libsuffix, but it depends on the soname value
4966         ;;
4967      *-*-os400*)
4968         dnl However, IBM's packages for i try to be more "normal" than the AIX world, naming wise.
4969         dnl The library archives has "normal" .so names, but they're members with predictable "shr" names for fat libraries.
4970         LIBC="libc.a(shr_64.o)"
4971         INTL="libintl.so(shr_64.o)"
4972         SQLITE3="libsqlite3.so(shr_64.o)"
4973         # 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
4974         # it may be worth revisiting this in the future
4975         ;;
4976      *-*-darwin*)
4977         libsuffix=".dylib"
4978         LIBC="libc.dylib"
4979         INTL="libintl.dylib"
4980         SQLITE="libsqlite.0.dylib"
4981         SQLITE3="libsqlite3.0.dylib"
4982         X11="libX11.dylib"
4983         GDKX11="libgdk-x11-2.0.dylib"
4984         GTKX11="libgtk-x11-2.0.dylib"
4985         ;;
4986      *-*-*netbsd*)
4987         LIBC="libc.so"
4988         INTL="libintl.so"
4989         SQLITE="libsqlite.so"
4990         SQLITE3="libsqlite3.so"
4991         ;;
4992      *-*-kfreebsd*-gnu)
4993         LIBC="libc.so.0.1"
4994         INTL="libc.so.0.1"
4995         X11="libX11.so.6"
4996         ;;
4997     *-*-*freebsd*)
4998         LIBC="libc.so.7"
4999         INTL="libintl.so"
5000         SQLITE="libsqlite.so"
5001         SQLITE3="libsqlite3.so"
5002         ;;
5003     *-*-*openbsd*)
5004         LIBC="libc.so"
5005         INTL="libintl.so"
5006         SQLITE="libsqlite.so"
5007         SQLITE3="libsqlite3.so"
5008         ;;
5009     *-*-*linux*)
5010         AC_PATH_X
5011         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
5012         AC_MSG_CHECKING(for the soname of libX11.so)
5013         for i in $x_libraries $dlsearch_path; do
5014                 for r in 4 5 6; do
5015                         if test -f $i/libX11.so.$r; then
5016                                 X11=libX11.so.$r
5017                                 AC_MSG_RESULT($X11)
5018                         fi
5019                 done
5020         done
5021         
5022         if test "x$X11" = "xlibX11.so"; then
5023                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
5024                 X11=libX11.so.6
5025         fi
5026         ;;
5027 esac
5029 AC_SUBST(libsuffix)
5031 ######################################
5032 # EGLIB CHECKS
5033 ######################################
5035 GNUC_PRETTY=
5036 GNUC_UNUSED=
5037 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
5038 if test x$GCC = xyes; then
5039    GNUC_UNUSED='__attribute__((__unused__))'
5040    GNUC_NORETURN='__attribute__((__noreturn__))'
5041    case $host_cpu in
5042      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
5043    esac
5045 AC_SUBST(GNUC_PRETTY)
5046 AC_SUBST(GNUC_UNUSED)
5047 AC_SUBST(GNUC_NORETURN)
5048 AC_SUBST(BREAKPOINT)
5050 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
5052 case $host in
5053 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
5054     PATHSEP='\\'
5055     SEARCHSEP=';'
5056     OS="WIN32"
5057     PIDTYPE='void *'
5058     ;;
5060     PATHSEP='/'
5061     SEARCHSEP=':'
5062     OS="UNIX"
5063     PIDTYPE='int'
5064     ;;
5065 esac
5067 case $host in
5068         *-*-solaris*)
5069         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
5070         ;;
5071 esac
5073 case $target in
5074 arm*-darwin*|aarch64*-*|riscv*)
5075     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
5076     ;;
5077 i*86-*-darwin*)
5078     ORDER=G_LITTLE_ENDIAN
5079     ;;
5080 *-*-haiku*)
5081     LDFLAGS="$LDFLAGS -ltextencoding"
5082     ;;
5083 *-*-openbsd*)
5084     CFLAGS="$CFLAGS -pthread"
5085     LDFLAGS="$LDFLAGS -pthread"
5086     ;;
5087 esac
5089 AC_SUBST(ORDER)
5090 AC_SUBST(PATHSEP)
5091 AC_SUBST(SEARCHSEP)
5092 AC_SUBST(OS)
5093 AC_SUBST(PIDTYPE)
5095 # Defined for all targets/platforms using classic Windows API support.
5096 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
5097 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
5099 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
5100 AC_CHECK_FUNCS(getrlimit)
5101 AC_CHECK_FUNCS(fork execv execve)
5102 AC_CHECK_FUNCS(waitpid)
5104 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
5106 if test x$with_overridable_allocators = xyes; then
5107         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5108   AC_MSG_NOTICE([Overridable allocator support enabled])
5109 else
5110   AC_MSG_NOTICE([Overridable allocator support disabled])
5114 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
5115 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
5116 # removed once support for 10.6 is dropped.
5118 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
5120 if test x$target_osx = xyes; then
5121 AC_CHECK_FUNCS(getpwuid_r)
5122 elif test x$target_ios = xno; then
5123 AC_CHECK_FUNCS(strndup getpwuid_r)
5126 AC_SEARCH_LIBS(sqrtf, m)
5128 # nanosleep may not be part of libc, also search it in other libraries
5129 AC_SEARCH_LIBS(nanosleep, rt)
5131 AC_SEARCH_LIBS(dlopen, dl)
5133 # AIX/OS400 -bsymbolic
5134 # Apple -bind_at_load
5135 # The rest GNU.
5137 export_link_flags=--export-dynamic
5138 case $host_os in
5139         mingw*|cygwin*)
5140         export_link_flags=--export-all-symbols
5141 esac
5142 AX_APPEND_LINK_FLAGS([-Wl,$export_link_flags -Wl,-Bsymbolic -bsymbolic -Wl,-z,now -Wl,-bind_at_load])
5144 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
5145 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
5146 AC_CHECK_LIB(iconv, iconv_open)
5147 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
5148 AC_SUBST(HAVE_ALLOCA_H)
5150 # Get the exact type of size_t, not just its size.
5151 # This is so we can find an exact printf format among u, lu, llu, I64u.
5152 # To avoid warnings about slight mismatches.
5153 # C99 runtime "zu" dependency is being avoided here.
5155 # We have to compile as C++ because C is too lenient
5156 # and lets the wrong thing compile, with warnings.
5158 # Note: "zu" or ifdef <something> have the advantage
5159 # of producing installable "biarch" headers. i.e. one Mac header
5160 # for Mac/x86 and Mac/amd64.
5162 AC_LANG_PUSH(C++)
5164 # Check long before int because it is the overwhelming Unix answer,
5165 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
5167 # long ahead of int also tends to produce biarch-compatible headers except Windows.
5169 AC_MSG_CHECKING(if size_t is unsigned long)
5170 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5171         #include <stddef.h>
5172         unsigned long *a = (size_t*)0;
5173 ])], [
5174         AC_MSG_RESULT(yes)
5175         AC_SUBST(GSIZE_FORMAT, '"lu"')
5176 ], [
5177         AC_MSG_RESULT(no)
5178         AC_MSG_CHECKING(if size_t is unsigned int)
5179         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5180                 #include <stddef.h>
5181                 unsigned *a = (size_t*)0;
5182         ])], [
5183                 AC_MSG_RESULT(yes)
5184                 AC_SUBST(GSIZE_FORMAT, '"u"')
5185         ], [
5186 # At this point the majority of systems have their answer,
5187 # and we descend into non-standard or new-standard territory.
5189 # Check __int64 first because I64 on some systems predates ll, enabling
5190 # new compiler/old runtime interop, and the types always have the same size.
5191                 AC_MSG_RESULT(no)
5192                 AC_MSG_CHECKING(if size_t is unsigned __int64)
5193                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5194                         #include <stddef.h>
5195                         unsigned __int64 *a = (size_t*)0;
5196                 ])], [
5197                         AC_MSG_RESULT(yes)
5198                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
5199                 ], [
5200                         AC_MSG_RESULT(no)
5201                         AC_MSG_CHECKING(if size_t is unsigned long long)
5202                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5203                                 #include <stddef.h>
5204                                 unsigned long long *a = (size_t*)0;
5205                         ])], [
5206                                 AC_MSG_RESULT(yes)
5207                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
5208                         ], [
5209                                 AC_MSG_RESULT(no)
5210                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
5211                         ] )
5212                 ] )
5213         ] )
5214 ] )
5216 AC_LANG_POP
5218 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
5219 # This provides for an exact match with functions that
5220 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
5221 # uintptr_t is not necessarily the same.
5223 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
5224 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
5226 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
5227    GSIZE="size_t"
5228    GSSIZE="ptrdiff_t"
5229 else
5230    GSIZE="uintptr_t"
5231    GSSIZE="intptr_t"
5234 AC_SUBST(GSIZE)
5235 AC_SUBST(GSSIZE)
5236 AC_SUBST(GSIZE_FORMAT)
5239 # END OF EGLIB CHECKS
5242 AC_ARG_WITH([libgdiplus],
5243         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
5244         [], [with_libgdiplus=installed])
5246 # default install location
5247 libgdiplus_install_loc=libgdiplus${libsuffix}
5248 case "$host" in
5249     *-*-*linux*)
5250     libgdiplus_install_loc=libgdiplus${libsuffix}.0
5251     ;;
5252 esac
5254 case $with_libgdiplus in
5255     no)
5256     libgdiplus_loc=
5257     ;;
5259     installed)
5260     libgdiplus_loc=
5261     if test x$cross_compiling = xno; then
5262         if test x$host_darwin = xyes; then
5263             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
5264             if test -x $a; then
5265               libgdiplus_install_loc=$a
5266               libgdiplus_loc=$a
5267             fi
5268         fi
5269     fi
5270     ;;
5272     yes|sibling)
5273     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5274     ;;
5276     /*) # absolute path, assume it is an install location
5277     libgdiplus_loc=$with_libgdiplus
5278     libgdiplus_install_loc=$with_libgdiplus
5279     ;;
5281     *)
5282     libgdiplus_loc=`pwd`/$with_libgdiplus
5283     ;;
5284 esac
5285 AC_SUBST(libgdiplus_loc)
5286 AC_SUBST(libgdiplus_install_loc)
5288 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)
5289 if test "x$icall_symbol_map" = "xyes"; then
5290    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5293 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5294 if test "x$icall_export" = "xyes"; then
5295    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5298 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5299 if test "x$icall_tables" = "xno"; then
5300    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5303 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5305 if test "x$with_tls" = "x__thread"; then
5306         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5307         # Pass the information to libgc
5308         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5309         AC_MSG_CHECKING(if the tls_model attribute is supported)
5310         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5311                 ], [
5312                         AC_MSG_RESULT(yes)
5313                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5314                 ], [
5315                         AC_MSG_RESULT(no)
5316         ])
5319 if test ${TARGET} = ARM; then
5320         dnl ******************************************
5321         dnl *** Check to see what FPU is available ***
5322         dnl ******************************************
5323         AC_MSG_CHECKING(which FPU to use)
5325         #
5326         # This is a bit tricky:
5327         #
5328         # if (__ARM_PCS_VFP) {
5329         #       /* mfloat-abi=hard == VFP with hard ABI */
5330         # } elif (!__SOFTFP__) {
5331         #       /* mfloat-abi=softfp == VFP with soft ABI */
5332         # } else {
5333         #       /* mfloat-abi=soft == no VFP */
5334         # }
5335         #
5336         # The exception is iOS (w/ GCC) where none of the above
5337         # are defined (but iOS always uses the 'softfp' ABI).
5338         #
5339         # No support for FPA.
5340         #
5342         fpu=NONE
5344         # iOS GCC always uses the 'softfp' ABI.
5345         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5346                 fpu=VFP
5347         fi
5349         # Are we using the 'hard' ABI?
5350         if test x$fpu = xNONE; then
5351                 AC_TRY_COMPILE([], [
5352                         #ifndef __ARM_PCS_VFP
5353                         #error "Float ABI is not 'hard'"
5354                         #endif
5355                 ], [
5356                         fpu=VFP_HARD
5357                 ], [
5358                         fpu=NONE
5359                 ])
5360         fi
5362         # No 'hard' ABI. 'soft' or 'softfp'?
5363         if test x$fpu = xNONE; then
5364                 AC_TRY_COMPILE([], [
5365                         #ifdef __SOFTFP__
5366                         #error "Float ABI is not 'softfp'"
5367                         #endif
5368                 ], [
5369                         fpu=VFP
5370                 ], [
5371                         fpu=NONE
5372                 ])
5373         fi
5375         if test x$arm_fpu != x; then
5376            fpu=$arm_fpu
5377         fi
5379         AC_MSG_RESULT($fpu)
5380         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5381         unset fpu
5383         dnl *********************************************
5384         dnl *** Check which ARM version(s) we can use ***
5385         dnl *********************************************
5386         AC_MSG_CHECKING(which ARM version to use)
5388         AC_TRY_COMPILE([], [
5389                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5390                 #error Not on ARM v5.
5391                 #endif
5392         ], [
5393                 arm_v5=yes
5395                 arm_ver=ARMv5
5396         ], [])
5398         AC_TRY_COMPILE([], [
5399                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5400                 #error Not on ARM v6.
5401                 #endif
5402         ], [
5403                 arm_v5=yes
5404                 arm_v6=yes
5406                 arm_ver=ARMv6
5407         ], [])
5409         AC_TRY_COMPILE([], [
5410                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5411                 #error Not on ARM v7.
5412                 #endif
5413         ], [
5414                 arm_v5=yes
5415                 arm_v6=yes
5416                 arm_v7=yes
5418                 arm_ver=ARMv7
5419         ], [])
5421         AC_MSG_RESULT($arm_ver)
5423         if test x$arm_v5 = xyes; then
5424                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5425                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5426         fi
5428         if test x$arm_v6 = xyes; then
5429                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5430                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5431         fi
5433         if test x$arm_v7 = xyes; then
5434                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5435                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5436         fi
5438         if test x$host_linux = xyes; then
5439                 RID="linux-arm"
5440                 COREARCH="arm"
5441                 if test x$fpu = xNONE; then
5442                         RID="linux-armel"
5443                         COREARCH="armel"
5444                 fi
5445         fi
5448 AC_SUBST(RID)
5449 AC_SUBST(COREARCH)
5450 AC_SUBST(CORETARGETS)
5452 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5453         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5455         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5457         if test x$fpabi = xauto; then
5458                 AC_TRY_COMPILE([], [
5459                         #ifdef __riscv_float_abi_double
5460                         #error "double"
5461                         #endif
5462                 ], [
5463                         fpabi=auto
5464                 ], [
5465                         fpabi=double
5466                 ])
5467         fi
5469         if test x$fpabi = xauto; then
5470                 AC_TRY_COMPILE([], [
5471                         #ifdef __riscv_float_abi_single
5472                         #error "single"
5473                         #endif
5474                 ], [
5475                         fpabi=auto
5476                 ], [
5477                         fpabi=single
5478                 ])
5479         fi
5481         if test x$fpabi = xauto; then
5482                 AC_TRY_COMPILE([], [
5483                         #ifdef __riscv_float_abi_soft
5484                         #error "soft"
5485                         #endif
5486                 ], [
5487                         fpabi=auto
5488                 ], [
5489                         fpabi=soft
5490                 ])
5491         fi
5493         case $fpabi in
5494         double)
5495                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5496                 AC_MSG_RESULT([double-precision])
5497                 ;;
5498         single)
5499                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5500                 AC_MSG_ERROR([single-precision, not supported])
5501                 ;;
5502         soft)
5503                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5504                 AC_MSG_RESULT([soft float])
5505                 ;;
5506         auto)
5507                 AC_MSG_ERROR([unknown])
5508                 ;;
5509         *)
5510                 AC_MSG_ERROR([invalid option: $fpabi])
5511                 ;;
5512         esac
5515 if test ${TARGET} = unknown; then
5516         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5517         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5520 if test "x$platform_android" = "xyes"; then
5521         case "x${TARGET}" in
5522         xARM)
5523                 case "x$arm_ver" in
5524                 xARMv5)
5525                         BTLS_SUPPORTED=yes
5526                         BTLS_PLATFORM=android-armv5
5527                         ;;
5528                 xARMv6)
5529                         BTLS_SUPPORTED=yes
5530                         BTLS_PLATFORM=android-armv6
5531                         ;;
5532                 xARMv7)
5533                         BTLS_SUPPORTED=yes
5534                         BTLS_PLATFORM=android-armv7
5535                         ;;
5536                 *)
5537                         BTLS_SUPPORTED=no
5538                         ;;
5539                 esac
5540                 ;;
5541         xARM64)
5542                 BTLS_SUPPORTED=yes
5543                 BTLS_PLATFORM=android-v8a
5544                 ;;
5545         xX86)
5546                 BTLS_SUPPORTED=yes
5547                 BTLS_PLATFORM=android-x86
5548                 ;;
5549         xAMD64)
5550                 BTLS_SUPPORTED=yes
5551                 BTLS_PLATFORM=android-x64
5552                 ;;
5553         *)
5554                 BTLS_SUPPORTED=no
5555                 ;;
5556         esac
5559 if test ${ACCESS_UNALIGNED} = no; then
5560         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5563 if test x$host_darwin = xyes; then
5564         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5565         AS_IF(
5566                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5567                 [AC_MSG_RESULT([no])],
5568                 [
5569                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5570                         AR_FLAGS="Scru"
5571                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5572                         AC_MSG_RESULT([yes])
5573                 ]
5574         )
5577 case "x$libgc" in
5578         xincluded)
5579                 # Pass CPPFLAGS to libgc configure
5580                 # We should use a separate variable for this to avoid passing useless and
5581                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5582                 # This should be executed late so we pick up the final version of CPPFLAGS
5583                 # The problem with this approach, is that during a reconfigure, the main
5584                 # configure scripts gets invoked with these arguments, so we use separate
5585                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5586                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5587                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5588                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5589                 fi
5590                 # Don't pass -finstrument-for-thread-suspension in, 
5591                 # if these are instrumented it will be very bad news 
5592                 # (infinite recursion, undefined parking behavior, etc)
5593                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5594                 ac_configure_args="$ac_configure_args --enable-single-obj-compilation --disable-embed-check --with-libgc-threads=$libgc_threads $libgc_configure_args \"CPPFLAGS_FOR_LIBGC=$TMP_CPPFLAGS\" \"CFLAGS_FOR_LIBGC=$CFLAGS_FOR_LIBGC\""
5595                 if test "x$support_boehm" = "xyes"; then
5596                         AC_CONFIG_SUBDIRS(external/bdwgc)
5597                 fi
5598                 ;;
5599 esac
5601 MALLOC_MEMPOOLS=no
5602 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5603         if test x$with_malloc_mempools = xyes; then
5604                 MALLOC_MEMPOOLS=yes
5605                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5606         fi
5610 DISABLE_MCS_DOCS=default
5611 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5612         if test x$with_mcs_docs != xyes; then
5613                 DISABLE_MCS_DOCS=yes
5614         fi
5616 if test -n "$INSTALL_4_x_TRUE"; then :
5617         DISABLE_MCS_DOCS=yes
5619 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5620    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5623 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)],[
5624         if test x$with_lazy_gc_thread_creation != xno ; then
5625                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5626         fi
5627 ], [with_lazy_gc_thread_creation=no])
5629 dnl *****************************
5630 dnl *** Thread suspend policy ***
5631 dnl *****************************
5633 dnl Set a default hybrid or cooperative suspend on some platforms
5635 dnl Coop default is set by the bitcode preset.
5637 dnl If coop isn't on by default, maybe hybrid should be?
5638 if test x$enable_cooperative_suspend_default != xyes; then
5639         case $HOST in
5640         X86 | AMD64)
5641                 dnl Some host/target confusion, there's no host_osx (and
5642                 dnl host_darwin would be true on iOS not just macOS).
5643                 if test x$target_osx = xyes; then
5644                         enable_hybrid_suspend_default=yes
5645                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5646                         enable_hybrid_suspend_default=yes
5647                 fi
5648                 ;;
5649         esac
5652 dnl Now check if there were flags overriding the defaults
5654 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])
5655 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5657 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5658         enable_cooperative_suspend=$with_cooperative_gc
5661 if test x$enable_cooperative_suspend = xdefault; then
5662         enable_cooperative_suspend=$enable_cooperative_suspend_default
5665 if test x$enable_cooperative_suspend != xno; then
5666         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5667         enable_hybrid_suspend_default=no
5670 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5672 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])
5674 if test x$enable_hybrid_suspend = xdefault; then
5675    enable_hybrid_suspend=$enable_hybrid_suspend_default
5678 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5679         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5682 if test x$enable_hybrid_suspend != xno ; then
5683         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5686 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5688 dnl End of thread suspend policy
5690 dnl ***************************
5691 dnl *** feature experiments ***
5692 dnl ***************************
5694 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5695 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null,tiered],[
5697         if test x$enable_experiment != x ; then
5698                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5699         fi
5700         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5701                 eval "mono_experiment_test_enable_$feature='yes'"
5702         done
5704         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5705                 eval "mono_experiment_test_enable_null='yes'"
5706                 eval "mono_experiment_test_enable_tiered='yes'"
5707                 true
5708         fi
5710         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5711                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5712         fi
5713         if test "x$mono_experiment_test_enable_tiered" = "xyes"; then
5714                 AC_DEFINE(ENABLE_EXPERIMENT_TIERED, 1, [Enable experiment 'Tiered Compilation'])
5715         fi
5716 ],[])
5718 AM_CONDITIONAL(ENABLE_EXPERIMENT_TIERED, test x$mono_experiment_test_enable_tiered = xyes)
5720 dnl **********************
5721 dnl *** checked builds ***
5722 dnl **********************
5724 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],[
5726         if test x$enable_checked_build != x ; then
5727                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5728         fi
5729         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5730                 eval "mono_checked_build_test_enable_$feature='yes'"
5731         done
5733         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5734                 eval "mono_checked_build_test_enable_gc='yes'"
5735                 eval "mono_checked_build_test_enable_metadata='yes'"
5736                 eval "mono_checked_build_test_enable_thread='yes'"
5737                 eval "mono_checked_build_test_enable_private_types='yes'"
5738                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5739         fi
5741         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5742                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5743         fi
5745         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5746                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5747         fi
5749         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5750                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5751         fi
5753         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5754                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5755         fi
5757         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5758                 # Required
5759                 with_overridable_allocators=yes
5760                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5762                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5763         fi
5764 ], [])
5766 dnl End of checked builds
5768 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5770 AC_CHECK_HEADER([malloc.h], 
5771                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5772                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5774 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5775 # instead of libmono-static.a
5776 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5777    LIBMONO_LA=libmini-static.la
5778 else
5779    if test x$buildsgen = xyes; then
5780       LIBMONO_LA=libmonosgen-$API_VER.la
5781    else
5782       LIBMONO_LA=libmonoboehm-$API_VER.la
5783    fi
5785 AC_SUBST(LIBMONO_LA)
5787 dnl **************
5788 dnl ***  Btls  ***
5789 dnl **************
5791 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5792 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5793 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5794 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5795 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5796 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])
5798 if test "x$with_btls_android_api" = "x" ; then
5799         case "$BTLS_PLATFORM" in
5800                 android-armv5)
5801                         with_btls_android_api=16" ;;
5802                 android-armv6)
5803                         with_btls_android_api=16" ;;
5804                 android-armv7)
5805                         with_btls_android_api=16 ;;
5806                 android-v8a)
5807                         with_btls_android_api=21 ;;
5808                 android-x86)
5809                         with_btls_android_api=16 ;;
5810                 android-x64)
5811                         with_btls_android_api=21 ;;
5812         esac
5815 if test "x$enable_btls" = "xno"; then
5816    enable_btls_lib=no
5819 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5821 btls_android=no
5822 if test "x$enable_btls" = "xyes"; then
5823         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5824         if test "x$CMAKE" = "xno"; then
5825                 AC_MSG_ERROR("cmake not found")
5826         fi
5828         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5829         AC_SUBST(BTLS_ROOT)
5831         btls_arch=
5832         btls_cflags=
5833         BTLS_CMAKE_ARGS=
5835         if test "x$host_win32" = "xyes"; then
5836                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5837         fi
5839         case "$BTLS_PLATFORM" in
5840         i386)
5841                 btls_arch=i386
5842                 btls_cflags="-m32"
5843                 case $host_os in
5844                         darwin*)
5845                                 btls_cflags="$btls_cflags -arch i386"
5846                                 ;;
5847                         mingw*|cygwin*)
5848                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5849                                 if test "x$HAVE_YASM" != "xyes"; then
5850                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5851                                 fi
5852                                 ;;
5853                 esac
5854                 ;;
5855         x86_64)
5856                 btls_arch=x86_64
5857                 case $host_os in
5858                         mingw*|cygwin*)
5859                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5860                                 if test "x$HAVE_YASM" != "xyes"; then
5861                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5862                                 fi
5863                                 ;;
5864                 esac
5865                 ;;
5866         arm)
5867                 btls_arch=arm
5868                 btls_cflags="-DOPENSSL_NO_ASM=1"
5869                 ;;
5870         armsoft)
5871                 btls_arch=arm
5872                 btls_cflags="-DOPENSSL_NO_ASM=1"
5873                 ;;
5874         aarch64)
5875                 btls_arch=aarch64
5876                 btls_cflags="-march=armv8-a+crypto"
5877                 ;;
5878         s390x)
5879                 btls_arch=s390x
5880                 ;;
5881         powerpc)
5882                 btls_arch=powerpc
5883                 case $host_os in
5884                         aix*|os400*)
5885                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5886                                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5887                 esac
5888                 ;;
5889         android-armv5)
5890                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5891                 ;;
5892         android-armv6)
5893                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5894                 ;;
5895         android-armv7)
5896                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5897                 ;;
5898         android-v8a)
5899                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5900                 ;;
5901         android-x86)
5902                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5903                 ;;
5904         android-x64)
5905                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5906                 ;;
5907         riscv32)
5908                 btls_arch=riscv32
5909                 ;;
5910         riscv64)
5911                 btls_arch=riscv64
5912                 ;;
5913         *)
5914                 AC_MSG_ERROR(Invalid BTLS platform)
5915         esac
5917         if test "x$platform_android" = "xyes"; then
5918                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5919                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5920                 fi
5922                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5923                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5924                 fi
5926                 btls_android=yes
5927                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5928                 if test "x$with_btls_android_ndk" != "x"; then
5929                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5930                 else
5931                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5932                 fi
5933         fi
5935         if test "x$btls_arch" != "x"; then
5936                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5937         fi
5939         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5940         AC_SUBST(BTLS_ARCH)
5941         AC_SUBST(BTLS_CFLAGS)
5942         AC_SUBST(BTLS_PLATFORM)
5943         AC_SUBST(BTLS_CMAKE_ARGS)
5945         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5946 else
5947         enable_btls=no
5950 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5952 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5953 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5954 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5956 libmono_ldflags="$libmono_ldflags $LIBS"
5958 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5959 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5960 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5961 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5962 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5963 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5964 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5965 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5966 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5967 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5968 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5969 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5970 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5971 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5972 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5973 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5974 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5975 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5976 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5977 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5978 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5979 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5980 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5981 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5983 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5985 AC_SUBST(LIBC)
5986 AC_SUBST(INTL)
5987 AC_SUBST(SQLITE)
5988 AC_SUBST(SQLITE3)
5989 AC_SUBST(ODBC)
5990 AC_SUBST(X11)
5991 AC_SUBST(GDKX11)
5992 AC_SUBST(GTKX11)
5993 AC_SUBST(XINERAMA)
5994 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5995 AC_SUBST(arch_target)
5997 #This must always be defined when building the runtime
5998 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
6000 mono_build_root=`pwd`
6001 AC_SUBST(mono_build_root)
6003 AC_ARG_ENABLE(msvc_only,[  --enable-msvc-only    Build only with Visual Studio (msvc) (defaults to no). Disable gcc build.], enable_msvc_only=$enableval, enable_msvc_only=no)
6004 if test x$host_win32 = xno; then
6005         if test x$enable_msvc_only = xyes; then
6006                 echo "Error, --enable-msvc-only only supported for Windows builds."
6007                 exit 1
6008         fi
6010 AM_CONDITIONAL(ENABLE_MSVC_ONLY, test x$enable_msvc_only = xyes)
6012 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
6013 if test x$host_win32 = xno; then
6014         if test x$enable_msvc = xyes; then
6015                 echo "Error, --enable-msvc only supported for Windows builds."
6016                 exit 1
6017         fi
6019 if test x$enable_msvc_only = xyes; then
6020         enable_msvc=yes
6022 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
6024 if test "x$enable_msvc" = "xyes"; then
6025         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
6026         if test "x$host_cpu" = "xi686"; then
6027                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
6028                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
6029                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
6030                 mono_runtime_wrapper=$mono_runtime
6031         else
6032                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
6033                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
6034                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
6035                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
6036         fi
6037         AC_SUBST(mono_msvc_build_dir)
6038         AC_SUBST(mono_msvc_build_lib_dir)
6039         AC_SUBST(mono_msvc_build_bin_dir)
6040 else
6041         mono_runtime=mono/mini/mono
6042         mono_runtime_wrapper=$mono_runtime
6045 AC_SUBST(mono_runtime)
6046 AC_SUBST(mono_runtime_wrapper)
6048 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.5.0/csc.exe
6049 VBCS_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.5.0/VBCSCompiler.exe
6051 if test $csc_compiler = mcs; then
6052   CSC=$mcs_topdir/class/lib/build/mcs.exe
6053 else
6054   CSC=$CSC_LOCATION
6057 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
6059 mono_cfg_root=$mono_build_root/runtime
6060 if test x$host_win32 = xyes; then
6061   if test "x$cross_compiling" = "xno"; then
6062     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
6063     CSC=`cygpath -m -a $CSC`
6064     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
6065     VBCS_LOCATION=`cygpath -m -a $VBCS_LOCATION`
6066   else
6067     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
6068   fi
6069 else
6070   mono_cfg_dir=$mono_cfg_root/etc
6073 if test "x$platform_android" = "xyes"; then
6074   mono_cfg_dir=
6077 AC_SUBST(mono_cfg_dir)
6079 AC_SUBST(CSC)
6081 if test "x$with_core" != "xonly"; then
6083         AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
6084         [   depth=../../../..
6085                 case $srcdir in
6086                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6087                 .) reldir=$depth ;;
6088                 *) reldir=$depth/$srcdir ;;
6089                 esac
6090                 $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
6091                 cd runtime/etc/mono/1.0
6092                 rm -f machine.config
6093                 $LN_S $reldir/data/net_1_1/machine.config machine.config
6094                 cd $depth
6095         ],[LN_S='$LN_S'])
6097         AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
6098         [   depth=../../../..
6099                 case $srcdir in
6100                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6101                 .) reldir=$depth ;;
6102                 *) reldir=$depth/$srcdir ;;
6103                 esac
6104                 $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6105                 cd runtime/etc/mono/2.0
6106                 rm -f machine.config
6107                 $LN_S $reldir/data/net_2_0/machine.config machine.config
6108                 cd $depth
6109         ],[LN_S='$LN_S'])
6111         AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
6112         [   depth=../../../..
6113                 case $srcdir in
6114                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6115                 .) reldir=$depth ;;
6116                 *) reldir=$depth/$srcdir ;;
6117                 esac
6118                 $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6119                 cd runtime/etc/mono/2.0
6120                 rm -f web.config
6121                 $LN_S $reldir/data/net_2_0/web.config web.config
6122                 cd $depth
6123         ],[LN_S='$LN_S'])
6125         AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
6126         [   depth=../../..
6127                 case $srcdir in
6128                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6129                 .) reldir=$depth ;;
6130                 *) reldir=$depth/$srcdir ;;
6131                 esac
6132                 $ac_aux_dir/install-sh -d runtime/etc/mono/
6133                 cd runtime/etc/mono/
6134                 rm -f browscap.ini
6135                 $LN_S $reldir/data/browscap.ini browscap.ini
6136                 cd $depth
6137         ],[LN_S='$LN_S'])
6139         AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
6140         [   depth=../../../../..
6141                 case $srcdir in
6142                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6143                 .) reldir=$depth ;;
6144                 *) reldir=$depth/$srcdir ;;
6145                 esac
6146                 $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
6147                 cd runtime/etc/mono/2.0/Browsers
6148                 rm -f Compat.browser
6149                 $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6150                 cd $depth
6151         ],[LN_S='$LN_S'])
6153         AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
6154         [   depth=../../../../..
6155                 case $srcdir in
6156                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6157                 .) reldir=$depth ;;
6158                 *) reldir=$depth/$srcdir ;;
6159                 esac
6160                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
6161                 cd runtime/etc/mono/4.0/Browsers
6162                 rm -f Compat.browser
6163                 $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6164                 cd $depth
6165         ],[LN_S='$LN_S'])
6167         AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
6168         [   depth=../../../../..
6169                 case $srcdir in
6170                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6171                 .) reldir=$depth ;;
6172                 *) reldir=$depth/$srcdir ;;
6173                 esac
6174                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
6175                 cd runtime/etc/mono/4.5/Browsers
6176                 rm -f Compat.browser
6177                 $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6178                 cd $depth
6179         ],[LN_S='$LN_S'])
6181         AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
6182         [   depth=../../../..
6183                 case $srcdir in
6184                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6185                 .) reldir=$depth ;;
6186                 *) reldir=$depth/$srcdir ;;
6187                 esac
6188                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6189                 cd runtime/etc/mono/4.0
6190                 rm -f machine.config
6191                 $LN_S $reldir/data/net_4_0/machine.config machine.config
6192                 cd $depth
6193         ],[LN_S='$LN_S'])
6195         AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
6196         [   depth=../../../..
6197                 case $srcdir in
6198                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6199                 .) reldir=$depth ;;
6200                 *) reldir=$depth/$srcdir ;;
6201                 esac
6202                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6203                 cd runtime/etc/mono/4.0
6204                 rm -f web.config
6205                 $LN_S $reldir/data/net_4_0/web.config web.config
6206                 cd $depth
6207         ],[LN_S='$LN_S'])
6209         AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
6210         [   depth=../../../..
6211                 case $srcdir in
6212                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6213                 .) reldir=$depth ;;
6214                 *) reldir=$depth/$srcdir ;;
6215                 esac
6216                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6217                 cd runtime/etc/mono/4.5
6218                 rm -f machine.config
6219                 $LN_S $reldir/data/net_4_5/machine.config machine.config
6220                 cd $depth
6221         ],[LN_S='$LN_S'])
6223         AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
6224         [   depth=../../../..
6225                 case $srcdir in
6226                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6227                 .) reldir=$depth ;;
6228                 *) reldir=$depth/$srcdir ;;
6229                 esac
6230                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6231                 cd runtime/etc/mono/4.5
6232                 rm -f web.config
6233                 $LN_S $reldir/data/net_4_5/web.config web.config
6234                 cd $depth
6235         ],[LN_S='$LN_S'])
6238 # Top level Makefile.am subdirs
6239 if test "x$with_core" = "xonly"; then
6240         MONO_SUBDIRS="mk llvm mono"
6241 else
6242         if test "x$support_boehm" = "xyes" -a "x$libgc" = "xincluded"; then
6243                 mono_subdirs_libgc=external/bdwgc
6244         fi
6246         if test x$enable_support_build != xno; then
6247                 mono_subdirs_support=support
6248         fi
6250         if test x$cross_compiling = xno; then
6251                 # Some tools might not build when cross-compiling
6252                 mono_subdirs_tools=tools
6253         fi
6255         if test x$DISABLE_MCS_DOCS != xyes; then
6256                 mono_subdirs_docs=docs
6257         fi
6259         if test x$with_ikvm_native = xyes; then
6260                 mono_subdirs_ikvm_native=ikvm-native
6261         fi
6263         MONO_SUBDIRS="mk po $mono_subdirs_libgc llvm mono $mono_subdirs_ikvm_native $mono_subdirs_support data runtime scripts man samples $mono_subdirs_tools $mono_subdirs_docs msvc acceptance-tests"
6264         MONO_NOINST_SUBDIRS="$mono_subdirs_libgc"
6267 AC_SUBST(MONO_SUBDIRS)
6268 AC_SUBST(MONO_NOINST_SUBDIRS)
6270 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])
6271 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])
6272 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
6275 # Mono.Native Support
6276 # -------------------
6277 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
6278 # It is built as a stand-alone shared library and not bundled with the runtime because we
6279 # may need to build two different versions of it.
6281 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
6282 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
6284 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
6285 # implementation accordingly.  We build a single `libmono-native` shared library.
6287 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
6289 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
6290 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
6291 # depending on platform.
6293 # We build two versions of the shared library:
6294 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
6295 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
6297 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
6298 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
6299 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
6301 # This can be called by automated tests both to ensure that the library has been correctly installed and also
6302 # to verify that it's the correct version of it.
6305 AC_MSG_CHECKING([Mono.Native support])
6306 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
6307 if test x$disable_mono_native = xyes; then
6308         mono_native=no
6309 elif test x$target_osx = xyes; then
6310         MONO_NATIVE_CC=$CC
6311         MONO_NATIVE_CXX=$CXX
6312         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6313         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6314         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6315         MONO_NATIVE_CFLAGS=$CFLAGS
6316         MONO_NATIVE_LDFLAGS=$LDFLAGS
6318         mono_native=yes
6319         MONO_NATIVE_PLATFORM=macos
6320         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6322         if test x$enable_gss = xyes; then
6323                 MONO_NATIVE_LDFLAGS="$MONO_NATIVE_LDFLAGS -framework GSS"
6324         fi
6326         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6327                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6329         if test x$mono_native_compat = xyes; then
6330                 mono_native_compat=yes
6331                 mono_native_text="Mac OSX (compat + unified v10.12)"
6332                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6333                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6334                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6335                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6336                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6338                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6339                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6340                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6341                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6342                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6343                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6344         else
6345                 mono_native_compat=no
6346                 mono_native_text="Mac OSX"
6347         fi
6348 elif test x$mono_native_platform_ios = xyes; then
6349         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6351         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6352                 if test x$mono_native_ios_sim = xyes; then
6353                         mono_native_ios_target=ios-simulator
6354                         mono_native_text="iOS Simulator"
6355                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6356                 else
6357                         mono_native_ios_target=iphoneos
6358                         mono_native_text="iOS Device"
6359                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6360                 fi
6361                 mono_native_unified_version="10.0"
6362                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6363         ], [
6364                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6365                         if test x$mono_native_ios_sim = xyes; then
6366                                 mono_native_ios_target=tvos-simulator
6367                                 mono_native_text="AppleTV Simulator"
6368                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6369                         else
6370                                 mono_native_ios_target=tvos
6371                                 mono_native_text="AppleTV Device"
6372                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6373                         fi
6374                         mono_native_unified_version="10.0"
6375                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6376                 ], [
6377                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6378                                 if test x$mono_native_ios_sim = xyes; then
6379                                         mono_native_ios_target=watchos-simulator
6380                                         mono_native_text="Apple Watch Simulator"
6381                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6382                                 else
6383                                         mono_native_ios_target=watchos
6384                                         mono_native_text="Apple Watch Device"
6385                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6386                                 fi
6387                                 mono_native_unified_version="5.0"
6388                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6389                         ], [
6390                                 AC_MSG_ERROR([Unknown iOS Target])
6391                         ])
6392                 ])
6393         ])
6395         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6397         if test x$with_bitcode = xyes; then
6398                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6399                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6400         else
6401                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6402         fi
6404         if test x$enable_gss = xyes; then
6405                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6406         fi
6408         MONO_NATIVE_CC=$CC
6409         MONO_NATIVE_CXX=$CXX
6410         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6411         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6412         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6413         MONO_NATIVE_CFLAGS=$CFLAGS
6414         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6416         if test x$mono_native_compat = xyes; then
6417                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6418                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6419                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6420                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6421                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6422                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6424                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6425                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6426                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6427                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6428                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6429                 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"
6430         fi
6432         mono_native=yes
6433         MONO_NATIVE_PLATFORM=ios
6434 elif test x$host_linux = xyes; then
6435         mono_native_text="Linux"
6436         MONO_NATIVE_CC=$CC
6437         MONO_NATIVE_CXX=$CXX
6438         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6439         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6440         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6441         MONO_NATIVE_CFLAGS=$CFLAGS
6442         MONO_NATIVE_LDFLAGS=$LDFLAGS
6443         if test x$enable_gss = xyes; then
6444                 MONO_NATIVE_LDFLAGS="$MONO_NATIVE_LDFLAGS -lgssapi_krb5"
6445         else
6446                 AC_MSG_WARN([GSS is not enabled, it requires libkrb5-dev package])
6447         fi
6448         mono_native=yes
6449         mono_native_compat=no
6450         MONO_NATIVE_PLATFORM=linux
6452         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6453 elif test x$target_wasm = xyes; then
6454         mono_native_text="wasm"
6455         MONO_NATIVE_CC=$CC
6456         MONO_NATIVE_CXX=$CXX
6457         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6458         # The system.native code uses _WASM_ to check for wasm
6459         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6460         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6461         MONO_NATIVE_CFLAGS=$CFLAGS
6462         MONO_NATIVE_LDFLAGS=$LDFLAGS
6464         mono_native=yes
6465         mono_native_compat=no
6466         MONO_NATIVE_PLATFORM=linux
6468         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6469 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6470         mono_native_text="AIX"
6471         MONO_NATIVE_CC=$CC
6472         MONO_NATIVE_CXX=$CXX
6473         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6474         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6475         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6476         MONO_NATIVE_CFLAGS=$CFLAGS
6477         dnl nosymbolic- is a hack in case -G for linking is used, as -G seems
6478         dnl to change the way unresolved symbols work on library load in an
6479         dnl incompatible manner. (as references to runtime functions are
6480         dnl resolved later) Default params otherwise are that, so seems OK.
6481         dnl Likewise, we don't seem to need to cover the entire runtime with
6482         dnl it either, on both AIX and PASE. -brtl from -G does seem to spew
6483         dnl Big Scary TOC Warnings (tm) from the linker, but it doesn't seem
6484         dnl problematic with gcc's -mminimal-toc.
6485         dnl ----
6486         dnl flock in AIX exists in libbsd (not the same as freedesktop.org
6487         dnl libbsd) which Mono.Native needs.
6488         dnl Because of the way that the library is built by default, unresolved
6489         dnl references are kept and resolved at runtime. Often, the dependency
6490         dnl chain means libbsd is loaded anyways, but not necessarily. It's
6491         dnl better to explicitly link it, even though it has it shadows libc's
6492         dnl ioctl with its own. (As for the other unresolved imports, those
6493         dnl should be provided by the Mono runtime loaded.)
6494         MONO_NATIVE_LDFLAGS="$LDFLAGS -lbsd -Wl,-bnosymbolic-"
6496         mono_native=yes
6497         mono_native_compat=no
6498         MONO_NATIVE_PLATFORM=aix
6500         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6501 elif case $host_os in freebsd*) true;; *) false;; esac; then
6502         mono_native_text="FreeBSD"
6503         MONO_NATIVE_CC=$CC
6504         MONO_NATIVE_CXX=$CXX
6505         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6506         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6507         MONO_NATIVE_CFLAGS=$CFLAGS
6508         MONO_NATIVE_LDFLAGS=$LDFLAGS
6510         mono_native=yes
6511         mono_native_compat=no
6512         MONO_NATIVE_PLATFORM=freebsd
6513         AC_MSG_CHECKING([Mono.Native support])
6514         AC_MSG_RESULT(freebsd)
6516         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_FREEBSD"
6517 elif case $host_os in netbsd*) true;; *) false;; esac; then
6518         mono_native_text="NetBSD"
6519         MONO_NATIVE_CC=$CC
6520         MONO_NATIVE_CXX=$CXX
6521         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6522         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6523         MONO_NATIVE_CFLAGS=$CFLAGS
6524         MONO_NATIVE_LDFLAGS=$LDFLAGS
6526         mono_native=yes
6527         mono_native_compat=no
6528         MONO_NATIVE_PLATFORM=netbsd
6529         AC_MSG_CHECKING([Mono.Native support])
6530         AC_MSG_RESULT(netbsd)
6532         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_NETBSD"
6533 elif case $host_os in haiku*) true;; *) false;; esac; then
6534         mono_native_text="Haiku"
6535         MONO_NATIVE_CC=$CC
6536         MONO_NATIVE_CXX=$CXX
6537         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6538         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6539         MONO_NATIVE_CFLAGS=$CFLAGS
6540         MONO_NATIVE_LDFLAGS=$LDFLAGS
6542         mono_native=yes
6543         mono_native_compat=no
6544         MONO_NATIVE_PLATFORM=haiku
6545         AC_MSG_CHECKING([Mono.Native support])
6546         AC_MSG_RESULT(haiku)
6548         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_HAIKU"
6549 elif test x$platform_android = xyes; then
6550         mono_native_text="Android"
6551         MONO_NATIVE_CC=$CC
6552         MONO_NATIVE_CXX=$CXX
6553         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6554         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6555         MONO_NATIVE_CFLAGS=$CFLAGS
6556         MONO_NATIVE_LDFLAGS=$LDFLAGS
6557         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6559         mono_native=yes
6560         mono_native_compat=no
6561         MONO_NATIVE_PLATFORM=android
6563         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6564 else
6565         mono_native=no
6566         mono_native_text="no"
6569 AC_MSG_RESULT($mono_native_text)
6571 if test x$mono_native_compat = xyes; then
6572         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6573 else
6574         MONO_NATIVE_LIBRARY_NAME=libmono-native
6577 AC_SUBST(MONO_NATIVE_PLATFORM)
6578 AC_SUBST(MONO_NATIVE_CC)
6579 AC_SUBST(MONO_NATIVE_CXX)
6580 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6581 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6582 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6583 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6584 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6585 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6586 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6587 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6588 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6589 AC_SUBST(MONO_NATIVE_CFLAGS)
6590 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6591 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6592 AC_SUBST(MONO_NATIVE_LDFLAGS)
6593 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6594 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6595 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6596 AC_SUBST(MONO_NATIVE_LIBADD)
6598 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6599 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6600 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6601 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6602 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6603 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6604 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6605 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_FREEBSD, test x$MONO_NATIVE_PLATFORM = xfreebsd)
6606 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_NETBSD, test x$MONO_NATIVE_PLATFORM = xnetbsd)
6607 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_HAIKU, test x$MONO_NATIVE_PLATFORM = xhaiku)
6609 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6610 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6611 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6612 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6613 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6615 ### C++ Linker selection
6617 # We have to lie to autotools, sometimes.
6619 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6620 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6621 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6622 # except if we're linking with LLVM which relies on it.
6624 # Explanation of the hack:
6626 # According to
6627 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6628 # automake chooses the linker that it used to compile a target based on the
6629 # _SOURCES for that target.  If the target is comprised of only C code, it
6630 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6631 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6632 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6634 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6635 # or libc++) linked in - even when Mono is written in C++, we take care not to
6636 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6637 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6638 # C++ linker - LLVM doesn't have the same restrictions.
6640 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6641 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6642 #  automake's autodetection and lets us use the linker that we want.
6644 if test "x$enable_llvm_runtime" = "xyes"; then
6645         AC_SUBST(MONO_CXXLD, [$CXX])
6646 else
6647         AC_SUBST(MONO_CXXLD, [$CC])
6650 ### Set -Werror options
6652 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6654 if test x"$GCC" = xyes; then
6656         if test "x$with_jemalloc" != "xyes"; then
6658                 # incompatible-pointer-types requires gcc circa 5.x
6660                 ORIG_CFLAGS=$CFLAGS
6661                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6662                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6663                 AC_TRY_COMPILE([],[
6664                 ], [
6665                         AC_MSG_RESULT(yes)
6666                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6667                 ], [
6668                         AC_MSG_RESULT(no)
6669                         CFLAGS=$ORIG_CFLAGS
6670                 ])
6672                 CFLAGS="$CFLAGS -Werror=return-type"
6673         fi
6675         # Implicit function declarations are not 64 bit safe
6676         # Do this late, since this causes lots of configure tests to fail
6677         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6678         # jay has a lot of implicit declarations
6679         JAY_CFLAGS="-Wno-implicit-function-declaration"
6682 # zlib/configure checks if this program compiles and if so
6683 # defines _LARGEFILE64_SOURCE on the compiler command line (not config.h).
6685 AC_MSG_CHECKING([for large file support])
6686 AC_COMPILE_IFELSE(
6687         [AC_LANG_SOURCE([
6688                 #include <sys/types.h>
6689                 off64_t dummy = 0;
6690         ])], [
6691                 AC_MSG_RESULT(yes)
6692                 # FIXME The ramifications of _LARGEFILE64_SOURCE are not understood.
6693                 # ZLIB_CFLAGS="$ZLIB_CFLAGS -D_LARGEFILE64_SOURCE=1"
6694         ], [
6695                 AC_MSG_RESULT(no)
6696         ])
6698 AC_SUBST(CFLAGS)
6699 AC_SUBST(CPPFLAGS)
6700 AC_SUBST(LDFLAGS)
6701 AC_SUBST(ZLIB_CFLAGS)
6703 # Update all submodules recursively to ensure everything is checked out
6704 if test "x$with_core" != "xonly"; then
6705         (cd $srcdir && scripts/update_submodules.sh)
6708 AC_MONO_OUTPUT()
6710 if test x$host_win32 = xyes; then
6711    # Get rid of 'cyg' prefixes in library names
6712    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6713    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6714    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6715    # executable doesn't work...
6716    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6719 if test x$host_darwin = xyes; then
6720    # This doesn't seem to be required and it slows down parallel builds
6721    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6725   case $prefix in
6726   NONE) prefix=$ac_default_prefix ;;
6727   esac
6728   case $exec_prefix in
6729   NONE) exec_prefix='${prefix}' ;;
6730   esac
6732   #
6733   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6734   # any existing config.make.  This allows people to share the same source tree
6735   # with different build directories, one native and one cross
6736   #
6737   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6739     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6741     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6742     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6743     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6744     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6745     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6746     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6747     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6748     echo "VERSION = $VERSION" >> $mcs_topdir/build/config.make
6750     case $INSTALL in
6751     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6752     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6753     esac
6755     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6757     export VERSION
6758     [myver=$($AWK 'BEGIN {
6759       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6760       if(length(vsplit [1]) > 4) {
6761         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6762       }
6763       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6764     }')]
6766     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6767     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6769     if test x$host_darwin = xyes; then
6770       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6771       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6772       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6773     elif test x$host_win32 = xyes; then
6774       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6775       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6776       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6777     elif test x$host_linux = xyes; then
6778       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6779       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6780       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6781     else
6782       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6783       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6784       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6785     fi
6787     echo "PLATFORM_AOT_PREFIX = $PLATFORM_AOT_PREFIX" >> $mcs_topdir/build/config.make
6788     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6789       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6790     fi
6792         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6793            enable_system_aot=yes
6794         fi
6796     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6797       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6798     fi
6800     if test x$DISABLE_MCS_DOCS = xyes; then
6801       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6802     fi
6804     if test x$has_extension_module != xno; then
6805         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6806     fi
6807     
6808     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6809     
6810     if test "x$test_bcl_opt" = "xyes"; then    
6811       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6812     fi
6814     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6815     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6816     echo "VBCS_LOCATION?=$VBCS_LOCATION" >> $srcdir/$mcsdir/build/config.make
6818     if test $csc_compiler = mcs; then
6819       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6820     fi
6822     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6823       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6824       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6826       if test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" = "xno"; then
6827         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS,$MONO_LLVM_PATH_OPTION" >> $srcdir/$mcsdir/build/config.make
6828       else
6829         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6830       fi
6831     fi
6833     if test "x$AOT_MODE" != "x" ; then
6834       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6835     fi
6837     if test "x$enable_btls" = "xyes"; then
6838       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6839     fi
6841     if test "x$mono_native" = "xyes"; then
6842       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6843     else
6844       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6845     fi
6847     if test x$mono_native_compat = xyes; then
6848       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6849     else
6850       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6851     fi
6853     force_enable_compiler_server=no;
6855     AC_MSG_CHECKING([compiler server])
6856     AC_ARG_WITH(compiler-server, [  --with-compiler-server=yes,no,default,force      Enables or disables compiler server],[
6857        if test x$withval = xyes; then
6858            enable_compiler_server=yes;
6859        # force will bypass any automatic disables to allow you to test the compiler server
6860        #  in scenarios where it is disabled
6861        elif test x$withval = xforce; then
6862            enable_compiler_server=yes;
6863            force_enable_compiler_server=yes;
6864        elif test x$withval = xno; then
6865            enable_compiler_server=no;
6866        elif test x$withval = xdefault; then
6867            enable_compiler_server=yes;
6868        else
6869            AC_MSG_ERROR([You must supply one of "yes", "no", "default" or "force" to the --with-compiler-server option])
6870        fi
6871     ],[enable_compiler_server=yes])
6873     AC_MSG_RESULT($enable_compiler_server)
6875     if test x$enable_compiler_server = xyes; then
6876        if test x$force_enable_compiler_server = xyes; then
6877            AC_MSG_WARN([forcing compiler server to stay enabled])
6878        elif test x$host_darwin = xyes || test x$host_win32 = xyes; then
6879            AC_MSG_WARN([compiler server temporarily disabled on darwin and win32])
6880            enable_compiler_server=no;
6881        elif test x$csc_compiler = xmcs; then
6882            AC_MSG_WARN([mcs does not support the compiler server])
6883            enable_compiler_server=no;
6884        fi
6885     fi
6887     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6888     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6889     if test x$enable_compiler_server = xyes; then
6890       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6891     else
6892       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6893     fi
6894     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6896         if test x$enable_msvc_only = xyes; then
6897                 echo "ENABLE_MSVC_ONLY=1" >> $srcdir/$mcsdir/build/config.make
6898         fi
6900   fi
6904 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6906 btls_platform_string=
6907 if test x$enable_btls = xyes; then
6908         if test x$btls_android = xyes; then
6909                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6910         else
6911                 btls_platform_string=" ($BTLS_PLATFORM)"
6912         fi
6915 thread_suspend_msg=
6916 if test x$buildsgen = xyes; then
6917         if test x$enable_cooperative_suspend != xno; then
6918                 thread_suspend_msg="Suspend:       Cooperative"
6919         elif test x$enable_hybrid_suspend != xno; then
6920                 thread_suspend_msg="Suspend:       Hybrid"
6921         else
6922                 thread_suspend_msg="Suspend:       Preemptive"
6923         fi
6926 if test "x$with_core" = "xonly"; then
6927   if test ! -e netcore/Makefile; then
6928     # Out of tree builds
6929     mkdir -p netcore
6930     echo "all:" > netcore/Makefile
6931   fi
6932   echo "VERSION = $VERSION" > netcore/config.make
6933   echo "RID = $RID" >> netcore/config.make
6934   echo "COREARCH = $COREARCH" >> netcore/config.make
6935   echo "CORETARGETS = $CORETARGETS" >> netcore/config.make
6936   echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> netcore/config.make
6938   if test x$build_darwin = xyes; then
6939     echo "HOST_PLATFORM ?= macos" >> netcore/config.make
6940   elif test x$host_darwin = xyes; then
6941     echo "HOST_PLATFORM ?= macos" >> netcore/config.make
6942   elif test x$host_win32 = xyes; then
6943     echo "HOST_PLATFORM ?= win32" >> netcore/config.make
6944   elif test x$host_linux = xyes; then
6945     echo "HOST_PLATFORM ?= linux" >> netcore/config.make
6946   else
6947     echo "HOST_PLATFORM ?= unix" >> netcore/config.make
6948   fi
6951         
6952 echo "
6953         mcs source:    $mcsdir
6954         C# Compiler:   $csc_compiler
6955         CompilerServer:$enable_compiler_server
6957    Engine:
6958         Host:          $host
6959         Target:        $target
6960         GC:            $gc_msg 
6961         $thread_suspend_msg
6962         TLS:           $with_tls
6963         SIGALTSTACK:   $with_sigaltstack
6964         Engine:        $jit_status
6965         BigArrays:     $enable_big_arrays
6966         DTrace:        $enable_dtrace
6967         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6968         Spectre:       $spectre_mitigation_status
6969         Mono.Native:   $mono_native_text
6971    Libraries:
6972         .NET 4.x:        $with_profile4_x
6973         Xamarin.Android: $with_monodroid
6974         Xamarin.iOS:     $with_monotouch
6975         Xamarin.WatchOS: $with_monotouch_watch
6976         Xamarin.TVOS:    $with_monotouch_tv
6977         Xamarin.Mac:     $with_xammac
6978         Windows AOT:     $with_winaot
6979         Orbis:           $with_orbis
6980         Unreal:          $with_unreal
6981         WebAssembly:     $with_wasm
6982         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)
6983         JNI support:     $jdk_headers_found
6984         libgdiplus:      $libgdiplus_msg
6985         zlib:            $zlib_msg
6986         BTLS:            $enable_btls$btls_platform_string
6987         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6988         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6989         .NET Core:       $with_core
6990         $disabled
6992 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6993    AC_MSG_WARN([Turning off static Mono is a risk, you might run into unexpected bugs])