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