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