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