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