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