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