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