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