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