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