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