Add support for mono pdbs, sourcelink
[mono-project.git] / configure.ac
blob7b47ef48f0667efaa2fcc60593d7a8568388673f
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=e686c1dd-3c2a-4dc9-b12e-ff0d524d6e6b
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_HEADERS([linux/netlink.h linux/rtnetlink.h],
548                   [], [], [#include <stddef.h>
549                   #include <sys/socket.h>
550                   #include <linux/socket.h>])
552 AC_CHECK_HEADERS(sys/user.h, [], [],
554 #ifdef HAVE_SYS_PARAM_H
555 # include <sys/param.h>
556 #endif
559 AC_CHECK_HEADERS(linux/serial.h)
561 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
562 if test x$have_zlib = xyes; then
563    AC_TRY_COMPILE([#include <zlib.h>], [
564    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
565    #else
566    #error No good zlib found
567    #endif
568    ],[
569         AC_MSG_RESULT(Using system zlib)
570         zlib_msg="system zlib"
571         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
572    ],[
573         AC_MSG_RESULT(Using embedded zlib)
574         have_zlib=no
575         zlib_msg="bundled zlib"
576    ])
579 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
580 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
582 # for mono/metadata/debug-symfile.c
583 AC_CHECK_HEADERS(elf.h)
585 # for support
586 AC_CHECK_HEADERS(poll.h)
587 AC_CHECK_HEADERS(sys/poll.h)
588 AC_CHECK_HEADERS(sys/wait.h)
589 AC_CHECK_HEADERS(grp.h)
590 AC_CHECK_HEADERS(syslog.h)
591 AC_CHECK_FUNCS(vsyslog)
593 # for mono/dis
594 AC_CHECK_HEADERS(wchar.h)
596 # for Linux statfs support
597 AC_CHECK_HEADERS(linux/magic.h)
599 # For Android NDK unified headers
600 if test x$platform_android = xyes; then
601         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
602         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
603         AC_CHECK_HEADERS(android/ndk-version.h)
605         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
606         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
607         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
608         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
609         # doesn't contain the required definitions (NDK 14)
610         if test x$have_android_signal_inlines = xyes; then
611                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
612                 AC_COMPILE_IFELSE([
613                         AC_LANG_PROGRAM([#include <signal.h>
614                                 #include <android/legacy_signal_inlines.h>],[
615                                 int i;
616                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
617                                 }
618                         ])],[
619                                 AC_MSG_RESULT(yes)
620                                 android_sigrtminmax_work=yes
621                         ],[
622                                 AC_MSG_RESULT(no)
623                                 android_sigrtminmax_work=no
624                         ]
625                 )
627                 if test x$android_sigrtminmax_work = xno; then
628                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
629                 fi
630         fi
632         # Attempt to detect whether we're using Android NDK unified headers
633         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
634         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
636         android_unified_headers=no
637         if test x$have_android_api_level = xyes; then
638                 if test x$have_android_versioning = xyes; then
639                         AC_MSG_CHECKING([whether using Android NDK unified headers])
641                         # Both macros are defined only in the NDK unified headers
642                         AC_COMPILE_IFELSE([
643                                 AC_LANG_PROGRAM([
644                                         #include <android/api-level.h>
645                                         #include <android/versioning.h>
646                                 ],[
647                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
648                                         #else
649                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
650                                         #endif
651                                 ])],[
652                                         AC_MSG_RESULT(yes)
653                                         android_unified_headers=yes
654                                 ],[
655                                         AC_MSG_RESULT(no)
656                                         android_unified_headers=no
657                                 ]
658                         )
659                 fi
660         fi
662         if test x$android_unified_headers = xyes; then
663                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
664         fi
665 fi # Android
667 # not 64 bit clean in cross-compile
668 AC_CHECK_SIZEOF(void *)
669 AC_CHECK_SIZEOF(long)
671 AC_CHECK_SIZEOF(int)
672 AC_CHECK_SIZEOF(long long)
674 AC_CACHE_CHECK([for clang],
675         mono_cv_clang,[
676         AC_TRY_COMPILE([], [
677                 #ifdef __clang__
678                 #else
679                 #error "FAILED"
680                 #endif
681         ],
682         [mono_cv_clang=yes],
683         [mono_cv_clang=no],
684         [])
687 AC_ARG_ENABLE(visibility-hidden,
688 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
689    disable_visibility_hidden=yes, disable_visibility_hidden=no)
691 WARN=''
692 if test x"$GCC" = xyes; then
693                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
694                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
696                 # We require C99 with some GNU extensions, e.g. `linux` macro
697                 CFLAGS="$CFLAGS -std=gnu99"
699                 # The runtime code does not respect ANSI C strict aliasing rules
700                 CFLAGS="$CFLAGS -fno-strict-aliasing"
702                 # We rely on signed overflow to behave
703                 CFLAGS="$CFLAGS -fwrapv"
705                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
706                 if test x"$disable_visibility_hidden" = xno; then
707                    # Don't export any symbols by default
708                    SHARED_CFLAGS="-fvisibility=hidden"
709                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
710                 fi
712                 ORIG_CFLAGS=$CFLAGS
713                 # Check for the normal version, since gcc ignores unknown -Wno options
714                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
715                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
716                 AC_TRY_COMPILE([],[
717                 ], [
718                    AC_MSG_RESULT(yes)
719                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
720                 ], [
721                    AC_MSG_RESULT(no)
722                    CFLAGS=$ORIG_CFLAGS
723                 ])
725                 if test "x$mono_cv_clang" = "xyes"; then
726                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
727                    WARN="$WARN -Qunused-arguments"
728                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
729                    # We rely on zero length arrays in structs
730                    WARN="$WARN -Wno-zero-length-array"
731                 fi
732 else
733         # The Sun Forte compiler complains about inline functions that access static variables
734         # so disable all inlining.
735         case "$host" in
736         *-*-solaris*)
737                 CFLAGS="$CFLAGS -Dinline="
738                 ;;
739         esac
741 CFLAGS="$WARN $CFLAGS -g"
742 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
743 CPPFLAGS="$WARN $CPPFLAGS -g"
745 # Where's the 'mcs' source tree?
746 if test -d $srcdir/mcs; then
747   mcsdir=mcs
748 else
749   mcsdir=../mcs
752 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
753         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
754                 mcsdir=$with_mcs_path
755         fi
758 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
760 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
761 if test x$with_core = xonly; then
762     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
763     with_runtime_preset=netcore
765 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
768 # A sanity check to catch cases where the package was unpacked
769 # with an ancient tar program (Solaris)
771 AC_ARG_ENABLE(solaris-tar-check,
772 [  --disable-solaris-tar-check    disable solaris tar check],
773    do_solaris_tar_check=no, do_solaris_tar_check=yes)
775 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
776         AC_MSG_CHECKING(integrity of package)
777         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
778         then
779                 AC_MSG_RESULT(ok)
780         else
781                 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"
782                 AC_MSG_ERROR([$errorm])
783         fi
786 if test "x$with_mcs_path" != "x"; then
787 mcs_topdir=$(cd "$mcsdir" && pwd)
788 mcs_topdir_from_srcdir=$mcs_topdir
789 else
790 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
791 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
794 # Convert mcs_topdir* paths to Windows syntax.
795 if test x$cross_compiling$host_win32 = xnoyes; then
796   mcs_topdir=$(cygpath -m $mcs_topdir)
797   case $mcs_topdir_from_srcdir in
798     /cygdrive/*)
799         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
800         ;;
801   esac
804 AC_SUBST([mcs_topdir])
805 AC_SUBST([mcs_topdir_from_srcdir])
807 # gettext: prepare the translation directories. 
808 # we do not configure the full gettext, as we consume it dynamically from C#
809 AM_PO_SUBDIRS
811 if test "x$USE_NLS" = "xyes"; then
812    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
814    if test "x$HAVE_MSGFMT" = "xno"; then
815           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
816    fi
819 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
821 pkg_config_path=
822 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
823         if test x$with_crosspkgdir = "x"; then
824                 if test -s $PKG_CONFIG_PATH; then
825                         pkg_config_path=$PKG_CONFIG_PATH
826                 fi
827         else
828                 pkg_config_path=$with_crosspkgdir
829                 PKG_CONFIG_PATH=$pkg_config_path
830                 export PKG_CONFIG_PATH
831         fi
834 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
835 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
836 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
838 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
839 if test x$werror_flag = xyes; then
840         WERROR_CFLAGS="-Werror"
842 AC_SUBST([WERROR_CFLAGS])
843 AC_SUBST([SHARED_CFLAGS])
845 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
846   
847 AC_SUBST(GLIB_CFLAGS)
849 # Enable support for fast thread-local storage
850 # Some systems have broken support, so we allow to disable it.
851 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
853 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
854 # This does not work on some platforms (bug #55253)
855 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
857 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
858 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
859 # Same as --with-shared_mono=no
860 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
862 if test "x$enable_static" = "xno"; then
863    with_static_mono=no
866 if test "x$enable_shared" = "xno"; then
867    with_shared_mono=no
870 if test "x$enable_libraries" = "xno"; then
871    with_shared_mono=no
874 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
876 if test "x$host_win32" = "xyes"; then
877    # Boehm GC requires the runtime to be in its own dll
878    with_static_mono=no
881 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
882 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
883 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
884 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
886 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
887 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
888         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
889         ORIG_CFLAGS=$CFLAGS
890         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
891         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
892         AC_TRY_COMPILE([], [
893         ], [
894            AC_MSG_RESULT(yes)
895            # Pass it to libgc as well
896            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
897         ], [
898            AC_MSG_RESULT(no)
899            CFLAGS=$ORIG_CFLAGS
900         ])
903 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
905 if test x$enable_small_config = xyes; then
906         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
907         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
910 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)
912 DISABLED_FEATURES=none
913 csc_compiler=default
914 endian=unknown
915 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
916 AC_MSG_CHECKING([CSharp compiler to use])
917 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
918    if test x$withval = xmcs; then
919        csc_compiler=mcs
920    elif test x$withval = xroslyn; then
921        csc_compiler=roslyn
922    elif test x$withval = xdefault; then
923        :
924    else
925        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
926    fi
927 ],[csc_compiler=default])
929 if test $csc_compiler = default; then
930    if test $endian = big; then
931       csc_compiler=mcs
932    elif test $endian = little; then
933       case "$host" in
934         powerpc*) csc_compiler=mcs ;;
935         *) csc_compiler=roslyn ;;
936       esac
937    else
938       csc_compiler=mcs
939    fi
941 AC_MSG_RESULT($csc_compiler)
943 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
944 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
945 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])
948 if test x$target_win32 = xyes; then
949 with_jemalloc=no
950 with_jemalloc_assert=no
951 with_jemalloc_always=no
954 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
955 if test "x$with_jemalloc_assert" = "xyes"; then
956 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
957 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
958 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
961 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
962 if test "x$with_jemalloc_always" = "xyes"; then
963 with_jemalloc=yes
964 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
965 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
966 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
969 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
970 if test "x$with_jemalloc" = "xyes"; then
971 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
972 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
973 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
975 if test "x$target_mach" = "xyes"; then
976         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
979 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
980 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
982 AC_SUBST(JEMALLOC_CFLAGS)
983 AC_SUBST(JEMALLOC_CPPFLAGS)
984 AC_SUBST(JEMALLOC_LDFLAGS)
985 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
988 # Terminology:
989 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
990 # MERP - The MS telemetry profile. Not for general use.
991 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
993 # 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.
995 #--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.
996 #--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.
997 #--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.
998 #--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.
1000 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])
1001 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])
1002 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1004 if test "x$with_crash_privacy" = "xyes"; then
1005 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1008 if test "x$with_structured_crashes" = "xno"; then
1009 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1012 case "$host" in
1013         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1014                 crash_reporting=no
1015                 ;;
1016 esac
1018 if test "x$crash_reporting" != "xyes"; then
1019 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1020 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1023 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1024 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1026 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1027 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1029 if test x$enable_monodroid = xyes; then
1030         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1033 if test x$enable_monotouch = xyes; then
1034         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1037 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1039 # mono/corefx/native has a lot of invalid C++98 in its headers
1040 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1041 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1042 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1043 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1045 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1046 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1047 # and add it whenever we're running clang on Darwin.
1048 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1049         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1052 AC_SUBST(CXXFLAGS_COMMON)
1054 if test "x$enable_cxx" = "xyes"; then
1056         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1058         # -std=gnu99 -xc++ is not allowed and errors.
1059         CXX_REMOVE_CFLAGS=-std=gnu99
1060         # These give warnings and should be removed. They are C-only.
1061         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1062         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1063         # Likewise with CentOS 6 gcc 4.4.
1064         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1066         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1067         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1068         # generates a warning every time we run gcc which is very unsightly.
1069         # The warning is for e.g. sprintf(foo, "") which can just be
1070         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1071         # and completely legal and valid.
1072         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1073         # Alternatively, just run $CXX -xc++ -c /dev/null.
1074         AC_LANG_PUSH(C++)
1075         ORIG_CXXFLAGS=$CXXFLAGS
1076         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1077         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1078         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1079                                  [ AC_MSG_RESULT(no)
1080                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1081         CXXFLAGS=$ORIG_CXXFLAGS
1082         AC_LANG_POP(C++)
1084 AC_SUBST(CXX_ADD_CFLAGS)
1085 AC_SUBST(CXX_REMOVE_CFLAGS)
1088 # Set the build profiles and options before things which use them
1091 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])
1092 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1093 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1094 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])
1095 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])
1096 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1097 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1098 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])
1099 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])
1100 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])
1101 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1102 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1103 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1104 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1107 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])
1108 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])
1109 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])
1110 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])
1113 dnl Spectre compiler mitigation flag checks
1115 if test "x$with_spectre_mitigation" = "xyes"; then
1116    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1117    SPECTRE_CFLAGS=
1118    SPECTRE_INDIRECT_BRANCH_KIND=
1119    case "x$with_spectre_indirect_branch_choice" in
1120        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1121        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1122        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1123        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1124        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1125    esac
1127    SPECTRE_FUNCTION_RETURN_KIND=""
1128    case "x$with_spectre_function_return_choice" in
1129        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1130        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1131        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1132        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1133        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1134    esac
1136    AX_CHECK_COMPILE_FLAG(
1137         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1138         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1139    )
1141    AX_CHECK_COMPILE_FLAG(
1142         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1143         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1144    )
1146    if test "x$SPECTRE_CFLAGS" != "x" ; then
1147         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1148         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1149         spectre_mitigation_status="mitigation enabled"
1150    fi
1151 else
1152         spectre_mitigation_status="no mitigation"
1156 dnl Profile defaults
1158 TEST_PROFILE=default
1159 enable_llvm_default=no
1161 with_profile4_x_default=no
1162 with_monodroid_default=no
1163 with_monotouch_default=no
1164 with_monotouch_watch_default=no
1165 with_monotouch_tv_default=no
1166 with_xammac_default=no
1167 with_testing_aot_full_interp_default=no
1168 with_testing_aot_hybrid_default=no
1169 with_testing_aot_full_default=no
1170 with_winaot_default=no
1171 with_orbis_default=no
1172 with_unreal_default=no
1173 with_wasm_default=no
1175 with_bitcode_default=no
1176 enable_cooperative_suspend_default=no
1177 enable_hybrid_suspend_default=no
1179 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000,nftnptr-arg-trampolines=4000
1181 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1183 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1184    DISABLE_MCS_DOCS_default=yes
1185 elif test x$with_runtime_preset = xnetcore; then
1186    DISABLE_MCS_DOCS_default=yes
1188    mono_feature_disable_remoting='yes'
1189    mono_feature_disable_reflection_emit_save='yes'
1190    mono_feature_disable_appdomains='yes'
1191 elif test x$with_runtime_preset = xnet_4_x; then
1192    with_profile4_x_default=yes
1193    TEST_PROFILE=net_4_x
1194 elif test x$with_runtime_preset = xall; then
1195    with_profile4_x_default=yes
1196    with_monodroid_default=yes
1197    with_monotouch_default=yes
1198    with_monotouch_watch_default=yes
1199    with_monotouch_tv_default=yes
1200    with_xammac_default=yes
1201    with_winaot_default=yes
1202    with_orbis_default=yes
1203    with_unreal_default=yes
1204    with_wasm_default=yes
1205    with_testing_aot_full_interp_default=yes
1206    with_testing_aot_hybrid_default=yes
1207    with_testing_aot_full_default=yes
1208    TEST_PROFILE=net_4_x
1209 elif test x$with_runtime_preset = xbitcode; then
1210    DISABLE_MCS_DOCS_default=yes
1211    with_testing_aot_full_default=yes
1212    with_bitcode_default=yes
1213    enable_cooperative_suspend_default=yes
1214    TEST_PROFILE=testing_aot_full
1215    enable_llvm_default=yes
1217    mono_feature_disable_com='yes'
1218    mono_feature_disable_remoting='yes'
1219    mono_feature_disable_reflection_emit_save='yes'
1220    mono_feature_disable_reflection_emit='yes'
1221    mono_feature_disable_appdomains='yes'
1223    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1224    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1225    AOT_MODE="llvmonly"
1226 elif test x$with_runtime_preset = xfullaot; then
1227    DISABLE_MCS_DOCS_default=yes
1228    with_testing_aot_full_default=yes
1229    TEST_PROFILE=testing_aot_full
1231    mono_feature_disable_com='yes'
1232    mono_feature_disable_remoting='yes'
1233    mono_feature_disable_reflection_emit_save='yes'
1234    mono_feature_disable_reflection_emit='yes'
1235    mono_feature_disable_appdomains='yes'
1237    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1238    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1239    AOT_MODE="full"
1240 elif test x$with_runtime_preset = xfullaot_llvm; then
1241    DISABLE_MCS_DOCS_default=yes
1242    with_testing_aot_full_default=yes
1243    TEST_PROFILE=testing_aot_full
1245    mono_feature_disable_com='yes'
1246    mono_feature_disable_remoting='yes'
1247    mono_feature_disable_reflection_emit_save='yes'
1248    mono_feature_disable_reflection_emit='yes'
1249    mono_feature_disable_appdomains='yes'
1251    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1252    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1253    AOT_MODE="full"
1254 elif test x$with_runtime_preset = xhybridaot; then
1255    DISABLE_MCS_DOCS_default=yes
1256    with_testing_aot_hybrid_default=yes
1257    TEST_PROFILE=testing_aot_hybrid 
1259    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1260    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1261 elif test x$with_runtime_preset = xhybridaot_llvm; then
1262    DISABLE_MCS_DOCS_default=yes
1263    with_testing_aot_hybrid_default=yes
1264    TEST_PROFILE=testing_aot_hybrid
1266    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1267    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1268 elif test x$with_runtime_preset = xfullaotinterp; then
1269    with_testing_aot_full_interp_default=yes
1270    TEST_PROFILE=testing_aot_full_interp
1272    # mscorlib.dll aot compilation crashes
1273    mono_feature_disable_com='yes'
1275    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1276    AOT_RUN_FLAGS="--full-aot-interp"
1277 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1278    with_testing_aot_full_interp_default=yes
1279    TEST_PROFILE=testing_aot_full_interp_llvm
1281    # mscorlib.dll aot compilation crashes
1282    mono_feature_disable_com='yes'
1284    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1285    AOT_RUN_FLAGS="--full-aot-interp"
1286 elif test x$with_runtime_preset = xaot; then
1287    with_profile4_x_default=yes
1289    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1290    AOT_RUN_FLAGS=""
1292    DISABLE_MCS_DOCS_default=yes
1293 elif test x$with_runtime_preset = xaot_llvm; then
1294    with_profile4_x_default=yes
1296    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1297    AOT_RUN_FLAGS=""
1299    DISABLE_MCS_DOCS_default=yes
1300 elif test x$with_runtime_preset = xwinaot; then
1301    DISABLE_MCS_DOCS_default=yes
1302    with_winaot_default=yes
1303    TEST_PROFILE=winaot
1305    mono_feature_disable_com='yes'
1306    mono_feature_disable_remoting='yes'
1307    mono_feature_disable_reflection_emit_save='yes'
1308    mono_feature_disable_reflection_emit='yes'
1309    mono_feature_disable_appdomains='yes'
1311    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1312    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1313    AOT_MODE="llvmonly"
1314 elif test x$with_runtime_preset = xorbis; then
1315    DISABLE_MCS_DOCS_default=yes
1316    with_orbis_default=yes
1317    TEST_PROFILE=orbis
1319    mono_feature_disable_com='yes'
1320    mono_feature_disable_remoting='yes'
1321    mono_feature_disable_reflection_emit_save='yes'
1322    mono_feature_disable_reflection_emit='yes'
1323    mono_feature_disable_appdomains='yes'
1325    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1326    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1327    AOT_MODE="full"
1328 elif test x$with_runtime_preset = xunreal; then
1329    DISABLE_MCS_DOCS_default=yes
1330    with_unreal_default=yes
1331    TEST_PROFILE=unreal
1333    mono_feature_disable_com='yes'
1334    mono_feature_disable_remoting='yes'
1335    mono_feature_disable_appdomains='no'
1337    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1338    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1339 elif test x$with_runtime_preset = xwasm; then
1340    DISABLE_MCS_DOCS_default=yes
1341    with_wasm_default=yes
1342    TEST_PROFILE=wasm
1344    mono_feature_disable_com='yes'
1345    mono_feature_disable_remoting='yes'
1346    mono_feature_disable_reflection_emit_save='yes'
1347    mono_feature_disable_reflection_emit='yes'
1348    mono_feature_disable_appdomains='yes'
1350    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1351    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1352 else
1353    TEST_PROFILE=net_4_x
1354    with_profile4_x_default=yes
1357 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1358    AC_SUBST(AOT_BUILD_FLAGS)
1359    AC_SUBST(AOT_RUN_FLAGS)
1360    # For llvmonlycheck + fullaotcheck
1361    AC_SUBST(INVARIANT_AOT_OPTIONS)
1364 AC_SUBST(TEST_PROFILE)
1366 if test "x$with_profile4_x" = "xdefault"; then
1367    with_profile4_x=$with_profile4_x_default
1369 if test "x$with_monodroid" = "xdefault"; then
1370    with_monodroid=$with_monodroid_default
1372 if test "x$with_monotouch" = "xdefault"; then
1373    with_monotouch=$with_monotouch_default
1375 if test "x$with_monotouch_watch" = "xdefault"; then
1376    with_monotouch_watch=$with_monotouch_watch_default
1378 if test "x$with_monotouch_tv" = "xdefault"; then
1379    with_monotouch_tv=$with_monotouch_tv_default
1381 if test "x$with_bitcode" = "xdefault"; then
1382    with_bitcode=$with_bitcode_default
1384 if test "x$with_xammac" = "xdefault"; then
1385    with_xammac=$with_xammac_default
1387 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1388    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1390 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1391    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1393 if test "x$with_testing_aot_full" = "xdefault"; then
1394    with_testing_aot_full=$with_testing_aot_full_default
1396 if test "x$with_winaot" = "xdefault"; then
1397    with_winaot=$with_winaot_default
1399 if test "x$with_orbis" = "xdefault"; then
1400    with_orbis=$with_orbis_default
1402 if test "x$with_unreal" = "xdefault"; then
1403    with_unreal=$with_unreal_default
1405 if test "x$with_wasm" = "xdefault"; then
1406    with_wasm=$with_wasm_default
1410 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1411 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1412 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1413 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1414 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1415 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1416 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1417 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1418 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1419 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1420 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1421 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1422 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1423 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1424 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1425 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"])
1426 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1427 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1428 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1429 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1431 default_profile=net_4_x
1432 if test -z "$INSTALL_MONODROID_TRUE"; then :
1433    default_profile=monodroid
1435 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1436    default_profile=monotouch
1438 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1439    default_profile=xammac
1441 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1442    default_profile=testing_aot_full_interp
1444 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1445    default_profile=testing_aot_hybrid
1447 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1448    default_profile=testing_aot_full
1450 if test -z "$INSTALL_WINAOT_TRUE"; then :
1451    default_profile=winaot
1453 if test -z "$INSTALL_ORBIS_TRUE"; then :
1454    default_profile=orbis
1456 if test -z "$INSTALL_UNREAL_TRUE"; then :
1457    default_profile=unreal
1459 if test -z "$INSTALL_WASM_TRUE"; then :
1460    default_profile=wasm
1462 if test -z "$INSTALL_4_x_TRUE"; then :
1463    default_profile=net_4_x
1465 DEFAULT_PROFILE=$default_profile
1466 AC_SUBST(DEFAULT_PROFILE)
1469 # End build profile configuration
1472 if test x$USE_NLS = xprofile_default; then
1474         AC_MSG_CHECKING([NLS used])
1476         # We make the default value for USE_NLS
1477         # "no" on OSX because it isn't available on most
1478         # default OSX installs. The most common configurations will
1479         # all disable it, so this saves us typing.
1480         if test x$host_darwin = xyes; then
1481                 USE_NLS=no;
1482         else
1483                 USE_NLS=yes;
1484         fi
1486         AC_SUBST([USE_NLS])
1487         AC_MSG_RESULT([$USE_NLS])
1490 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1491      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1492      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1493          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1495         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1496                 eval "mono_feature_disable_$feature='yes'"
1497         done
1498         DISABLED_FEATURES=$enable_minimal
1499         disabled="Disabled:      $enable_minimal"
1500 ],[])
1502 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1504 if test "x$mono_feature_disable_aot" = "xyes"; then
1505         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1506         enable_system_aot=no
1507         AC_MSG_NOTICE([Disabled AOT compiler])
1510 if test "x$mono_feature_disable_profiler" = "xyes"; then
1511         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1512         AC_MSG_NOTICE([Disabled support for the profiler])
1514 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1516 if test "x$mono_feature_disable_decimal" = "xyes"; then
1517         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1518         AC_MSG_NOTICE([Disabled support for decimal])
1521 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1522         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1523         AC_MSG_NOTICE([Disabled support for P/Invoke])
1526 if test "x$mono_feature_disable_debug" = "xyes"; then
1527         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1528         AC_MSG_NOTICE([Disabled support for runtime debugging])
1531 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1532         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1533         mono_feature_disable_reflection_emit_save=yes
1534         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1537 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1538         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1539         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1542 if test "x$mono_feature_disable_large_code" = "xyes"; then
1543         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1544         AC_MSG_NOTICE([Disabled support for large assemblies])
1547 if test "x$mono_feature_disable_logging" = "xyes"; then
1548         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1549         AC_MSG_NOTICE([Disabled support for logging])
1552 if test "x$mono_feature_disable_com" = "xyes"; then
1553         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1554         AC_MSG_NOTICE([Disabled COM support])
1557 if test "x$mono_feature_disable_ssa" = "xyes"; then
1558         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1559         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1562 if test "x$mono_feature_disable_generics" = "xyes"; then
1563         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1564         AC_MSG_NOTICE([Disabled Generics Support])
1567 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1568         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1569         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1572 if test "x$mono_feature_disable_portability" = "xyes"; then
1573         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1574         AC_MSG_NOTICE([Disabled IO Portability layer])
1577 if test "x$mono_feature_disable_attach" = "xyes"; then
1578         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1579         AC_MSG_NOTICE([Disabled agent attach])
1582 if test "x$mono_feature_disable_verifier" = "xyes"; then
1583         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1584         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1587 if test "x$mono_feature_disable_jit" = "xyes"; then
1588         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1589         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1592 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1594 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1595         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1596         AC_MSG_NOTICE([Disabled the interpreter])
1599 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1601 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1602         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1605 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1607 if test "x$mono_feature_disable_simd" = "xyes"; then
1608         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1609         AC_MSG_NOTICE([Disabled SIMD support])
1612 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1613         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1614         AC_MSG_NOTICE([Disabled Soft Debugger.])
1617 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1619 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1620         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1621         AC_MSG_NOTICE([Disabled Performance Counters.])
1623 if test "x$mono_feature_disable_normalization" = "xyes"; then
1624         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1625         AC_MSG_NOTICE([Disabled String normalization support.])
1628 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1629 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1630         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1631         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1634 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1635         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1636         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1639 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1640         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1641         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1644 if test "x$mono_feature_disable_remoting" = "xyes"; then
1645         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1646         AC_MSG_NOTICE([Disabled remoting])
1649 if test "x$mono_feature_disable_security" = "xyes"; then
1650         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1651         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1654 if test "x$mono_feature_disable_lldb" = "xyes"; then
1655         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1656         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1659 if test "x$mono_feature_disable_mdb" = "xyes"; then
1660         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1661         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1664 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1665         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1666         AC_MSG_NOTICE([Disabled assertion messages.])
1669 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1670         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1671         AC_MSG_NOTICE([Disabled runtime cleanup.])
1674 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1675         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1676         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1680 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1681         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1682         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1685 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1686         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1687         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1690 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1691         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1692         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1695 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1696 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1698 has_extension_module=no
1699 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1701         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1702                 if test x$extension = xdefault ; then
1703                         has_extension_module=yes;
1704                 fi
1705         done
1706         if test x$enable_extension_module = xyes; then
1707                 has_extension_module=yes;
1708         fi
1709 ], [])
1711 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1713 if test x$has_extension_module != xno ; then
1714         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1715         AC_MSG_NOTICE([Enabling mono extension module.])
1718 # Deprecated
1719 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1721 AC_MSG_CHECKING(for visibility __attribute__)
1722 AC_COMPILE_IFELSE([
1723         AC_LANG_SOURCE([[
1724                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1725                 int main () { doit (); return 0; }
1726         ]])
1727 ], [
1728    have_visibility_hidden=yes
1729    AC_MSG_RESULT(yes)
1730 ], [
1731    have_visibility_hidden=no
1732    AC_MSG_RESULT(no)
1736 dnl Boehm GC configuration
1739 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1741 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1742 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1744 if test "x$support_boehm" = "xyes"; then
1746         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1747         if test x$enable_parallel_mark = xyes; then
1748                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1749         fi
1751         gc_msg=""
1752         LIBGC_CPPFLAGS=
1753         LIBGC_LIBS=
1754         LIBGC_STATIC_LIBS=
1755         libgc_dir=
1756         case "x$libgc" in
1757                 xincluded)
1758                         if test "x$support_boehm" = "xyes"; then
1759                                 libgc_dir=libgc
1760                         fi
1762                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1763                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1764                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1766                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1768                         if test x$target_win32 = xyes; then
1769                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1770                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1771                         fi
1773                         gc_msg="Included Boehm GC with typed GC"
1774                         if test x$enable_parallel_mark = xyes; then
1775                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1776                                 gc_msg="$gc_msg and parallel mark"
1777                         else
1778                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1779                         fi
1780                         ;;
1782                 xboehm|xbohem|xyes)
1783                         AC_MSG_WARN("External Boehm is no longer supported")
1784                         ;;
1786                 xsgen)
1787                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1788                         ;;
1790                 xnone)
1791                         AC_MSG_WARN("Compiling mono without GC.")
1792                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1793                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1794                         gc_msg="none"
1795                         ;;
1796                 *)
1797                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1798                         ;;
1799         esac
1801         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])
1802         if test "x$large_heap" = "xyes"; then
1803            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1804         fi
1806         AC_SUBST(LIBGC_CPPFLAGS)
1807         AC_SUBST(LIBGC_LIBS)
1808         AC_SUBST(LIBGC_STATIC_LIBS)
1809         AC_SUBST(libgc_dir)
1810         AC_SUBST(BOEHM_DEFINES)
1813 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1816 dnl End of Boehm GC Configuration
1819 dnl *************************************
1820 dnl *** Checks for zero length arrays ***
1821 dnl *************************************
1822 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1823 AC_TRY_COMPILE([
1824         struct s {
1825                 int  length;
1826                 char data [0];
1827         };
1828 ], [], [
1829         AC_MSG_RESULT(yes)
1830         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1831 ], [
1832         AC_MSG_RESULT(no)
1833         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1836 dnl ***********************************
1837 dnl *** Checks for signals
1838 dnl ***********************************
1839 AC_CHECK_HEADERS(signal.h)
1840 AC_CHECK_FUNCS(sigaction)
1841 AC_CHECK_FUNCS(kill)
1842 AC_CHECK_FUNCS(signal)
1844 # signal() is declared inline in Android headers
1845 # so we need to workaround it by overriding the check.
1846 if test x$platform_android = xyes; then
1847         AC_DEFINE(HAVE_SIGNAL,1)
1850 dnl ***********************************
1851 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1852 dnl ***********************************
1853 enable_gss=no;
1854 AC_MSG_CHECKING(for GSS/GSS.h)
1855 AC_TRY_COMPILE([
1856     #include <GSS/GSS.h>
1857 ], [
1859     AC_MSG_RESULT(yes)
1860     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1861     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1862     enable_gss=yes
1863 ], [
1864     AC_MSG_RESULT(no)
1867 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1868 AC_TRY_COMPILE([
1869     #include <gssapi/gssapi_ext.h>
1870 ], [
1872     AC_MSG_RESULT(yes)
1873     enable_gss=yes
1874 ], [
1875     AC_MSG_RESULT(no)
1878 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1879 AC_TRY_COMPILE([
1880     #include <gssapi/gssapi_ext.h>
1881     #include <gssapi/gssapi_krb5.h>
1882     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1883 ], [
1885     AC_MSG_RESULT(yes)
1886     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1887 ], [
1888     AC_MSG_RESULT(no)
1891 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1893 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1894 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1896 if test x$host_win32 = xno; then
1897         dnl *************************************
1898         dnl *** Checks for time capabilities ***
1899         dnl *************************************
1901         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1902         AC_TRY_COMPILE([#include <time.h>], [
1903                 const int foo = CLOCK_MONOTONIC;
1904         ],[
1905                 AC_MSG_RESULT(yes)
1906                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1907         ], [
1908                 AC_MSG_RESULT(no)
1909         ])
1911         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1912         AC_TRY_COMPILE([#include <time.h>], [
1913                 const int foo = CLOCK_MONOTONIC_COARSE;
1914         ],[
1915                 AC_MSG_RESULT(yes)
1916                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1917         ], [
1918                 AC_MSG_RESULT(no)
1919         ])
1921         AC_MSG_CHECKING(for CLOCK_REALTIME)
1922         AC_TRY_COMPILE([#include <time.h>], [
1923                 const int foo = CLOCK_REALTIME;
1924         ],[
1925                 AC_MSG_RESULT(yes)
1926                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1927         ], [
1928                 AC_MSG_RESULT(no)
1929         ])
1931         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1932         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1933         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1934         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1935         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1936         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1938         dnl hires monotonic clock support
1939         AC_SEARCH_LIBS(clock_gettime, rt)
1940         AC_CHECK_FUNCS(clock_nanosleep)
1942         dnl dynamic loader support
1943         AC_CHECK_FUNC(dlopen, DL_LIB="",
1944                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1945         )
1946         if test x$dl_support = xno; then
1947                 AC_MSG_WARN([No dynamic loading support available])
1948         else
1949                 LIBS="$LIBS $DL_LIB"
1950                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1951                 dnl from glib's configure.ac
1952                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1953                         mono_cv_uscore,[
1954                         AC_TRY_RUN([#include <dlfcn.h>
1955                         int mono_underscore_test (void) { return 42; }
1956                         int main() {
1957                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1958                           handle = dlopen ((void*)0, 0);
1959                           if (handle) {
1960                             f1 = dlsym (handle, "mono_underscore_test");
1961                             f2 = dlsym (handle, "_mono_underscore_test");
1962                           } return (!f2 || f1);
1963                         }],
1964                                 [mono_cv_uscore=yes],
1965                                 [mono_cv_uscore=no],
1966                         [])
1967                 ])
1968                 if test "x$mono_cv_uscore" = "xyes"; then
1969                         MONO_DL_NEED_USCORE=1
1970                 else
1971                         MONO_DL_NEED_USCORE=0
1972                 fi
1973                 AC_SUBST(MONO_DL_NEED_USCORE)
1974                 AC_CHECK_FUNC(dlerror)
1975         fi
1977         dnl ******************************************************************
1978         dnl *** Checks for the IKVM JNI interface library                  ***
1979         dnl ******************************************************************
1980         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])
1982         ikvm_native_dir=
1983         if test x$with_ikvm_native = xyes; then
1984                 ikvm_native_dir=ikvm-native
1985                 jdk_headers_found="IKVM Native"
1986         fi
1988         AC_SUBST(ikvm_native_dir)
1990         AC_CHECK_HEADERS(execinfo.h)
1992         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1994         AC_CHECK_FUNCS(getgrgid_r)
1995         AC_CHECK_FUNCS(getgrnam_r)
1996         AC_CHECK_FUNCS(getresuid)
1997         AC_CHECK_FUNCS(setresuid)
1998         AC_CHECK_FUNCS(kqueue)
1999         AC_CHECK_FUNCS(backtrace_symbols)
2000         AC_CHECK_FUNCS(mkstemp)
2001         AC_CHECK_FUNCS(mmap)
2002         AC_CHECK_FUNCS(madvise)
2003         AC_CHECK_FUNCS(getrusage)
2004         AC_CHECK_FUNCS(getpriority)
2005         AC_CHECK_FUNCS(setpriority)
2006         AC_CHECK_FUNCS(dl_iterate_phdr)
2007         AC_CHECK_FUNCS(dladdr)
2008         AC_CHECK_FUNCS(sysconf)
2009         AC_CHECK_FUNCS(getrlimit)
2010         AC_CHECK_FUNCS(prctl)
2011         AC_CHECK_FUNCS(arc4random)
2012         AC_CHECK_FUNCS(nl_langinfo)
2014         AC_CHECK_FUNCS(sched_getaffinity)
2015         AC_CHECK_FUNCS(sched_setaffinity)
2016         AC_CHECK_FUNCS(sched_getcpu)
2018         if test x$platform_android != xyes; then
2019                 AC_CHECK_FUNCS(getpwnam_r)
2020                 AC_CHECK_FUNCS(getpwuid_r)
2021         fi
2023         AC_FUNC_STRERROR_R()
2025         dnl ****************************************************************
2026         dnl *** Check for sched_setaffinity from glibc versions before   ***
2027         dnl *** 2.3.4. The older versions of the function only take 2    ***
2028         dnl *** parameters, not 3.                                       ***
2029         dnl ***                                                          ***
2030         dnl *** Because the interface change was not made in a minor     ***
2031         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2032         dnl *** won't always indicate the interface sched_affinity has.  ***
2033         dnl ****************************************************************
2034         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2035         AC_TRY_COMPILE([#include <sched.h>], [
2036             int mask = 1; 
2037             sched_setaffinity(0, &mask);
2038         ], [
2039                 # Yes, we have it...
2040                 AC_MSG_RESULT(yes)
2041                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2042         ], [
2043                 # We have the new, three-parameter version
2044                 AC_MSG_RESULT(no)
2045         ])
2046         AC_TRY_COMPILE([#include <sched.h>], [
2047              CPU_COUNT((void *) 0);
2048         ], [
2049                 AC_MSG_RESULT(yes)
2050                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2051         ], [
2052                 # We have the new, three-parameter version
2053                 AC_MSG_RESULT(no)
2054         ])
2056         dnl ******************************************************************
2057         dnl *** Check for large file support                               ***
2058         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2059         dnl ******************************************************************
2060         
2061         # Check that off_t can represent 2**63 - 1 correctly, working around
2062         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2063         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2064         large_offt=no
2065         AC_DEFUN([LARGE_FILES], [
2066                 large_CPPFLAGS=$CPPFLAGS
2067                 CPPFLAGS="$CPPFLAGS $1"
2068                 AC_TRY_COMPILE([
2069                         #include <sys/types.h>
2070                         #include <limits.h>
2071                 ], [
2072                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2073                         #define COMPILE_TIME_ASSERT(pred) \
2074                                 switch(0){case 0:case pred:;}
2075                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2076                 ], [
2077                         AC_MSG_RESULT(ok)
2078                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2079                         large_CPPFLAGS="$large_CPPFLAGS $1"
2080                         large_offt=yes
2081                 ], [
2082                         AC_MSG_RESULT(no)
2083                 ])
2084                 CPPFLAGS=$large_CPPFLAGS
2085         ])
2087         AC_MSG_CHECKING(if off_t is 64 bits wide)
2088         LARGE_FILES("")
2089         if test $large_offt = no; then
2090                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2091                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2092         fi
2093         if test $large_offt = no; then
2094                 AC_MSG_WARN([No 64 bit file size support available])
2095         fi
2096         
2097         dnl *****************************
2098         dnl *** Checks for libsocket  ***
2099         dnl *****************************
2100         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2102         case "$host" in
2103                 *-*-*freebsd*)
2104                         dnl *****************************
2105                         dnl *** Checks for libinotify ***
2106                         dnl *****************************
2107                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2108         esac
2110         dnl *******************************
2111         dnl *** Checks for MSG_NOSIGNAL ***
2112         dnl *******************************
2113         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2114         AC_TRY_COMPILE([#include <sys/socket.h>], [
2115                 int f = MSG_NOSIGNAL;
2116         ], [
2117                 # Yes, we have it...
2118                 AC_MSG_RESULT(yes)
2119                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2120         ], [
2121                 # We'll have to use signals
2122                 AC_MSG_RESULT(no)
2123         ])
2125         dnl *****************************
2126         dnl *** Checks for IPPROTO_IP ***
2127         dnl *****************************
2128         AC_MSG_CHECKING(for IPPROTO_IP)
2129         AC_TRY_COMPILE([#include <netinet/in.h>], [
2130                 int level = IPPROTO_IP;
2131         ], [
2132                 # Yes, we have it...
2133                 AC_MSG_RESULT(yes)
2134                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2135         ], [
2136                 # We'll have to use getprotobyname
2137                 AC_MSG_RESULT(no)
2138         ])
2140         dnl *******************************
2141         dnl *** Checks for IPPROTO_IPV6 ***
2142         dnl *******************************
2143         AC_MSG_CHECKING(for IPPROTO_IPV6)
2144         AC_TRY_COMPILE([#include <netinet/in.h>], [
2145                 int level = IPPROTO_IPV6;
2146         ], [
2147                 # Yes, we have it...
2148                 AC_MSG_RESULT(yes)
2149                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2150         ], [
2151                 # We'll have to use getprotobyname
2152                 AC_MSG_RESULT(no)
2153         ])
2155         dnl ******************************
2156         dnl *** Checks for IPPROTO_TCP ***
2157         dnl ******************************
2158         AC_MSG_CHECKING(for IPPROTO_TCP)
2159         AC_TRY_COMPILE([#include <netinet/in.h>], [
2160                 int level = IPPROTO_TCP;
2161         ], [
2162                 # Yes, we have it...
2163                 AC_MSG_RESULT(yes)
2164                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2165         ], [
2166                 # We'll have to use getprotobyname
2167                 AC_MSG_RESULT(no)
2168         ])
2170         dnl *****************************
2171         dnl *** Checks for SOL_IP     ***
2172         dnl *****************************
2173         AC_MSG_CHECKING(for SOL_IP)
2174         AC_TRY_COMPILE([#include <netdb.h>], [
2175                 int level = SOL_IP;
2176         ], [
2177                 # Yes, we have it...
2178                 AC_MSG_RESULT(yes)
2179                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2180         ], [
2181                 # We'll have to use getprotobyname
2182                 AC_MSG_RESULT(no)
2183         ])
2185         dnl *****************************
2186         dnl *** Checks for SOL_IPV6     ***
2187         dnl *****************************
2188         AC_MSG_CHECKING(for SOL_IPV6)
2189         AC_TRY_COMPILE([#include <netdb.h>], [
2190                 int level = SOL_IPV6;
2191         ], [
2192                 # Yes, we have it...
2193                 AC_MSG_RESULT(yes)
2194                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2195         ], [
2196                 # We'll have to use getprotobyname
2197                 AC_MSG_RESULT(no)
2198         ])
2200         dnl *****************************
2201         dnl *** Checks for SOL_TCP    ***
2202         dnl *****************************
2203         AC_MSG_CHECKING(for SOL_TCP)
2204         AC_TRY_COMPILE([#include <netdb.h>], [
2205                 int level = SOL_TCP;
2206         ], [
2207                 # Yes, we have it...
2208                 AC_MSG_RESULT(yes)
2209                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2210         ], [
2211                 # We'll have to use getprotobyname
2212                 AC_MSG_RESULT(no)
2213         ])
2215         dnl *****************************
2216         dnl *** Checks for IP_PKTINFO ***
2217         dnl *****************************
2218         AC_MSG_CHECKING(for IP_PKTINFO)
2219         AC_TRY_COMPILE([#include <linux/in.h>], [
2220                 int level = IP_PKTINFO;
2221         ], [
2222                 # Yes, we have it...
2223                 AC_MSG_RESULT(yes)
2224                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2225         ], [
2226                 AC_MSG_RESULT(no)
2227         ])
2229         dnl *****************************
2230         dnl *** Checks for IPV6_PKTINFO ***
2231         dnl *****************************
2232         AC_MSG_CHECKING(for IPV6_PKTINFO)
2233         AC_TRY_COMPILE([#include <netdb.h>], [
2234                 int level = IPV6_PKTINFO;
2235         ], [
2236                 # Yes, we have it...
2237                 AC_MSG_RESULT(yes)
2238                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2239         ], [
2240                 AC_MSG_RESULT(no)
2241         ])
2243         dnl **********************************
2244         dnl *** Checks for IP_DONTFRAG     ***
2245         dnl **********************************
2246         AC_MSG_CHECKING(for IP_DONTFRAG)
2247         AC_TRY_COMPILE([#include <netinet/in.h>], [
2248                 int level = IP_DONTFRAG;
2249         ], [
2250                 # Yes, we have it...
2251                 AC_MSG_RESULT(yes)
2252                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2253         ], [
2254                 AC_MSG_RESULT(no)
2255         ])
2257         dnl **********************************
2258         dnl *** Checks for IP_DONTFRAGMENT ***
2259         dnl **********************************
2260         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2261         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2262                 int level = IP_DONTFRAGMENT;
2263         ], [
2264                 # Yes, we have it...
2265                 AC_MSG_RESULT(yes)
2266                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2267         ], [
2268                 AC_MSG_RESULT(no)
2269         ])
2271         dnl **********************************
2272         dnl *** Checks for IP_MTU_DISCOVER ***
2273         dnl **********************************
2274         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2275         AC_TRY_COMPILE([#include <linux/in.h>], [
2276                 int level = IP_MTU_DISCOVER;
2277         ], [
2278                 # Yes, we have it...
2279                 AC_MSG_RESULT(yes)
2280                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2281         ], [
2282                 AC_MSG_RESULT(no)
2283         ])
2285         dnl **********************************
2286         dnl *** Checks for  IP_PMTUDISC_DO ***
2287         dnl **********************************
2288         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2289         AC_TRY_COMPILE([#include <linux/in.h>], [
2290                 int level = IP_PMTUDISC_DO;
2291         ], [
2292                 # Yes, we have it...
2293                 AC_MSG_RESULT(yes)
2294                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2295         ], [
2296                 AC_MSG_RESULT(no)
2297         ])
2299         dnl *********************************
2300         dnl *** Check for struct ip_mreqn ***
2301         dnl *********************************
2302         AC_MSG_CHECKING(for struct ip_mreqn)
2303         AC_TRY_COMPILE([#include <netinet/in.h>], [
2304                 struct ip_mreqn mreq;
2305                 mreq.imr_address.s_addr = 0;
2306         ], [
2307                 # Yes, we have it...
2308                 AC_MSG_RESULT(yes)
2309                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2310         ], [
2311                 # We'll just have to try and use struct ip_mreq
2312                 AC_MSG_RESULT(no)
2313                 AC_MSG_CHECKING(for struct ip_mreq)
2314                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2315                         struct ip_mreq mreq;
2316                         mreq.imr_interface.s_addr = 0;
2317                 ], [
2318                         # Yes, we have it...
2319                         AC_MSG_RESULT(yes)
2320                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2321                 ], [
2322                         # No multicast support
2323                         AC_MSG_RESULT(no)
2324                 ])
2325         ])
2326         
2327         dnl **********************************
2328         dnl *** Check for getaddrinfo ***
2329         dnl **********************************
2330         AC_MSG_CHECKING(for getaddrinfo)
2331                 AC_TRY_LINK([
2332                 #include <stdio.h>
2333                 #include <netdb.h>
2334         ], [
2335                 getaddrinfo(NULL,NULL,NULL,NULL);
2336         ], [
2337                 # Yes, we have it...
2338                 AC_MSG_RESULT(yes)
2339                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2340         ], [
2341                 AC_MSG_RESULT(no)
2342         ])
2344         dnl **********************************
2345         dnl *** Check for gethostbyname2_r ***
2346         dnl **********************************
2347         AC_MSG_CHECKING(for gethostbyname2_r)
2348                 AC_TRY_LINK([
2349                 #include <stdio.h>
2350                 #include <netdb.h>
2351         ], [
2353                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2354         ], [
2355                 # Yes, we have it...
2356                 AC_MSG_RESULT(yes)
2357                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2358         ], [
2359                 AC_MSG_RESULT(no)
2360         ])
2362         dnl **********************************
2363         dnl *** Check for gethostbyname2 ***
2364         dnl **********************************
2365         AC_MSG_CHECKING(for gethostbyname2)
2366                 AC_TRY_LINK([
2367                 #include <stdio.h>
2368                 #include <netdb.h>
2369         ], [
2370                 gethostbyname2(NULL,0);
2371         ], [
2372                 # Yes, we have it...
2373                 AC_MSG_RESULT(yes)
2374                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2375         ], [
2376                 AC_MSG_RESULT(no)
2377         ])
2379         dnl **********************************
2380         dnl *** Check for gethostbyname ***
2381         dnl **********************************
2382         AC_MSG_CHECKING(for gethostbyname)
2383                 AC_TRY_LINK([
2384                 #include <stdio.h>
2385                 #include <netdb.h>
2386         ], [
2387                 gethostbyname(NULL);
2388         ], [
2389                 # Yes, we have it...
2390                 AC_MSG_RESULT(yes)
2391                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2392         ], [
2393                 AC_MSG_RESULT(no)
2394         ])
2396         dnl **********************************
2397         dnl *** Check for getprotobyname ***
2398         dnl **********************************
2399         AC_MSG_CHECKING(for getprotobyname)
2400                 AC_TRY_LINK([
2401                 #include <stdio.h>
2402                 #include <netdb.h>
2403         ], [
2404                 getprotobyname(NULL);
2405         ], [
2406                 # Yes, we have it...
2407                 AC_MSG_RESULT(yes)
2408                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2409         ], [
2410                 AC_MSG_RESULT(no)
2411         ])
2413         dnl **********************************
2414         dnl *** Check for getprotobyname_r ***
2415         dnl **********************************
2416         AC_MSG_CHECKING(for getprotobyname_r)
2417                 AC_TRY_LINK([
2418                 #include <stdio.h>
2419                 #include <netdb.h>
2420         ], [
2421                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2422         ], [
2423                 # Yes, we have it...
2424                 AC_MSG_RESULT(yes)
2425                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2426         ], [
2427                 AC_MSG_RESULT(no)
2428         ])
2430         dnl **********************************
2431         dnl *** Check for getnameinfo ***
2432         dnl **********************************
2433         AC_MSG_CHECKING(for getnameinfo)
2434                 AC_TRY_LINK([
2435                 #include <stdio.h>
2436                 #include <netdb.h>
2437         ], [
2438                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2439         ], [
2440                 # Yes, we have it...
2441                 AC_MSG_RESULT(yes)
2442                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2443         ], [
2444                 AC_MSG_RESULT(no)
2445         ])
2448         dnl **********************************
2449         dnl *** Check for inet_ntop ***
2450         dnl **********************************
2451         AC_MSG_CHECKING(for inet_ntop)
2452                 AC_TRY_LINK([
2453                 #include <stdio.h>
2454                 #include <arpa/inet.h>
2455         ], [
2456                 inet_ntop (0, NULL, NULL, 0);
2457         ], [
2458                 # Yes, we have it...
2459                 AC_MSG_RESULT(yes)
2460                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2461         ], [
2462                 AC_MSG_RESULT(no)
2463         ])
2465         dnl *****************************
2466         dnl *** Checks for libnsl     ***
2467         dnl *****************************
2468         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2470         AC_CHECK_FUNCS(inet_pton inet_aton)
2472         dnl *****************************
2473         dnl *** Checks for libxnet    ***
2474         dnl *****************************
2475         case "${host}" in
2476                 *solaris* )
2477                         AC_MSG_CHECKING(for Solaris XPG4 support)
2478                         if test -f /usr/lib/libxnet.so; then
2479                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2480                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2481                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2482                                 LIBS="$LIBS -lxnet"
2483                                 AC_MSG_RESULT(yes)
2484                         else
2485                                 AC_MSG_RESULT(no)
2486                         fi
2488                         if test "$GCC" = "yes"; then
2489                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2490                         fi
2491                 ;;
2492         esac
2494         dnl *****************************
2495         dnl *** Checks for libpthread ***
2496         dnl *****************************
2497 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2498 # and libpthread does not exist
2500         case "${host}" in
2501                 *-*-*haiku*)
2502                         dnl Haiku has pthread in libroot (libc equiv)
2503                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2504                 ;;
2505                 *-*-*freebsd*)
2506                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2507                 ;;
2508                 *-*-*openbsd*)
2509                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2510                 ;;
2511                 *)
2512                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2513                 ;;
2514         esac
2515         AC_CHECK_HEADERS(pthread.h)
2516         AC_CHECK_HEADERS(pthread_np.h)
2517         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2518         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2519         AC_CHECK_FUNCS(pthread_kill)
2520         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2521         AC_TRY_COMPILE([ #include <pthread.h>], [
2522                 pthread_mutexattr_t attr;
2523                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2524         ], [
2525                 AC_MSG_RESULT(ok)
2526         ], [
2527                 AC_MSG_RESULT(no)
2528                 AC_ERROR(Posix system lacks support for recursive mutexes)
2529         ])
2530         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2531         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2532         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2533         AC_CHECK_FUNCS(mincore mlock munlock)
2535         dnl ***********************************
2536         dnl *** Checks for working __thread ***
2537         dnl ***********************************
2538         AC_MSG_CHECKING(for working __thread)
2539         if test "x$with_tls" != "x__thread"; then
2540                 AC_MSG_RESULT(disabled)
2541         elif test "x$cross_compiling" = "xyes"; then
2542                 AC_MSG_RESULT(cross compiling, assuming yes)
2543         else
2544                 AC_TRY_RUN([
2545                         #if defined(__APPLE__) && defined(__clang__)
2546                         #error "__thread does not currently work with clang on Mac OS X"
2547                         #endif
2548                         
2549                         #include <pthread.h>
2550                         __thread int i;
2551                         static int res1, res2;
2553                         void thread_main (void *arg)
2554                         {
2555                                 i = arg;
2556                                 sleep (1);
2557                                 if (arg == 1)
2558                                         res1 = (i == arg);
2559                                 else
2560                                         res2 = (i == arg);
2561                         }
2563                         int main () {
2564                                 pthread_t t1, t2;
2566                                 i = 5;
2568                                 pthread_create (&t1, NULL, thread_main, 1);
2569                                 pthread_create (&t2, NULL, thread_main, 2);
2571                                 pthread_join (t1, NULL);
2572                                 pthread_join (t2, NULL);
2574                                 return !(res1 + res2 == 2);
2575                         }
2576                 ], [
2577                                 AC_MSG_RESULT(yes)
2578                 ], [
2579                                 AC_MSG_RESULT(no)
2580                                 with_tls=pthread
2581                 ])
2582         fi
2584         dnl **************************************
2585         dnl *** Checks for working sigaltstack ***
2586         dnl **************************************
2587         AC_MSG_CHECKING(for working sigaltstack)
2588         if test "x$with_sigaltstack" != "xyes"; then
2589                 AC_MSG_RESULT(disabled)
2590         elif test "x$cross_compiling" = "xyes"; then
2591                 AC_MSG_RESULT(cross compiling, assuming yes)
2592         else
2593                 AC_TRY_RUN([
2594                         #include <stdio.h>
2595                         #include <stdlib.h>
2596                         #include <unistd.h>
2597                         #include <signal.h>
2598                         #include <pthread.h>
2599                         #include <sys/wait.h>
2600                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2601                         #define SA_STACK SA_ONSTACK
2602                         #endif
2603                         static void
2604                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2605                         {
2606                                 exit (0);
2607                         }
2609                         volatile char*__ptr = NULL;
2610                         static void *
2611                         loop (void *ignored)
2612                         {
2613                                 *__ptr = 0;
2614                                 return NULL;
2615                         }
2617                         static void
2618                         child ()
2619                         {
2620                                 struct sigaction sa;
2621                                 stack_t sas;
2622                                 pthread_t id;
2623                                 pthread_attr_t attr;
2625                                 sa.sa_sigaction = sigsegv_signal_handler;
2626                                 sigemptyset (&sa.sa_mask);
2627                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2628                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2629                                         perror ("sigaction");
2630                                         return;
2631                                 }
2633                                 /* x86 darwin deliver segfaults using SIGBUS */
2634                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2635                                         perror ("sigaction");
2636                                         return;
2637                                 }
2638                                 sas.ss_sp = malloc (SIGSTKSZ);
2639                                 sas.ss_size = SIGSTKSZ;
2640                                 sas.ss_flags = 0;
2641                                 if (sigaltstack (&sas, NULL) == -1) {
2642                                         perror ("sigaltstack");
2643                                         return;
2644                                 }
2646                                 pthread_attr_init (&attr);
2647                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2648                                         printf ("pthread_create\n");
2649                                         return;
2650                                 }
2652                                 sleep (100);
2653                         }
2655                         int
2656                         main ()
2657                         {
2658                                 pid_t son;
2659                                 int status;
2660                                 int i;
2662                                 son = fork ();
2663                                 if (son == -1) {
2664                                         return 1;
2665                                 }
2667                                 if (son == 0) {
2668                                         child ();
2669                                         return 0;
2670                                 }
2672                                 for (i = 0; i < 300; ++i) {
2673                                         waitpid (son, &status, WNOHANG);
2674                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2675                                                 return 0;
2676                                         usleep (10000);
2677                                 }
2679                                 kill (son, SIGKILL);
2680                                 return 1;
2681                         }
2683                 ], [
2684                                 AC_MSG_RESULT(yes)
2685                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2686                 ], [
2687                                 with_sigaltstack=no
2688                                 AC_MSG_RESULT(no)
2689                 ])
2690         fi
2692         dnl ********************************
2693         dnl *** Checks for semaphore lib ***
2694         dnl ********************************
2695         # 'Real Time' functions on Solaris
2696         # posix4 on Solaris 2.6
2697         # pthread (first!) on Linux
2698         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2700         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2701         AC_CHECK_FUNCS(shm_open)
2703         dnl ********************************
2704         dnl *** Checks for timezone stuff **
2705         dnl ********************************
2706         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2707                 AC_TRY_COMPILE([
2708                         #include <time.h>
2709                         ], [
2710                         struct tm tm;
2711                         tm.tm_gmtoff = 1;
2712                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2713         if test $ac_cv_struct_tm_gmtoff = yes; then
2714                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2715         else
2716                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2717                         AC_TRY_COMPILE([
2718                                 #include <time.h>
2719                         ], [
2720                                 timezone = 1;
2721                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2722                 if test $ac_cv_var_timezone = yes; then
2723                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2724                 else
2725                         AC_ERROR(unable to find a way to determine timezone)
2726                 fi
2727         fi
2729         dnl *********************************
2730         dnl *** Checks for math functions ***
2731         dnl *********************************
2732         AC_SEARCH_LIBS(sqrtf, m)
2734         dnl ****************************************************************
2735         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2736         dnl *** have it in the library (duh))                            ***
2737         dnl ****************************************************************
2738         AC_CHECK_FUNCS(poll)
2740         dnl **********************************
2741         dnl *** epoll                      ***
2742         dnl **********************************
2743         AC_CHECK_HEADERS(sys/epoll.h)
2744         haveepoll=no
2745         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2746         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2747                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2748         fi
2750         havekqueue=no
2752         AC_CHECK_HEADERS(sys/event.h)
2753         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2755         dnl **************************************
2756         dnl * Darwin has a race that prevents us from using reliably:
2757         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2758         dnl * Since kqueue is mostly used for scaling large web servers, 
2759         dnl * and very few folks run Mono on large web servers on OSX, falling
2760         dnl * back 
2761         dnl **************************************
2762         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2763                 if test "x$host_darwin" = "xno"; then
2764                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2765                 fi
2766         fi
2768         dnl ******************************
2769         dnl *** Checks for SIOCGIFCONF ***
2770         dnl ******************************
2771         AC_CHECK_HEADERS(sys/ioctl.h)
2772         AC_CHECK_HEADERS(net/if.h, [], [],
2773            [
2774            #ifdef HAVE_SYS_TYPES_H
2775            # include <sys/types.h>
2776            #endif
2777            #ifdef HAVE_SYS_SOCKET_H
2778            # include <sys/socket.h>
2779            #endif
2780            ])
2781         AC_MSG_CHECKING(for ifreq)
2782         AC_TRY_COMPILE([
2783                 #include <stdio.h>
2784                 #include <sys/ioctl.h>
2785                 #include <net/if.h>
2786                 ], [
2787                 struct ifconf ifc;
2788                 struct ifreq *ifr;
2789                 void *x;
2790                 ifc.ifc_len = 0;
2791                 ifc.ifc_buf = NULL;
2792                 x = (void *) &ifr->ifr_addr;
2793                 ],[
2794                         AC_MSG_RESULT(yes)
2795                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2796                 ], [
2797                         AC_MSG_RESULT(no)
2798                 ])
2799         dnl **********************************
2800         dnl ***     Checks for sin_len     ***
2801         dnl **********************************
2802         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2803         AC_TRY_COMPILE([
2804                 #include <netinet/in.h>
2805                 ], [
2806                 struct sockaddr_in saddr;
2807                 saddr.sin_len = sizeof (saddr);
2808                 ],[
2809                         AC_MSG_RESULT(yes)
2810                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2811                 ], [
2812                         AC_MSG_RESULT(no)
2813                 ])      
2814         dnl **********************************
2815         dnl ***    Checks for sin6_len     ***
2816         dnl **********************************
2817         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2818         AC_TRY_COMPILE([
2819                 #include <netinet/in.h>
2820                 ], [
2821                 struct sockaddr_in6 saddr6;
2822                 saddr6.sin6_len = sizeof (saddr6);
2823                 ],[
2824                         AC_MSG_RESULT(yes)
2825                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2826                 ], [
2827                         AC_MSG_RESULT(no)
2828                 ])
2829         dnl **********************************
2830         dnl *** Check for getifaddrs       ***
2831         dnl **********************************
2832         AC_MSG_CHECKING(for getifaddrs)
2833                 AC_TRY_LINK([
2834                 #include <stdio.h>
2835                 #include <sys/types.h>
2836                 #include <sys/socket.h>
2837                 #include <ifaddrs.h>
2838         ], [
2839                 getifaddrs(NULL);
2840         ], [
2841                 # Yes, we have it...
2842                 AC_MSG_RESULT(yes)
2843                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2844         ], [
2845                 AC_MSG_RESULT(no)
2846         ])
2847         dnl **********************************
2848         dnl *** Check for if_nametoindex   ***
2849         dnl **********************************
2850         AC_MSG_CHECKING(for if_nametoindex)
2851                 AC_TRY_LINK([
2852                 #include <stdio.h>
2853                 #include <sys/types.h>
2854                 #include <sys/socket.h>
2855                 #include <net/if.h>
2856         ], [
2857                 if_nametoindex(NULL);
2858         ], [
2859                 # Yes, we have it...
2860                 AC_MSG_RESULT(yes)
2861                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2862         ], [
2863                 AC_MSG_RESULT(no)
2864         ])
2865         dnl **********************************
2866         dnl *** Check for access ***
2867         dnl **********************************
2868         AC_MSG_CHECKING(for access)
2869                 AC_TRY_LINK([
2870                 #include <unistd.h>
2871         ], [
2872                 access(NULL,0);
2873         ], [
2874                 # Yes, we have it...
2875                 AC_MSG_RESULT(yes)
2876                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2877         ], [
2878                 AC_MSG_RESULT(no)
2879         ])
2880                         
2881         dnl **********************************
2882         dnl *** Checks for proclib         ***
2883         dnl **********************************
2884         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.)])
2885         dnl **********************************
2886         dnl *** Checks for MonoPosixHelper ***
2887         dnl **********************************
2888         AC_CHECK_HEADERS(checklist.h)
2889         AC_CHECK_HEADERS(pathconf.h)
2890         AC_CHECK_HEADERS(fstab.h)
2891         AC_CHECK_HEADERS(attr/xattr.h)
2892         AC_CHECK_HEADERS(sys/extattr.h)
2893         AC_CHECK_HEADERS(sys/sendfile.h)
2894         AC_CHECK_HEADERS(sys/statvfs.h)
2895         AC_CHECK_HEADERS(sys/statfs.h)
2896         AC_CHECK_HEADERS(sys/vfstab.h)
2897         AC_CHECK_HEADERS(sys/xattr.h)
2898         AC_CHECK_HEADERS(sys/mman.h)
2899         AC_CHECK_HEADERS(sys/param.h)
2900         AC_CHECK_HEADERS(sys/mount.h, [], [],
2901                 [
2902                 #ifdef HAVE_SYS_PARAM_H
2903                 # include <sys/param.h>
2904                 #endif
2905                 ])
2906         AC_CHECK_HEADERS(sys/mount.h)
2907         AC_CHECK_FUNCS(confstr)
2908         AC_CHECK_FUNCS(seekdir telldir)
2909         AC_CHECK_FUNCS(getdomainname)
2910         AC_CHECK_FUNCS(setdomainname)
2911         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2912         AC_CHECK_FUNCS(setgroups)
2913         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2914         AC_CHECK_FUNCS(getfsstat)
2915         AC_CHECK_FUNCS(lutimes futimes)
2916         AC_CHECK_FUNCS(mremap)
2917         AC_CHECK_FUNCS(remap_file_pages)
2918         AC_CHECK_FUNCS(posix_fadvise)
2919         AC_CHECK_FUNCS(posix_fallocate)
2920         AC_CHECK_FUNCS(posix_madvise)
2921         AC_CHECK_FUNCS(vsnprintf)
2922         AC_CHECK_FUNCS(sendfile)
2923         AC_CHECK_FUNCS(gethostid sethostid)
2924         AC_CHECK_FUNCS(sethostname)
2925         AC_CHECK_FUNCS(statfs)
2926         AC_CHECK_FUNCS(fstatfs)
2927         AC_CHECK_FUNCS(statvfs)
2928         AC_CHECK_FUNCS(fstatvfs)
2929         AC_CHECK_FUNCS(stime)
2930         AC_CHECK_FUNCS(ttyname_r)
2931         AC_CHECK_FUNCS(psignal)
2932         AC_CHECK_FUNCS(getlogin_r)
2933         AC_CHECK_FUNCS(lockf)
2934         AC_CHECK_FUNCS(swab)
2935         AC_CHECK_FUNCS(setusershell endusershell)
2936         AC_CHECK_FUNCS(futimens utimensat)
2937         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2938         AC_CHECK_FUNCS(readv writev preadv pwritev)
2939         AC_CHECK_FUNCS(setpgid)
2940         AC_CHECK_FUNCS(system)
2941         AC_CHECK_FUNCS(fork execv execve)
2942         AC_CHECK_FUNCS(waitpid)
2943         AC_CHECK_FUNCS(accept4)
2944         AC_CHECK_FUNCS(localtime_r)
2945         AC_CHECK_FUNCS(mkdtemp)
2946         AC_CHECK_SIZEOF(size_t)
2947         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2948                 [#include <sys/types.h>
2949                  #include <sys/stat.h>
2950                  #include <unistd.h>])
2951         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2952                 [#include <sys/types.h>
2953                  #include <sys/stat.h>
2954                  #include <unistd.h>])
2955         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2956                 [#include <sys/time.h>])
2957         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2958                 [#include <sys/socket.h>])
2959         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2960                 [#include <unistd.h>
2961                  #include <fcntl.h>])
2962         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2963                 [#include <sys/uio.h>])
2964         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2965                 [#include <sys/socket.h>])
2966         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2967                 [#include <sys/poll.h>])
2968         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2969                 [#include <sys/socket.h>])
2970         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2971                 [#include <sys/socket.h>])
2972         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2973                 [#include <netinet/in.h>])
2974         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2975                 [#include <netinet/in.h>])
2976         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2977                 [#include <sys/un.h>])
2978         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2979                 [#include <sys/types.h>
2980                  #include <sys/stat.h>
2981                  #include <unistd.h>])
2982         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2983                 [#include <time.h>])
2984         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2985                 [#include <sys/time.h>
2986                  #include <sys/types.h>
2987                  #include <utime.h>])
2988         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2989                 [#include <sys/time.h>])
2990         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2991                 [#include <sys/types.h>
2992                  #include <utime.h>])
2993         AC_CHECK_MEMBERS(
2994                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2995                 [#include <sys/types.h>
2996                  #include <dirent.h>])
2997         AC_CHECK_MEMBERS(
2998                 [struct passwd.pw_gecos],,, 
2999                 [#include <sys/types.h>
3000                  #include <pwd.h>])
3001         AC_CHECK_MEMBERS(
3002                 [struct statfs.f_flags],,, 
3003                 [#include <sys/types.h>
3004                  #include <sys/vfs.h>])
3005         AC_CHECK_MEMBERS(
3006                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3007                 [#include <sys/types.h>
3008                  #include <sys/stat.h>
3009                  #include <unistd.h>])
3011         dnl Favour xattr through glibc, but use libattr if we have to
3012         AC_CHECK_FUNC(lsetxattr, ,
3013                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3014         )
3015         AC_SUBST(XATTR_LIB)
3017         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3018         AC_CHECK_MEMBERS(
3019                 [struct kinfo_proc.kp_proc],,, 
3020                 [#include <sys/types.h>
3021                  #include <sys/param.h>
3022                  #include <sys/sysctl.h>
3023                  #include <sys/proc.h>
3024                  ])
3026         dnl *********************************
3027         dnl *** Checks for Windows compilation ***
3028         dnl *********************************
3029         AC_CHECK_HEADERS(sys/time.h)
3030         AC_CHECK_HEADERS(sys/param.h)
3031         AC_CHECK_HEADERS(dirent.h)
3033         dnl ******************************************
3034         dnl *** Checks for OSX and iOS compilation ***
3035         dnl ******************************************
3036         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3038         dnl *********************************
3039         dnl *** Check for Console 2.0 I/O ***
3040         dnl *********************************
3041         AC_CHECK_HEADERS([curses.h])
3042         AC_CHECK_HEADERS([term.h], [], [],
3043         [#if HAVE_CURSES_H
3044          #include <curses.h>
3045          #endif
3046         ])
3047         AC_CHECK_HEADERS([termios.h])
3049         dnl *********************************
3050         dnl *** Checks for random         ***
3051         dnl *********************************
3052         if test x$host_darwin = xno; then
3053                 AC_CHECK_HEADERS(sys/random.h)
3054                 AC_CHECK_FUNCS(getrandom getentropy)
3055         fi
3057         dnl *********************************
3058         dnl *** Checks for Mono.Native  ***
3059         dnl *********************************
3061         AC_MSG_CHECKING(for linux/in.h)
3062         AC_TRY_COMPILE([
3063                 #include <sys/socket.h>
3064                 #include <linux/in.h>
3065         ], [
3066         ],[
3067                 AC_MSG_RESULT(yes)
3068                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3069         ], [
3070                 AC_MSG_RESULT(no)
3071         ])
3073         AC_CHECK_HEADERS([linux/if_packet.h])
3075         AC_MSG_CHECKING(for struct in_pktinfo)
3076         AC_TRY_COMPILE([
3077                 #ifdef HAVE_LINUX_IN_H
3078                 #include <sys/socket.h>
3079                 #include <linux/in.h>
3080                 #else
3081                 #include <netinet/in.h>
3082                 #endif
3083         ], [
3084                 struct in_pktinfo pktinfo;
3085         ],[
3086                 AC_MSG_RESULT(yes)
3087                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3088         ], [
3089                 AC_MSG_RESULT(no)
3090         ])
3092         AC_MSG_CHECKING(for struct ip_mreqn)
3093         AC_TRY_COMPILE([
3094                 #if HAVE_LINUX_IN_H
3095                 #include <sys/socket.h>
3096                 #include <linux/in.h>
3097                 #else
3098                 #include <netinet/in.h>
3099                 #endif
3100         ], [
3101                 struct ip_mreqn mreqn;
3102         ],[
3103                 AC_MSG_RESULT(yes)
3104                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3105         ], [
3106                 AC_MSG_RESULT(no)
3107         ])
3109         if test x$host_darwin = xno; then
3110                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3111         fi
3113         if test x$mono_native_platform_ios = xno; then
3114                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3115                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3116                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3117         fi
3119         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3120         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3121         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3122         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3123         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3124         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3125         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3126         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3127         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3128         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3129         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3130         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3131         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3132         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3133         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3134         AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3135         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3136         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3137         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3139         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3140         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3142         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>]])
3143         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>]])
3144         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>]])
3145         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>]])
3146         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3147         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3148         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3150         AC_MSG_CHECKING(for struct statfs)
3151         AC_TRY_COMPILE([
3152                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3153                 #include <sys/mount.h>
3154                 #else
3155                 #include <sys/statfs.h>
3156                 #endif
3157         ], [
3158                 struct statfs;
3159         ],[
3160                 AC_MSG_RESULT(yes)
3161                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3162         ], [
3163                 AC_MSG_RESULT(no)
3164         ])
3166         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3167                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3168         fi
3170         AC_MSG_CHECKING(for readdir_r)
3171         AC_TRY_COMPILE([
3172                 #include <dirent.h>
3173         ], [
3174                 DIR* dir;
3175                 struct dirent* entry;
3176                 struct dirent* result;
3177                 readdir_r(dir, entry, &result);
3178         ],[
3179                 AC_MSG_RESULT(yes)
3180                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3181         ], [
3182                 AC_MSG_RESULT(no)
3183         ])
3185         AC_MSG_CHECKING(for kevent with void *data)
3186         AC_TRY_COMPILE([
3187                 #include <sys/types.h>
3188                 #include <sys/event.h>
3189         ], [
3190                 struct kevent event;
3191                 void* data;
3192                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3193         ],[
3194                 AC_MSG_RESULT(yes)
3195                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3196         ], [
3197                 AC_MSG_RESULT(no)
3198         ])
3200         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3201         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3203         AC_MSG_CHECKING(for sendfile with 4 arguments)
3204         AC_TRY_COMPILE([
3205                 #include <sys/sendfile.h>
3206         ], [
3207                 int result = sendfile(0, 0, 0, 0);
3208         ],[
3209                 AC_MSG_RESULT(yes)
3210                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3211         ], [
3212                 AC_MSG_RESULT(no)
3213         ])
3215         AC_MSG_CHECKING(for sendfile with 6 arguments)
3216         AC_TRY_LINK([
3217                 #include <stdlib.h>
3218                 #include <sys/types.h>
3219                 #include <sys/socket.h>
3220                 #include <sys/uio.h>
3221         ], [
3222                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3223         ],[
3224                 AC_MSG_RESULT(yes)
3225                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3226         ], [
3227                 AC_MSG_RESULT(no)
3228         ])
3230         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3231         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3232         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3233         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3235         ORIG_CFLAGS="$CFLAGS"
3236         CFLAGS="-Werror -Wsign-conversion"
3238         AC_MSG_CHECKING(for getnameinfo with signed flags)
3239         AC_TRY_COMPILE([
3240                 #include <sys/types.h>
3241                 #include <netdb.h>
3242         ], [
3243                 const struct sockaddr *addr;
3244                 socklen_t addrlen;
3245                 char *host;
3246                 socklen_t hostlen;
3247                 char *serv;
3248                 socklen_t servlen;
3249                 int flags;
3250                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3251         ],[
3252                 AC_MSG_RESULT(yes)
3253                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3254         ], [
3255                 AC_MSG_RESULT(no)
3256         ])
3258         CFLAGS="$ORIG_CFLAGS"
3260         if test "x$host_linux" = "xyes"; then
3261                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3262         else
3263                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3264         fi
3266         ORIG_CFLAGS="$CFLAGS"
3267         CFLAGS="-Werror -Wsign-conversion"
3269         AC_MSG_CHECKING(for bind with unsigned addrlen)
3270         AC_TRY_COMPILE([
3271                 #include <sys/socket.h>
3272         ], [
3273                 int fd;
3274                 struct sockaddr* addr;
3275                 socklen_t addrLen;
3276                 bind(fd, addr, addrLen);
3277         ],[
3278                 AC_MSG_RESULT(yes)
3279                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3280         ], [
3281                 AC_MSG_RESULT(no)
3282         ])
3284         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3285         AC_TRY_COMPILE([
3286                 #include <netinet/in.h>
3287                 #include <netinet/tcp.h>
3288         ], [
3289                 struct ipv6_mreq opt;
3290                 unsigned int index = 0;
3291                 opt.ipv6mr_interface = index;
3292         ],[
3293                 AC_MSG_RESULT(yes)
3294                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3295         ], [
3296                 AC_MSG_RESULT(no)
3297         ])
3299         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3300         AC_TRY_COMPILE([
3301                 #include <sys/inotify.h>
3302         ], [
3303                 intptr_t fd;
3304                 uint32_t wd;
3305                 int result = inotify_rm_watch(fd, wd);
3306         ],[
3307                 AC_MSG_RESULT(yes)
3308                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3309         ], [
3310                 AC_MSG_RESULT(no)
3311         ])
3313         CFLAGS="$ORIG_CFLAGS"
3315         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3316         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3317                 AC_MSG_RESULT(no)
3318         elif test "x$cross_compiling" = "xyes"; then
3319                 AC_MSG_RESULT(cross compiling, assuming yes)
3320                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3321         else
3322                 AC_TRY_RUN([
3323                         #include <sys/mman.h>
3324                         #include <fcntl.h>
3325                         #include <unistd.h>
3327                         int main ()
3328                         {
3329                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3330                                 if (fd == -1)
3331                                         return -1;
3333                                 shm_unlink("/mono_configure_shm_open");
3335                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3336                                 //       on at least the current version of Mac OS X
3338                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3339                                         return -1;
3341                                 return 0;
3342                         }
3343                 ],[
3344                         AC_MSG_RESULT(yes)
3345                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3346                 ], [
3347                         AC_MSG_RESULT(no)
3348                 ])
3349         fi
3351         AC_MSG_CHECKING(for getpriority with int who)
3352         AC_TRY_COMPILE([
3353                 #include <sys/resource.h>
3354         ], [
3355                 int which;
3356                 int who;
3357                 int result = getpriority(which, who);
3358         ],[
3359                 AC_MSG_RESULT(yes)
3360                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3361         ], [
3362                 AC_MSG_RESULT(no)
3363         ])
3365         AC_MSG_CHECKING(for kevent with int parameters)
3366         AC_TRY_COMPILE([
3367                 #include <sys/types.h>
3368                 #include <sys/event.h>
3369         ], [
3370                 int kg;
3371                 const struct kevent* chagelist;
3372                 int nchanges;
3373                 struct kevent* eventlist;
3374                 int nevents;
3375                 const struct timespec* timeout;
3376                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3377         ],[
3378                 AC_MSG_RESULT(yes)
3379                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3380         ], [
3381                 AC_MSG_RESULT(no)
3382         ])
3384         ORIG_CFLAGS="$CFLAGS"
3385         CFLAGS="-Werror -Wimplicit-function-declaration"
3387         AC_MSG_CHECKING(for mkstemps)
3388         AC_TRY_COMPILE([
3389                 #include <stdlib.h>
3390                 #include <unistd.h>
3391                 #include <string.h>
3392         ], [
3393                 char *template;
3394                 int suffixlen;
3395                 int result = mkstemps(template, suffixlen);
3396         ],[
3397                 AC_MSG_RESULT(yes)
3398                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3399                 have_mkstemps=yes
3400         ], [
3401                 AC_MSG_RESULT(no)
3402         ])
3404         CFLAGS="$ORIG_CFLAGS"
3406         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3407                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3408         fi
3410         AC_MSG_CHECKING(for tcp/var.h)
3411         AC_TRY_COMPILE([
3412                 #include <sys/types.h>
3413                 #include <sys/socketvar.h>
3414                 #include <netinet/ip.h>
3415                 #include <netinet/tcp.h>
3416                 #include <netinet/tcp_var.h>
3417         ], [
3418         ],[
3419                 AC_MSG_RESULT(yes)
3420                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3421         ], [
3422                 AC_MSG_RESULT(no)
3423         ])
3425         AC_CHECK_HEADERS([sys/cdefs.h])
3427         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3428         AC_TRY_COMPILE([
3429                 #ifdef HAVE_SYS_CDEFS_H
3430                 #include <sys/cdefs.h>
3431                 #endif
3432                 #include <netinet/tcp.h>
3433         ], [
3434                 int result = TCP_ESTABLISHED;
3435         ],[
3436                 AC_MSG_RESULT(yes)
3437                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3438         ], [
3439                 AC_MSG_RESULT(no)
3440         ])
3442         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3444         AC_MSG_CHECKING(for struct rt_msghdr)
3445         AC_TRY_COMPILE([
3446                 #include <sys/types.h>
3447                 #include <net/route.h>
3448         ], [
3449                 struct rt_msghdr;
3450         ],[
3451                 AC_MSG_RESULT(yes)
3452                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3453         ], [
3454                 AC_MSG_RESULT(no)
3455         ])
3457         AC_CHECK_HEADERS([sys/sysctl.h])
3458         AC_CHECK_HEADERS([linux/rtnetlink.h])
3460         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3461         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3462         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3464         ORIG_CFLAGS="$CFLAGS"
3465         CFLAGS="-Werror -Weverything"
3467         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3468         AC_TRY_COMPILE([
3469                 #include <unistd.h>
3470         ], [
3471                 size_t namelen = 20;
3472                 char name[20];
3473                 int result = getdomainname(name, namelen);
3474         ],[
3475                 AC_MSG_RESULT(yes)
3476                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3477         ], [
3478                 AC_MSG_RESULT(no)
3479         ])
3481         CFLAGS="$ORIG_CFLAGS"
3483         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3484         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3485         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3487         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
3488                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3489         elif test "x$host_linux" = "xyes"; then
3490                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3491         fi
3493         AC_CHECK_HEADERS([crt_externs.h])
3495         AC_MSG_CHECKING(for _NSGetEnviron)
3496         AC_TRY_COMPILE([
3497                 #include <crt_externs.h>
3498         ], [
3499                 char **result = *(_NSGetEnviron());
3500         ],[
3501                 AC_MSG_RESULT(yes)
3502                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3503         ], [
3504                 AC_MSG_RESULT(no)
3505         ])
3507         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3509 else
3510         dnl *********************************
3511         dnl *** Checks for Windows compilation ***
3512         dnl *********************************
3513         AC_CHECK_HEADERS(winternl.h)
3515         jdk_headers_found=no
3516         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3517         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3518         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3519         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3520         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3521         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3522         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3524         dnl *********************************
3525         dnl *** Check for struct ip_mreqn ***
3526         dnl *********************************
3527         AC_MSG_CHECKING(for struct ip_mreqn)
3528         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3529                 struct ip_mreqn mreq;
3530                 mreq.imr_address.s_addr = 0;
3531         ], [
3532                 # Yes, we have it...
3533                 AC_MSG_RESULT(yes)
3534                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3535         ], [
3536                 # We'll just have to try and use struct ip_mreq
3537                 AC_MSG_RESULT(no)
3538                 AC_MSG_CHECKING(for struct ip_mreq)
3539                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3540                         struct ip_mreq mreq;
3541                         mreq.imr_interface.s_addr = 0;
3542                 ], [
3543                         # Yes, we have it...
3544                         AC_MSG_RESULT(yes)
3545                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3546                 ], [
3547                         # No multicast support
3548                         AC_MSG_RESULT(no)
3549                 ])
3550         ])
3552         dnl **********************************
3553         dnl *** Check for getaddrinfo ***
3554         dnl **********************************
3555         AC_MSG_CHECKING(for getaddrinfo)
3556                 AC_TRY_LINK([
3557                 #include <stdio.h>
3558                 #include <winsock2.h>
3559                 #include <ws2tcpip.h>
3560         ], [
3561                 getaddrinfo(NULL,NULL,NULL,NULL);
3562         ], [
3563                 # Yes, we have it...
3564                 AC_MSG_RESULT(yes)
3565                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3566         ], [
3567                 AC_MSG_RESULT(no)
3568         ])
3570         dnl **********************************
3571         dnl *** Check for gethostbyname ***
3572         dnl **********************************
3573         AC_MSG_CHECKING(for gethostbyname)
3574                 AC_TRY_LINK([
3575                 #include <stdio.h>
3576                 #include <winsock2.h>
3577                 #include <ws2tcpip.h>
3578         ], [
3579                 gethostbyname(NULL);
3580         ], [
3581                 # Yes, we have it...
3582                 AC_MSG_RESULT(yes)
3583                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3584         ], [
3585                 AC_MSG_RESULT(no)
3586         ])
3588         dnl **********************************
3589         dnl *** Check for getprotobyname ***
3590         dnl **********************************
3591         AC_MSG_CHECKING(for getprotobyname)
3592                 AC_TRY_LINK([
3593                 #include <stdio.h>
3594                 #include <winsock2.h>
3595                 #include <ws2tcpip.h>
3596         ], [
3597                 getprotobyname(NULL);
3598         ], [
3599                 # Yes, we have it...
3600                 AC_MSG_RESULT(yes)
3601                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3602         ], [
3603                 AC_MSG_RESULT(no)
3604         ])
3606         dnl **********************************
3607         dnl *** Check for getnameinfo ***
3608         dnl **********************************
3609         AC_MSG_CHECKING(for getnameinfo)
3610                 AC_TRY_LINK([
3611                 #include <stdio.h>
3612                 #include <winsock2.h>
3613                 #include <ws2tcpip.h>
3614         ], [
3615                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3616         ], [
3617                 # Yes, we have it...
3618                 AC_MSG_RESULT(yes)
3619                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3620         ], [
3621                 AC_MSG_RESULT(no)
3622         ])
3624         dnl **********************************
3625         dnl *** Check for inet_ntop ***
3626         dnl **********************************
3627         AC_MSG_CHECKING(for inet_ntop)
3628                 AC_TRY_LINK([
3629                 #include <stdio.h>
3630                 #include <winsock2.h>
3631                 #include <ws2tcpip.h>
3632         ], [
3633                 inet_ntop (0, NULL, NULL, 0);
3634         ], [
3635                 # Yes, we have it...
3636                 AC_MSG_RESULT(yes)
3637                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3638         ], [
3639                 AC_MSG_RESULT(no)
3640         ])
3642         dnl **********************************
3643         dnl *** Check for inet_pton ***
3644         dnl **********************************
3645         AC_MSG_CHECKING(for inet_pton)
3646                 AC_TRY_LINK([
3647                 #include <stdio.h>
3648                 #include <winsock2.h>
3649                 #include <ws2tcpip.h>
3650         ], [
3651                 #ifndef inet_pton
3652                 (void) inet_pton;
3653                 #endif
3654                 inet_pton (0, NULL, NULL);
3655         ], [
3656                 # Yes, we have it...
3657                 AC_MSG_RESULT(yes)
3658                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3659         ], [
3660                 AC_MSG_RESULT(no)
3661         ])
3663         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3664         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3665         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3666         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3667         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3668         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3669         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3672 dnl socklen_t check
3673 AC_MSG_CHECKING(for socklen_t)
3674 AC_TRY_COMPILE([
3675 #include <sys/types.h>
3676 #include <sys/socket.h>
3678   socklen_t foo;
3680 ac_cv_c_socklen_t=yes
3681         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3682         AC_MSG_RESULT(yes)
3684         AC_MSG_RESULT(no)
3687 AC_CHECK_FUNCS(execvp)
3689 dnl ****************************
3690 dnl *** Look for /dev/random ***
3691 dnl ****************************
3693 AC_MSG_CHECKING([if usage of random device is requested])
3694 AC_ARG_ENABLE(dev-random,
3695 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3696 try_dev_random=$enableval, try_dev_random=yes)
3698 AC_MSG_RESULT($try_dev_random)
3700 case "{$build}" in
3702 dnl IBM i does not have /dev/random, use unblocking only
3704     *-*-os400*)
3705     NAME_DEV_RANDOM="/dev/urandom"
3706     ;;
3708 dnl Win32 does not have /dev/random, they have their own method...
3710     *-mingw*|*-*-cygwin*)
3711     ac_cv_have_dev_random=no
3712     ;;
3714 dnl Everywhere else, it's /dev/random
3716     *)
3717     NAME_DEV_RANDOM="/dev/random"
3718     ;;
3719 esac
3721 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3723 dnl Now check if the device actually exists
3725 if test "x$try_dev_random" = "xyes"; then
3726     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3727     [if test -r "$NAME_DEV_RANDOM" ; then
3728         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3729     if test "x$ac_cv_have_dev_random" = "xyes"; then
3730         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3731     fi
3732 else
3733     AC_MSG_CHECKING(for random device)
3734     ac_cv_have_dev_random=no
3735     AC_MSG_RESULT(has been disabled)
3738 if test "x$host_win32" = "xyes"; then
3739     AC_DEFINE(HAVE_CRYPT_RNG)
3742 if test "x$ac_cv_have_dev_random" = "xno" \
3743     && test "x$host_win32" = "xno"; then
3744     AC_MSG_WARN([[
3746 *** A system-provided entropy source was not found on this system.
3747 *** Because of this, the System.Security.Cryptography random number generator
3748 *** will throw a NotImplemented exception.
3750 *** If you are seeing this message, and you know your system DOES have an
3751 *** entropy collection in place, please report an issue on GitHub and
3752 *** provide information about the system and how to access the random device.
3754 *** Otherwise you can install either egd or prngd and set the environment
3755 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3756 ***]])
3759 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)
3761 AC_MSG_CHECKING([if big-arrays are to be enabled])
3762 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)
3763 if test "x$enable_big_arrays" = "xyes" ; then
3764     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3765         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3766     else
3767         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3768     fi
3770 AC_MSG_RESULT($enable_big_arrays)
3772 dnl **************
3773 dnl *** DTRACE ***
3774 dnl **************
3776 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3778 if test "x$enable_dtrace" = "xyes"; then
3779    if test "x$has_dtrace" = "xno"; then
3780           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3781    fi
3782    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3783    if test "x$DTRACE" = "xno"; then
3784           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3785           enable_dtrace=no
3786    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3787           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3788           enable_dtrace=no
3789    fi
3792 dtrace_g=no
3793 if test "x$enable_dtrace" = "xyes"; then
3794         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3795         DTRACEFLAGS=
3796         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3797                 case "$host" in
3798                         powerpc-*-darwin*)
3799                         DTRACEFLAGS="-arch ppc64"
3800                         ;;
3801                         i*86-*-darwin*)
3802                         DTRACEFLAGS="-arch x86_64"
3803                         ;;
3804                         *)
3805                         DTRACEFLAGS=-64
3806                         ;;
3807                 esac
3808         else
3809                 case "$host" in
3810                         powerpc-*-darwin*)
3811                         DTRACEFLAGS="-arch ppc"
3812                         ;;
3813                         i*86-*-darwin*)
3814                         DTRACEFLAGS="-arch i386"
3815                         ;;
3816                         *)
3817                         DTRACEFLAGS=-32
3818                         ;;
3819                 esac
3820         fi
3821         AC_SUBST(DTRACEFLAGS)
3822         case "$host" in
3823                 *-*-solaris*)
3824                 dtrace_g=yes
3825                 ;;
3826         esac
3827         AC_CHECK_HEADERS([sys/sdt.h])
3829 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3830 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3832 dnl **************************
3833 dnl *** AOT cross offsets  ***
3834 dnl **************************
3836 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3837     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3839 dnl **************
3840 dnl ***  LLVM  ***
3841 dnl **************
3843 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3844 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3845 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)
3846 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3847 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3849 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3851 if test "x$enable_llvm" = "xdefault"; then
3852    enable_llvm=$enable_llvm_default
3855 enable_llvm_msvc_only="no"
3856 if test "x$enable_llvm" = "xyes"; then
3857         if test "x$host_win32" = "xyes"; then
3858                 if test "x$cross_compiling" = "xno"; then
3859                         case "$target" in
3860                         x86_64*)
3861                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3862                                 enable_llvm_msvc_only="yes"
3863                                 ;;
3864                         i686*)
3865                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3866                                 ;;
3867                         esac
3868                 fi
3869                 if test "x$enable_loadedllvm" = "xyes"; then
3870                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3871                         enable_loadedllvm=no
3872                 fi
3873         fi
3876 internal_llvm="no"
3877 if test "x$enable_llvm" = "xyes"; then
3878         if test "x$with_llvm" != "x"; then
3879                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3880                 if test x$host_win32 = xyes; then
3881                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3882                 fi
3883                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3884                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3885                 fi
3886         else
3887                 if test x$host_win32 = xyes; then
3888                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3889                 else
3890                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3891                 fi
3892                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3893                         internal_llvm=yes
3894                 fi
3895         fi
3897         LLVM_CODEGEN_LIBS="x86codegen"
3898         case "$target" in
3899         arm*)
3900                 LLVM_CODEGEN_LIBS="armcodegen"
3901                 ;;
3902         aarch64*)
3903                 LLVM_CODEGEN_LIBS="aarch64codegen"
3904                 ;;
3905         powerpc*)
3906                 LLVM_CODEGEN_LIBS="powerpccodegen"
3907                 ;;
3908         esac
3909         if test "x$host" != "x$target"; then
3910                 # No need for jit libs
3911                 LLVM_CODEGEN_LIBS=
3912         fi
3914         AC_SUBST(LLVM_CODEGEN_LIBS)
3915         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3917         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3918                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3919                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3920         fi
3921         if test "x$enable_llvm_msvc_only" != "xyes"; then
3922                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3923         else
3924                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
3925         fi
3926 fi # ENABLE_LLVM
3928 # AC_DEFINE necessary for correct restore behavior on Linux
3929 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3930 if test "x$internal_llvm" != "xno"; then
3931         if test "x$enable_llvm_msvc_only" != "xyes"; then
3932                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3933         else
3934                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
3935         fi
3938 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3939 if test "x$enable_llvm_asserts" != "xno"; then
3940         if test "x$enable_llvm_msvc_only" != "xyes"; then
3941                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3942         else
3943                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
3944         fi
3947 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
3949 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
3950 if test "x$enable_loadedllvm" = "xyes"; then
3951         if test "x$enable_llvm_msvc_only" != "xyes"; then
3952                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3953         fi
3956 if test "x$enable_llvm" = "xyes"; then
3957         enable_llvm_runtime=yes
3960 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
3961 if test "x$enable_llvm_runtime" = "xyes"; then
3962         if test "x$enable_llvm_msvc_only" != "xyes"; then
3963                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3964         else
3965                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
3966         fi
3969 TARGET="unknown"
3970 ACCESS_UNALIGNED="yes"
3972 LIBC="libc.so.6"
3973 INTL="libc.so.6"
3974 SQLITE="libsqlite.so.0"
3975 SQLITE3="libsqlite3.so.0"
3976 X11="libX11.so"
3977 GDKX11="libgdk-x11-2.0.so.0"
3978 GTKX11="libgtk-x11-2.0.so.0"
3979 XINERAMA="libXinerama.so.1"
3981 sizeof_register="SIZEOF_VOID_P"
3983 jit_wanted=true
3984 boehm_supported=true
3985 BTLS_SUPPORTED=no
3986 BTLS_PLATFORM=
3988 case "$host" in
3989         wasm32*)
3990                 TARGET=WASM
3991                 arch_target=wasm
3992                 BTLS_SUPPORTED=no
3993                 ACCESS_UNALIGNED="no"
3994                 with_tls=pthread
3995                 target_wasm=yes
3996                 ;;
3997         mips*)
3998                 TARGET=MIPS;
3999                 arch_target=mips;
4000                 with_tls=pthread;
4001                 ACCESS_UNALIGNED="no"
4003                 AC_MSG_CHECKING(for mips n32)
4004                 AC_TRY_COMPILE([],[
4005                 #if _MIPS_SIM != _ABIN32
4006                 #error Not mips n32
4007                 #endif
4008                 ],[
4009                 AC_MSG_RESULT(yes)
4010                 sizeof_register=8
4011                 ],[
4012                 AC_MSG_RESULT(no)
4013                 ])
4014                 ;;
4015         i*86-*-*)
4016                 TARGET=X86;
4017                 arch_target=x86;
4018                 case $host_os in
4019                   solaris*)
4020                         LIBC="libc.so"
4021                         INTL="libintl.so"
4022                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4023                                 TARGET=AMD64
4024                                 arch_target=amd64
4025                         fi
4027                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4028                         # int astruct __attribute__ ((visibility ("hidden")));
4029                         # void foo ()
4030                         # {
4031                         #       void *p = &astruct;
4032                         # }
4033                         # gcc -fPIC --shared -o libfoo.so foo.c
4034                         # yields:
4035                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4036                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4037                         have_visibility_hidden=no
4038                         ;;
4039                   mingw*|cygwin*)
4040                         have_visibility_hidden=no
4041                         BTLS_SUPPORTED=no
4042                         BTLS_PLATFORM=i386
4043                         ;;
4044                   haiku*)
4045                         LIBC=libroot.so
4046                         ;;
4047                   linux*)
4048                         AOT_SUPPORTED="yes"
4049                         BTLS_SUPPORTED=yes
4050                         BTLS_PLATFORM=i386
4051                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4052                         ;;
4053                   darwin*)
4054                         AOT_SUPPORTED="yes"
4055                         BTLS_SUPPORTED=yes
4056                         BTLS_PLATFORM=i386
4057                         ;;
4058                   openbsd*|freebsd*|kfreebsd-gnu*)
4059                         AOT_SUPPORTED="yes"
4060                         BTLS_SUPPORTED=yes
4061                         BTLS_PLATFORM=i386
4062                         ;;
4063                 esac
4064                 ;;
4065         x86_64-*-* | amd64-*-*)
4066                 TARGET=AMD64;
4067                 arch_target=amd64;
4068                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4069                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4070                         sizeof_register=8
4071                 fi
4072                 case $host_os in
4073                   linux*)
4074                         AOT_SUPPORTED="yes"
4075                         BTLS_SUPPORTED=yes
4076                         BTLS_PLATFORM=x86_64
4077                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4078                         ;;
4079                   darwin*)
4080                         AOT_SUPPORTED="yes"
4081                         BTLS_SUPPORTED=yes
4082                         BTLS_PLATFORM=x86_64
4083                         boehm_supported=false
4084                         ;;
4085                   openbsd*|freebsd*|kfreebsd-gnu*)
4086                         AOT_SUPPORTED="yes"
4087                         BTLS_SUPPORTED=yes
4088                         BTLS_PLATFORM=x86_64
4089                         ;;
4090                   mingw*|cygwin*)
4091                         BTLS_SUPPORTED=no
4092                         BTLS_PLATFORM=x86_64
4093                         ;;
4094                 esac
4095                 ;;
4096         sparc*-*-*)
4097                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4098                    TARGET=SPARC64
4099                 else
4100                         TARGET=SPARC
4101                 fi
4102                 arch_target=sparc;
4103                 ACCESS_UNALIGNED="no"
4104                 case $host_os in
4105                   linux*) ;;
4106                   *)
4107                         LIBC="libc.so"
4108                         INTL="libintl.so"
4109                 esac
4110                 if test x"$GCC" = xyes; then
4111                         # We don't support v8 cpus
4112                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4113                 fi
4114                 if test x"$AR" = xfalse; then
4115                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4116                 fi
4117                 ;;
4118         *-mingw*|*-*-cygwin*)
4119                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4120                 have_visibility_hidden=no
4121                 INTL="intl"
4122                 case "$host" in
4123                         x86_64*mingw*)
4124                                 # Old Boehm fails to compile for x86_64-mingw.
4125                                 # It is trivial to fix, but just silently drop it.
4126                                 boehm_supported=false
4127                                 ;;
4128                 esac
4129                 ;;
4130         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4131         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4132         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4133                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4134                         TARGET=POWERPC64;
4135                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4136                         if ! (echo $CC | grep -q -- 'clang'); then
4137                                 CFLAGS="$CFLAGS -mminimal-toc"
4138                         fi
4139                 else
4140                         TARGET=POWERPC;
4141                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4142                 fi
4143                 arch_target=ppc;
4144                 case $host_os in
4145                   aix*|os400*)
4146                         BTLS_SUPPORTED=yes
4147                         BTLS_PLATFORM=powerpc
4148                         dnl on AIX/PASE, shared libraries can be inside archives
4149                         dnl if they are, we specify them by lib.a(lib.so)
4150                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4151                         LIBC="libc.a(shr_64.o)"
4152                         INTL="libintl.a(libintl.so.8)"
4153                         ;;
4154                   linux*)
4155                         BTLS_SUPPORTED=yes
4156                         BTLS_PLATFORM=powerpc
4157                         ;;
4158                 esac
4159                 ;;
4160         armv7k-*-darwin*)
4161                 TARGET=ARM;
4162                 TARGET_SYS=WATCHOS
4163                 arch_target=arm;
4164                 arm_fpu=VFP_HARD
4165                 ACCESS_UNALIGNED="no"
4166                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4167                 ;;
4169         arm*-darwin*)
4170                 TARGET=ARM;
4171                 arch_target=arm;
4172                 ACCESS_UNALIGNED="no"
4173                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4174                 ;;
4175         arm*-linux*)
4176                 TARGET=ARM;
4177                 arch_target=arm;
4178                 ACCESS_UNALIGNED="no"
4179                 AOT_SUPPORTED="yes"
4180                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4181                 BTLS_SUPPORTED=yes
4182                 BTLS_PLATFORM=arm
4183                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4184                 case "$target" in
4185                 arm*-linux*-gnueabi)
4186                         BTLS_PLATFORM=armsoft
4187                         ;;
4188                 esac
4189                 ;;
4190         arm*-netbsd*-eabi*)
4191                 TARGET=ARM;
4192                 arch_target=arm;
4193                 ACCESS_UNALIGNED="no"
4194                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4195                 ;;
4196         aarch64-*darwin*ilp32)
4197                 TARGET=ARM64;
4198                 arch_target=arm64
4199                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4200                 sizeof_register=8
4201                 # assuming no other target other than watchOS is using aarch64*darwin triple
4202                 TARGET_SYS=WATCHOS
4203                 ;;
4204         aarch64-*)
4205                 # https://lkml.org/lkml/2012/7/15/133
4206                 TARGET=ARM64
4207                 arch_target=arm64
4208                 boehm_supported=false
4209                 AOT_SUPPORTED="yes"
4210                 BTLS_SUPPORTED=yes
4211                 BTLS_PLATFORM=aarch64
4212                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4213                 ;;
4214         s390x-*-linux*)
4215                 TARGET=S390X;
4216                 arch_target=s390x;
4217                 ACCESS_UNALIGNED="yes"
4218                 BTLS_SUPPORTED=yes
4219                 BTLS_PLATFORM=s390x
4220                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4221                 ;;
4222         riscv32-*)
4223                 TARGET=RISCV32
4224                 ACCESS_UNALIGNED=no
4225                 AOT_SUPPORTED=no
4226                 BTLS_SUPPORTED=yes
4227                 BTLS_PLATFORM=riscv32
4228                 arch_target=riscv32
4229                 boehm_supported=false
4230                 ;;
4231         riscv64*)
4232                 TARGET=RISCV64
4233                 ACCESS_UNALIGNED=no
4234                 AOT_SUPPORTED=no
4235                 BTLS_SUPPORTED=yes
4236                 BTLS_PLATFORM=riscv64
4237                 arch_target=riscv64
4238                 boehm_supported=false
4239                 ;;
4240 esac
4242 HOST=$TARGET
4244 if test "x$host" != "x$target"; then
4245    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4246    enable_mcs_build=no
4247    enable_support_build=no
4248    BTLS_SUPPORTED=no
4249    # Can't use tls, since it depends on the runtime detection of tls offsets
4250    # in mono-compiler.h
4251    with_tls=pthread
4252    target_mach=no
4253    case "$target" in
4254    wasm32*)
4255                 TARGET=WASM
4256                 arch_target=wasm
4257                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4258                 ;;
4259    arm*-darwin*)
4260                 TARGET=ARM;
4261                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4262                 case "$target" in
4263                 armv7k-*)
4264                         arm_fpu=VFP_HARD
4265                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4266                         ;;
4267                 esac            
4268                 ;;
4269    powerpc64-ps3-linux-gnu)
4270                 TARGET=POWERPC64
4271                 arch_target=powerpc64
4272                 AC_DEFINE(TARGET_PS3, 1, [...])
4273                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4274                 # uses this define
4275                 AC_DEFINE(__mono_ppc64__, 1, [...])
4276                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4277                 sizeof_register=8
4278                 target_byte_order=G_BIG_ENDIAN
4279                 ;;
4280    powerpc64-xbox360-linux-gnu)
4281                 TARGET=POWERPC64
4282                 arch_target=powerpc64
4283                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4284                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4285                 # uses this define
4286                 sizeof_register=8
4287                 target_byte_order=G_BIG_ENDIAN
4288                 ;;
4289    arm*-linux-*)
4290                 TARGET=ARM;
4291                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4292                 ;;
4293    arm*-netbsd*-eabi*)
4294                 TARGET=ARM;
4295                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4296                 ;;
4297    i686*-linux-*)
4298                 TARGET=X86;
4299                 ;;
4300    i*86-apple-*)
4301                 TARGET=X86;
4302                 ;;
4303    x86_64*-linux-*)
4304                 TARGET=AMD64;
4305                 ;;
4306    x86_64-ps4-freebsd)
4307                 TARGET=AMD64;
4308                 AC_DEFINE(TARGET_PS4, 1, [...])
4309                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4310                 CPPFLAGS="$CPPFLAGS"
4311                 target_win32=no
4312                 ;;
4313    aarch64*-linux-*)
4314                 TARGET=ARM64;
4315                 ;;
4316         aarch64-*)
4317                 TARGET=ARM64
4318                 ;;
4319         riscv32*)
4320                 TARGET=RISCV32
4321                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4322                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4323                 arch_target=riscv32
4324                 target_mach=no
4325                 with_tls=pthread
4326                 ;;
4327         riscv64*)
4328                 TARGET=RISCV64
4329                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4330                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4331                 arch_target=riscv64
4332                 target_mach=no
4333                 with_tls=pthread
4334                 ;;
4335         *)
4336                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4337         esac
4339         case "$target" in
4340         *-darwin*)
4341                 target_mach=yes
4342                 ;;
4343         *-linux-android*)
4344                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4345                 ;;
4346         esac
4349 case "$TARGET" in
4350 WASM)
4351         AC_DEFINE(TARGET_WASM, 1, [...])
4352         arch_target=wasm
4353         ;;
4354 X86)
4355         AC_DEFINE(TARGET_X86, 1, [...])
4356         arch_target=x86
4357         ;;
4358 AMD64)
4359         AC_DEFINE(TARGET_AMD64, 1, [...])
4360         arch_target=amd64
4361         ;;
4362 ARM)
4363         AC_DEFINE(TARGET_ARM, 1, [...])
4364         arch_target=arm
4365         ACCESS_UNALIGNED="no"
4366         ;;
4367 ARM64)
4368         AC_DEFINE(TARGET_ARM64, 1, [...])
4369         arch_target=arm64
4370         ;;
4371 POWERPC)
4372         AC_DEFINE(TARGET_POWERPC, 1, [...])
4373         ;;
4374 POWERPC64)
4375         AC_DEFINE(TARGET_POWERPC, 1, [...])
4376         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4377         ;;
4378 S390X)
4379         AC_DEFINE(TARGET_S390X, 1, [...])
4380         ;;
4381 MIPS)
4382         AC_DEFINE(TARGET_MIPS, 1, [...])
4383         ;;
4384 SPARC)
4385         AC_DEFINE(TARGET_SPARC, 1, [...])
4386         ;;
4387 SPARC64)
4388         AC_DEFINE(TARGET_SPARC64, 1, [...])
4389         ;;
4390 RISCV32)
4391         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4392         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4393         ;;
4394 RISCV64)
4395         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4396         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4397         ;;
4398 esac
4400 case "$TARGET" in
4401 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4402     target_sizeof_void_p=4
4403     ;;
4404 *64* | S390X)
4405     target_sizeof_void_p=8
4406     ;;
4408     AC_MSG_ERROR([unknown target])
4409     ;;
4410 esac
4412 case "$HOST" in
4413 WASM)
4414         AC_DEFINE(HOST_WASM, 1, [...])
4415         ;;
4416 X86)
4417         AC_DEFINE(HOST_X86, 1, [...])
4418         ;;
4419 AMD64)
4420         AC_DEFINE(HOST_AMD64, 1, [...])
4421         ;;
4422 ARM)
4423         AC_DEFINE(HOST_ARM, 1, [...])
4424         ;;
4425 ARM64)
4426         AC_DEFINE(HOST_ARM64, 1, [...])
4427         ;;
4428 POWERPC)
4429         AC_DEFINE(HOST_POWERPC, 1, [...])
4430         ;;
4431 POWERPC64)
4432         AC_DEFINE(HOST_POWERPC, 1, [...])
4433         AC_DEFINE(HOST_POWERPC64, 1, [...])
4434         ;;
4435 S390X)
4436         AC_DEFINE(HOST_S390X, 1, [...])
4437         ;;
4438 MIPS)
4439         AC_DEFINE(HOST_MIPS, 1, [...])
4440         ;;
4441 SPARC)
4442         AC_DEFINE(HOST_SPARC, 1, [...])
4443         ;;
4444 SPARC64)
4445         AC_DEFINE(HOST_SPARC64, 1, [...])
4446         ;;
4447 RISCV32)
4448         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4449         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4450         ;;
4451 RISCV64)
4452         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4453         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4454         ;;
4455 esac
4457 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4458 case "$HOST" in
4459 X86 | AMD64 | ARM | ARM64)
4460         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4461         ;;
4462 esac
4464 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4465 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4467 dnl *************
4468 dnl *** VTUNE ***
4469 dnl *************
4471 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4472 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4474 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4476 if test "x$enable_vtune" = "xyes"; then
4477         if test "x$with_vtune" = "x"; then
4478                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4479         else
4480                 VTUNE_PATH=$with_vtune
4481         fi
4482         VTUNE_INCLUDE=$VTUNE_PATH/include
4483         case "$TARGET" in
4484         X86)
4485                 VTUNE_LIB=$VTUNE_PATH/lib32
4486                 ;;
4487         AMD64)
4488                 VTUNE_LIB=$VTUNE_PATH/lib64
4489                 ;;
4490         *)
4491                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4492                 ;;
4493         esac
4494         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4495                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4496         fi
4497         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4498                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4499         fi
4501         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4502         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4504         AC_SUBST(VTUNE_LIBS)
4505         AC_SUBST(VTUNE_CFLAGS)
4507 dnl Use GCC atomic ops if they work on the target.
4508 if test x$GCC = "xyes"; then
4509         case $TARGET in
4510         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4511                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4512                 ;;
4513         esac
4516 if test "x$target_mach" = "xyes"; then
4518    if test "x$TARGET_SYS" = "xWATCHOS"; then
4519           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4520           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4521           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4522           BTLS_SUPPORTED=no
4523    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4524           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4525           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4526           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4527           BTLS_SUPPORTED=no
4528           target_ios=yes
4529    else
4530        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4531        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4532        #error fail this for ios
4533        #endif
4534        ], [
4535                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4536           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4537           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4538           target_osx=yes
4539        ], [
4540           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4541           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4542           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4543           BTLS_SUPPORTED=no
4544                   target_ios=yes
4545        ])
4546         fi
4547    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4550 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4552 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4554 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4555    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4556 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4557    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4558 else
4559    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4562 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4564 if test "x$sizeof_register" = "x4"; then
4565   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4566 elif test "x$sizeof_register" = "x8"; then
4567   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4568 else
4569   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4572 if test "x$have_visibility_hidden" = "xyes"; then
4573    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4576 if test "x$have_deprecated" = "xyes"; then
4577    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4580 dnl 
4581 dnl Simple Generational checks (sgen)
4583 SGEN_DEFINES=
4584 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4585 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4586 if test x$buildsgen = xyes; then
4587    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4588    SGEN_DEFINES="-DHAVE_SGEN_GC"
4590         conc_gc_msg=""
4591    if test x$with_sgen_default_concurrent != xno; then
4592        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4593            conc_gc_msg=" (concurrent by default)"
4594    fi
4596    if test "x$gc_msg" = "x"; then
4597       gc_msg="sgen$conc_gc_msg"
4598    else
4599       gc_msg="sgen$conc_gc_msg and $gc_msg"
4600    fi
4602 AC_SUBST(SGEN_DEFINES)
4603 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4605 jit_status="Building and using the JIT"
4607 libsuffix=".so"
4609 case "$host" in
4610      *-*-darwin*)
4611         libsuffix=".dylib"
4612         LIBC="libc.dylib"
4613         INTL="libintl.dylib"
4614         SQLITE="libsqlite.0.dylib"
4615         SQLITE3="libsqlite3.0.dylib"
4616         X11="libX11.dylib"
4617         GDKX11="libgdk-x11-2.0.dylib"
4618         GTKX11="libgtk-x11-2.0.dylib"
4619         ;;
4620      *-*-*netbsd*)
4621         LIBC="libc.so"
4622         INTL="libintl.so"
4623         SQLITE="libsqlite.so"
4624         SQLITE3="libsqlite3.so"
4625         ;;
4626      *-*-kfreebsd*-gnu)
4627         LIBC="libc.so.0.1"
4628         INTL="libc.so.0.1"
4629         X11="libX11.so.6"
4630         ;;
4631     *-*-*freebsd*)
4632         LIBC="libc.so.7"
4633         INTL="libintl.so"
4634         SQLITE="libsqlite.so"
4635         SQLITE3="libsqlite3.so"
4636         ;;
4637     *-*-*openbsd*)
4638         LIBC="libc.so"
4639         INTL="libintl.so"
4640         SQLITE="libsqlite.so"
4641         SQLITE3="libsqlite3.so"
4642         ;;
4643     *-*-*linux*)
4644         AC_PATH_X
4645         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4646         AC_MSG_CHECKING(for the soname of libX11.so)
4647         for i in $x_libraries $dlsearch_path; do
4648                 for r in 4 5 6; do
4649                         if test -f $i/libX11.so.$r; then
4650                                 X11=libX11.so.$r
4651                                 AC_MSG_RESULT($X11)
4652                         fi
4653                 done
4654         done
4655         
4656         if test "x$X11" = "xlibX11.so"; then
4657                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4658                 X11=libX11.so.6
4659         fi
4660         ;;
4661 esac
4663 AC_SUBST(libsuffix)
4665 ######################################
4666 # EGLIB CHECKS
4667 ######################################
4669 GNUC_PRETTY=
4670 GNUC_UNUSED=
4671 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4672 if test x$GCC = xyes; then
4673    GNUC_UNUSED='__attribute__((__unused__))'
4674    GNUC_NORETURN='__attribute__((__noreturn__))'
4675    case $host_cpu in
4676      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4677    esac
4679 AC_SUBST(GNUC_PRETTY)
4680 AC_SUBST(GNUC_UNUSED)
4681 AC_SUBST(GNUC_NORETURN)
4682 AC_SUBST(BREAKPOINT)
4684 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4686 case $host in
4687 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4688     PATHSEP='\\'
4689     SEARCHSEP=';'
4690     OS="WIN32"
4691     PIDTYPE='void *'
4692     ;;
4694     PATHSEP='/'
4695     SEARCHSEP=':'
4696     OS="UNIX"
4697     PIDTYPE='int'
4698     ;;
4699 esac
4701 case $host in
4702         *-*-solaris*)
4703         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4704         ;;
4705 esac
4707 case $target in
4708 arm*-darwin*|aarch64*-*|riscv*)
4709     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4710     ;;
4711 i*86-*-darwin*)
4712     ORDER=G_LITTLE_ENDIAN
4713     ;;
4714 *-*-haiku*)
4715     LDFLAGS="$LDFLAGS -ltextencoding"
4716     ;;
4717 *-*-openbsd*)
4718     CFLAGS="$CFLAGS -pthread"
4719     LDFLAGS="$LDFLAGS -pthread"
4720     ;;
4721 esac
4723 AC_SUBST(ORDER)
4724 AC_SUBST(CFLAGS)
4725 AC_SUBST(PATHSEP)
4726 AC_SUBST(SEARCHSEP)
4727 AC_SUBST(OS)
4728 AC_SUBST(PIDTYPE)
4730 # Defined for all targets/platforms using classic Windows API support.
4731 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4732 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4734 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4735 AC_CHECK_FUNCS(getrlimit)
4736 AC_CHECK_FUNCS(fork execv execve)
4737 AC_CHECK_FUNCS(waitpid)
4739 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4741 if test x$with_overridable_allocators = xyes; then
4742         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4743   AC_MSG_NOTICE([Overridable allocator support enabled])
4744 else
4745   AC_MSG_NOTICE([Overridable allocator support disabled])
4749 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4750 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4751 # removed once support for 10.6 is dropped.
4753 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4755 if test x$target_osx = xyes; then
4756 AC_CHECK_FUNCS(getpwuid_r)
4757 elif test x$target_ios = xno; then
4758 AC_CHECK_FUNCS(strndup getpwuid_r)
4761 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4763 AC_SEARCH_LIBS(sqrtf, m)
4765 # nanosleep may not be part of libc, also search it in other libraries
4766 AC_SEARCH_LIBS(nanosleep, rt)
4768 AC_SEARCH_LIBS(dlopen, dl)
4769 old_ldflags="${LDFLAGS}"
4770 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4771 if test $lt_cv_prog_gnu_ld = yes; then
4772         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4773 else
4774         case $host in
4775         *-*-aix*|*-*-os400*)
4776                 ;;
4777         *)
4778                 dnl Try to use export-dynamic anyways
4779                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4780                 ;;
4781         esac
4783 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4784 if test $found_export_dynamic = no; then
4785         LDFLAGS="${old_ldflags}"
4788 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4789 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4790 AC_CHECK_LIB(iconv, iconv_open)
4791 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4792 AC_SUBST(HAVE_ALLOCA_H)
4794 # Get the exact type of size_t, not just its size.
4795 # This is so we can find an exact printf format among u, lu, llu, I64u.
4796 # To avoid warnings about slight mismatches.
4797 # C99 runtime "zu" dependency is being avoided here.
4799 # We have to compile as C++ because C is too lenient
4800 # and lets the wrong thing compile, with warnings.
4802 # Note: "zu" or ifdef <something> have the advantage
4803 # of producing installable "biarch" headers. i.e. one Mac header
4804 # for Mac/x86 and Mac/amd64.
4806 AC_LANG_PUSH(C++)
4808 # Check long before int because it is the overwhelming Unix answer,
4809 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4811 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4813 AC_MSG_CHECKING(if size_t is unsigned long)
4814 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4815         #include <stddef.h>
4816         unsigned long *a = (size_t*)0;
4817 ])], [
4818         AC_MSG_RESULT(yes)
4819         AC_SUBST(GSIZE_FORMAT, '"lu"')
4820 ], [
4821         AC_MSG_RESULT(no)
4822         AC_MSG_CHECKING(if size_t is unsigned int)
4823         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4824                 #include <stddef.h>
4825                 unsigned *a = (size_t*)0;
4826         ])], [
4827                 AC_MSG_RESULT(yes)
4828                 AC_SUBST(GSIZE_FORMAT, '"u"')
4829         ], [
4830 # At this point the majority of systems have their answer,
4831 # and we descend into non-standard or new-standard territory.
4833 # Check __int64 first because I64 on some systems predates ll, enabling
4834 # new compiler/old runtime interop, and the types always have the same size.
4835                 AC_MSG_RESULT(no)
4836                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4837                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4838                         #include <stddef.h>
4839                         unsigned __int64 *a = (size_t*)0;
4840                 ])], [
4841                         AC_MSG_RESULT(yes)
4842                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4843                 ], [
4844                         AC_MSG_RESULT(no)
4845                         AC_MSG_CHECKING(if size_t is unsigned long long)
4846                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4847                                 #include <stddef.h>
4848                                 unsigned long long *a = (size_t*)0;
4849                         ])], [
4850                                 AC_MSG_RESULT(yes)
4851                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4852                         ], [
4853                                 AC_MSG_RESULT(no)
4854                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4855                         ] )
4856                 ] )
4857         ] )
4858 ] )
4860 AC_LANG_POP
4862 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4863 # This provides for an exact match with functions that
4864 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4865 # uintptr_t is not necessarily the same.
4867 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4868 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4870 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4871    GSIZE="size_t"
4872    GSSIZE="ptrdiff_t"
4873 else
4874    GSIZE="uintptr_t"
4875    GSSIZE="intptr_t"
4878 AC_SUBST(GSIZE)
4879 AC_SUBST(GSSIZE)
4880 AC_SUBST(GSIZE_FORMAT)
4883 # END OF EGLIB CHECKS
4886 AC_ARG_WITH([libgdiplus],
4887         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4888         [], [with_libgdiplus=installed])
4890 # default install location
4891 libgdiplus_install_loc=libgdiplus${libsuffix}
4892 case "$host" in
4893     *-*-*linux*)
4894     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4895     ;;
4896 esac
4898 case $with_libgdiplus in
4899     no)
4900     libgdiplus_loc=
4901     ;;
4903     installed)
4904     libgdiplus_loc=
4905     if test x$cross_compiling = xno; then
4906         if test x$host_darwin = xyes; then
4907             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4908             if test -x $a; then
4909               libgdiplus_install_loc=$a
4910               libgdiplus_loc=$a
4911             fi
4912         fi
4913     fi
4914     ;;
4916     yes|sibling)
4917     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4918     ;;
4920     /*) # absolute path, assume it is an install location
4921     libgdiplus_loc=$with_libgdiplus
4922     libgdiplus_install_loc=$with_libgdiplus
4923     ;;
4925     *)
4926     libgdiplus_loc=`pwd`/$with_libgdiplus
4927     ;;
4928 esac
4929 AC_SUBST(libgdiplus_loc)
4930 AC_SUBST(libgdiplus_install_loc)
4932 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)
4933 if test "x$icall_symbol_map" = "xyes"; then
4934    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4937 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4938 if test "x$icall_export" = "xyes"; then
4939    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4942 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4943 if test "x$icall_tables" = "xno"; then
4944    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4947 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4949 if test "x$with_tls" = "x__thread"; then
4950         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4951         # Pass the information to libgc
4952         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4953         AC_MSG_CHECKING(if the tls_model attribute is supported)
4954         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4955                 ], [
4956                         AC_MSG_RESULT(yes)
4957                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4958                 ], [
4959                         AC_MSG_RESULT(no)
4960         ])
4963 if test ${TARGET} = ARM; then
4964         dnl ******************************************
4965         dnl *** Check to see what FPU is available ***
4966         dnl ******************************************
4967         AC_MSG_CHECKING(which FPU to use)
4969         #
4970         # This is a bit tricky:
4971         #
4972         # if (__ARM_PCS_VFP) {
4973         #       /* mfloat-abi=hard == VFP with hard ABI */
4974         # } elif (!__SOFTFP__) {
4975         #       /* mfloat-abi=softfp == VFP with soft ABI */
4976         # } else {
4977         #       /* mfloat-abi=soft == no VFP */
4978         # }
4979         #
4980         # The exception is iOS (w/ GCC) where none of the above
4981         # are defined (but iOS always uses the 'softfp' ABI).
4982         #
4983         # No support for FPA.
4984         #
4986         fpu=NONE
4988         # iOS GCC always uses the 'softfp' ABI.
4989         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4990                 fpu=VFP
4991         fi
4993         # Are we using the 'hard' ABI?
4994         if test x$fpu = xNONE; then
4995                 AC_TRY_COMPILE([], [
4996                         #ifndef __ARM_PCS_VFP
4997                         #error "Float ABI is not 'hard'"
4998                         #endif
4999                 ], [
5000                         fpu=VFP_HARD
5001                 ], [
5002                         fpu=NONE
5003                 ])
5004         fi
5006         # No 'hard' ABI. 'soft' or 'softfp'?
5007         if test x$fpu = xNONE; then
5008                 AC_TRY_COMPILE([], [
5009                         #ifdef __SOFTFP__
5010                         #error "Float ABI is not 'softfp'"
5011                         #endif
5012                 ], [
5013                         fpu=VFP
5014                 ], [
5015                         fpu=NONE
5016                 ])
5017         fi
5019         if test x$arm_fpu != x; then
5020            fpu=$arm_fpu
5021         fi
5023         AC_MSG_RESULT($fpu)
5024         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5025         unset fpu
5027         dnl *********************************************
5028         dnl *** Check which ARM version(s) we can use ***
5029         dnl *********************************************
5030         AC_MSG_CHECKING(which ARM version to use)
5032         AC_TRY_COMPILE([], [
5033                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5034                 #error Not on ARM v5.
5035                 #endif
5036         ], [
5037                 arm_v5=yes
5039                 arm_ver=ARMv5
5040         ], [])
5042         AC_TRY_COMPILE([], [
5043                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5044                 #error Not on ARM v6.
5045                 #endif
5046         ], [
5047                 arm_v5=yes
5048                 arm_v6=yes
5050                 arm_ver=ARMv6
5051         ], [])
5053         AC_TRY_COMPILE([], [
5054                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5055                 #error Not on ARM v7.
5056                 #endif
5057         ], [
5058                 arm_v5=yes
5059                 arm_v6=yes
5060                 arm_v7=yes
5062                 arm_ver=ARMv7
5063         ], [])
5065         AC_MSG_RESULT($arm_ver)
5067         if test x$arm_v5 = xyes; then
5068                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5069                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5070         fi
5072         if test x$arm_v6 = xyes; then
5073                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5074                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5075         fi
5077         if test x$arm_v7 = xyes; then
5078                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5079                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5080         fi
5083 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5084         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5086         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5088         if test x$fpabi = xauto; then
5089                 AC_TRY_COMPILE([], [
5090                         #ifdef __riscv_float_abi_double
5091                         #error "double"
5092                         #endif
5093                 ], [
5094                         fpabi=auto
5095                 ], [
5096                         fpabi=double
5097                 ])
5098         fi
5100         if test x$fpabi = xauto; then
5101                 AC_TRY_COMPILE([], [
5102                         #ifdef __riscv_float_abi_single
5103                         #error "single"
5104                         #endif
5105                 ], [
5106                         fpabi=auto
5107                 ], [
5108                         fpabi=single
5109                 ])
5110         fi
5112         if test x$fpabi = xauto; then
5113                 AC_TRY_COMPILE([], [
5114                         #ifdef __riscv_float_abi_soft
5115                         #error "soft"
5116                         #endif
5117                 ], [
5118                         fpabi=auto
5119                 ], [
5120                         fpabi=soft
5121                 ])
5122         fi
5124         case $fpabi in
5125         double)
5126                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5127                 AC_MSG_RESULT([double-precision])
5128                 ;;
5129         single)
5130                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5131                 AC_MSG_ERROR([single-precision, not supported])
5132                 ;;
5133         soft)
5134                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5135                 AC_MSG_RESULT([soft float])
5136                 ;;
5137         auto)
5138                 AC_MSG_ERROR([unknown])
5139                 ;;
5140         *)
5141                 AC_MSG_ERROR([invalid option: $fpabi])
5142                 ;;
5143         esac
5146 if test ${TARGET} = unknown; then
5147         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5148         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5151 if test "x$platform_android" = "xyes"; then
5152         case "x${TARGET}" in
5153         xARM)
5154                 case "x$arm_ver" in
5155                 xARMv5)
5156                         BTLS_SUPPORTED=yes
5157                         BTLS_PLATFORM=android-armv5
5158                         ;;
5159                 xARMv6)
5160                         BTLS_SUPPORTED=yes
5161                         BTLS_PLATFORM=android-armv6
5162                         ;;
5163                 xARMv7)
5164                         BTLS_SUPPORTED=yes
5165                         BTLS_PLATFORM=android-armv7
5166                         ;;
5167                 *)
5168                         BTLS_SUPPORTED=no
5169                         ;;
5170                 esac
5171                 ;;
5172         xARM64)
5173                 BTLS_SUPPORTED=yes
5174                 BTLS_PLATFORM=android-v8a
5175                 ;;
5176         xX86)
5177                 BTLS_SUPPORTED=yes
5178                 BTLS_PLATFORM=android-x86
5179                 ;;
5180         xAMD64)
5181                 BTLS_SUPPORTED=yes
5182                 BTLS_PLATFORM=android-x64
5183                 ;;
5184         *)
5185                 BTLS_SUPPORTED=no
5186                 ;;
5187         esac
5190 if test ${ACCESS_UNALIGNED} = no; then
5191         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5194 if test x$host_darwin = xyes; then
5195         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5196         AS_IF(
5197                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5198                 [AC_MSG_RESULT([no])],
5199                 [
5200                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5201                         AR_FLAGS="Scru"
5202                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5203                         AC_MSG_RESULT([yes])
5204                 ]
5205         )
5208 case "x$libgc" in
5209         xincluded)
5210                 # Pass CPPFLAGS to libgc configure
5211                 # We should use a separate variable for this to avoid passing useless and
5212                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5213                 # This should be executed late so we pick up the final version of CPPFLAGS
5214                 # The problem with this approach, is that during a reconfigure, the main
5215                 # configure scripts gets invoked with these arguments, so we use separate
5216                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5217                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5218                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5219                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5220                 fi
5221                 # Don't pass -finstrument-for-thread-suspension in, 
5222                 # if these are instrumented it will be very bad news 
5223                 # (infinite recursion, undefined parking behavior, etc)
5224                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5225                 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\""
5226                 if test "x$support_boehm" = "xyes"; then
5227                         AC_CONFIG_SUBDIRS(libgc)
5228                 fi
5229                 ;;
5230 esac
5232 MALLOC_MEMPOOLS=no
5233 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5234         if test x$with_malloc_mempools = xyes; then
5235                 MALLOC_MEMPOOLS=yes
5236                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5237         fi
5241 DISABLE_MCS_DOCS=default
5242 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5243         if test x$with_mcs_docs != xyes; then
5244                 DISABLE_MCS_DOCS=yes
5245         fi
5247 if test -n "$INSTALL_4_x_TRUE"; then :
5248         DISABLE_MCS_DOCS=yes
5250 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5251    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5254 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)],[
5255         if test x$with_lazy_gc_thread_creation != xno ; then
5256                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5257         fi
5258 ], [with_lazy_gc_thread_creation=no])
5260 dnl *****************************
5261 dnl *** Thread suspend policy ***
5262 dnl *****************************
5264 dnl Set a default hybrid or cooperative suspend on some platforms
5266 dnl Coop default is set by the bitcode preset.
5268 dnl If coop isn't on by default, maybe hybrid should be?
5269 if test x$enable_cooperative_suspend_default != xyes; then
5270         case $HOST in
5271         X86 | AMD64)
5272                 dnl Some host/target confusion, there's no host_osx (and
5273                 dnl host_darwin would be true on iOS not just macOS).
5274                 if test x$target_osx = xyes; then
5275                         enable_hybrid_suspend_default=yes
5276                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5277                         enable_hybrid_suspend_default=yes
5278                 fi
5279                 ;;
5280         esac
5283 dnl Now check if there were flags overriding the defaults
5285 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])
5286 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5288 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5289         enable_cooperative_suspend=$with_cooperative_gc
5292 if test x$enable_cooperative_suspend = xdefault; then
5293         enable_cooperative_suspend=$enable_cooperative_suspend_default
5296 if test x$enable_cooperative_suspend != xno; then
5297         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5300 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5302 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])
5304 if test x$enable_hybrid_suspend = xdefault; then
5305    enable_hybrid_suspend=$enable_hybrid_suspend_default
5308 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5309         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5312 if test x$enable_hybrid_suspend != xno ; then
5313         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5316 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5318 dnl End of thread suspend policy
5320 dnl ***************************
5321 dnl *** feature experiments ***
5322 dnl ***************************
5324 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5325 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5327         if test x$enable_experiment != x ; then
5328                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5329         fi
5330         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5331                 eval "mono_experiment_test_enable_$feature='yes'"
5332         done
5334         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5335                 eval "mono_experiment_test_enable_null='yes'"
5336                 true
5337         fi
5339         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5340                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5341         fi
5342 ],[])
5344 dnl **********************
5345 dnl *** checked builds ***
5346 dnl **********************
5348 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],[
5350         if test x$enable_checked_build != x ; then
5351                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5352         fi
5353         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5354                 eval "mono_checked_build_test_enable_$feature='yes'"
5355         done
5357         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5358                 eval "mono_checked_build_test_enable_gc='yes'"
5359                 eval "mono_checked_build_test_enable_metadata='yes'"
5360                 eval "mono_checked_build_test_enable_thread='yes'"
5361                 eval "mono_checked_build_test_enable_private_types='yes'"
5362         fi
5364         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5365                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5366         fi
5368         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5369                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5370         fi
5372         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5373                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5374         fi
5376         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5377                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5378         fi
5379 ], [])
5381 dnl End of checked builds
5383 AC_CHECK_HEADER([malloc.h], 
5384                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5385                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5387 if test x"$GCC" = xyes; then
5388         # Implicit function declarations are not 64 bit safe
5389         # Do this late, since this causes lots of configure tests to fail
5390         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5391         # jay has a lot of implicit declarations
5392         JAY_CFLAGS="-Wno-implicit-function-declaration"
5395 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5396 # instead of libmono-static.a
5397 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5398    LIBMONO_LA=libmini-static.la
5399 else
5400    if test x$buildsgen = xyes; then
5401       LIBMONO_LA=libmonosgen-$API_VER.la
5402    else
5403       LIBMONO_LA=libmonoboehm-$API_VER.la
5404    fi
5406 AC_SUBST(LIBMONO_LA)
5408 dnl **************
5409 dnl ***  Btls  ***
5410 dnl **************
5412 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5413 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5414 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5415 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5416 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5417 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])
5419 if test "x$with_btls_android_api" = "x" ; then
5420         case "$BTLS_PLATFORM" in
5421                 android-armv5)
5422                         with_btls_android_api=16" ;;
5423                 android-armv6)
5424                         with_btls_android_api=16" ;;
5425                 android-armv7)
5426                         with_btls_android_api=16 ;;
5427                 android-v8a)
5428                         with_btls_android_api=21 ;;
5429                 android-x86)
5430                         with_btls_android_api=16 ;;
5431                 android-x64)
5432                         with_btls_android_api=21 ;;
5433         esac
5436 if test "x$enable_btls" = "xno"; then
5437    enable_btls_lib=no
5440 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5442 btls_android=no
5443 if test "x$enable_btls" = "xyes"; then
5444         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5445         if test "x$CMAKE" = "xno"; then
5446                 AC_MSG_ERROR("cmake not found")
5447         fi
5449         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5450         AC_SUBST(BTLS_ROOT)
5452         btls_arch=
5453         btls_cflags=
5454         BTLS_CMAKE_ARGS=
5456         if test "x$host_win32" = "xyes"; then
5457                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5458         fi
5460         case "$BTLS_PLATFORM" in
5461         i386)
5462                 btls_arch=i386
5463                 btls_cflags="-m32"
5464                 case $host_os in
5465                         darwin*)
5466                                 btls_cflags="$btls_cflags -arch i386"
5467                                 ;;
5468                         mingw*|cygwin*)
5469                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5470                                 if test "x$HAVE_YASM" != "xyes"; then
5471                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5472                                 fi
5473                                 ;;
5474                 esac
5475                 ;;
5476         x86_64)
5477                 btls_arch=x86_64
5478                 case $host_os in
5479                         mingw*|cygwin*)
5480                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5481                                 if test "x$HAVE_YASM" != "xyes"; then
5482                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5483                                 fi
5484                                 ;;
5485                 esac
5486                 ;;
5487         arm)
5488                 btls_arch=arm
5489                 btls_cflags="-DOPENSSL_NO_ASM=1"
5490                 ;;
5491         armsoft)
5492                 btls_arch=arm
5493                 btls_cflags="-DOPENSSL_NO_ASM=1"
5494                 ;;
5495         aarch64)
5496                 btls_arch=aarch64
5497                 btls_cflags="-march=armv8-a+crypto"
5498                 ;;
5499         s390x)
5500                 btls_arch=s390x
5501                 ;;
5502         powerpc)
5503                 btls_arch=powerpc
5504                 case $host_os in
5505                         aix*|os400*)
5506                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5507                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5508                 esac
5509                 ;;
5510         android-armv5)
5511                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5512                 ;;
5513         android-armv6)
5514                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5515                 ;;
5516         android-armv7)
5517                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5518                 ;;
5519         android-v8a)
5520                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5521                 ;;
5522         android-x86)
5523                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5524                 ;;
5525         android-x64)
5526                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5527                 ;;
5528         riscv32)
5529                 btls_arch=riscv32
5530                 ;;
5531         riscv64)
5532                 btls_arch=riscv64
5533                 ;;
5534         *)
5535                 AC_MSG_ERROR(Invalid BTLS platform)
5536         esac
5538         if test "x$platform_android" = "xyes"; then
5539                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5540                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5541                 fi
5543                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5544                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5545                 fi
5547                 btls_android=yes
5548                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5549                 if test "x$with_btls_android_ndk" != "x"; then
5550                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5551                 else
5552                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5553                 fi
5554         fi
5556         if test "x$btls_arch" != "x"; then
5557                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5558         fi
5560         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5561         AC_SUBST(BTLS_ARCH)
5562         AC_SUBST(BTLS_CFLAGS)
5563         AC_SUBST(BTLS_PLATFORM)
5564         AC_SUBST(BTLS_CMAKE_ARGS)
5566         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5567 else
5568         enable_btls=no
5571 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5573 if test x$DISABLE_MCS_DOCS = xyes; then
5574    docs_dir=""
5575 else
5576    docs_dir=docs
5578 AC_SUBST(docs_dir)
5580 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5581 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5582 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5584 libmono_ldflags="$libmono_ldflags $LIBS"
5586 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5587 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5588 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5589 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5590 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5591 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5592 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5593 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5594 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5595 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5596 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5597 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5598 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5599 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5600 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5601 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5602 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5603 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5604 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5605 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5606 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5607 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5608 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5609 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5611 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5613 AC_SUBST(LIBC)
5614 AC_SUBST(INTL)
5615 AC_SUBST(SQLITE)
5616 AC_SUBST(SQLITE3)
5617 AC_SUBST(X11)
5618 AC_SUBST(GDKX11)
5619 AC_SUBST(GTKX11)
5620 AC_SUBST(XINERAMA)
5621 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5622 AC_SUBST(arch_target)
5623 AC_SUBST(CFLAGS)
5624 AC_SUBST(CPPFLAGS)
5625 AC_SUBST(LDFLAGS)
5627 #This must always be defined when building the runtime
5628 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5630 mono_build_root=`pwd`
5631 AC_SUBST(mono_build_root)
5633 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5634 if test x$host_win32 = xno; then
5635         if test x$enable_msvc = xyes; then
5636                 echo "Error, --enable-msvc only supported for Windows builds."
5637                 exit 1
5638         fi
5640 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5642 if test "x$enable_msvc" = "xyes"; then
5643         if test "x$support_boehm" = "xyes"; then
5644                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5645                 exit 1
5646         fi
5647         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5648         if test "x$host_cpu" = "xi686"; then
5649                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5650                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5651                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5652         else
5653                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5654                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5655                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5656         fi
5657         AC_SUBST(mono_msvc_build_dir)
5658         AC_SUBST(mono_msvc_build_lib_dir)
5659         AC_SUBST(mono_msvc_build_bin_dir)
5660 else
5661         mono_runtime=mono/mini/mono
5664 AC_SUBST(mono_runtime)
5666 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5668 if test $csc_compiler = mcs; then
5669   CSC=$mcs_topdir/class/lib/build/mcs.exe
5670 else
5671   CSC=$CSC_LOCATION
5674 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5676 mono_cfg_root=$mono_build_root/runtime
5677 if test x$host_win32 = xyes; then
5678   if test "x$cross_compiling" = "xno"; then
5679     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5680     CSC=`cygpath -m -a $CSC`
5681     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5682   else
5683     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5684   fi
5685 else
5686   mono_cfg_dir=$mono_cfg_root/etc
5689 if test "x$platform_android" = "xyes"; then
5690   mono_cfg_dir=
5693 AC_SUBST(mono_cfg_dir)
5695 AC_SUBST(CSC)
5697 AC_CONFIG_FILES([po/mcs/Makefile.in])
5699 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5700 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5701 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5703 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5704 [   depth=../../../..
5705     case $srcdir in
5706     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5707     .) reldir=$depth ;;
5708     *) reldir=$depth/$srcdir ;;
5709     esac
5710     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5711     cd runtime/etc/mono/1.0
5712     rm -f machine.config
5713     $LN_S $reldir/data/net_1_1/machine.config machine.config
5714     cd $depth
5715 ],[LN_S='$LN_S'])
5717 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5718 [   depth=../../../..
5719     case $srcdir in
5720     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5721     .) reldir=$depth ;;
5722     *) reldir=$depth/$srcdir ;;
5723     esac
5724     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5725     cd runtime/etc/mono/2.0
5726     rm -f machine.config
5727     $LN_S $reldir/data/net_2_0/machine.config machine.config
5728     cd $depth
5729 ],[LN_S='$LN_S'])
5731 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5732 [   depth=../../../..
5733     case $srcdir in
5734     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5735     .) reldir=$depth ;;
5736     *) reldir=$depth/$srcdir ;;
5737     esac
5738     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5739     cd runtime/etc/mono/2.0
5740     rm -f web.config
5741     $LN_S $reldir/data/net_2_0/web.config web.config
5742     cd $depth
5743 ],[LN_S='$LN_S'])
5745 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5746 [   depth=../../..
5747     case $srcdir in
5748     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5749     .) reldir=$depth ;;
5750     *) reldir=$depth/$srcdir ;;
5751     esac
5752     $ac_aux_dir/install-sh -d runtime/etc/mono/
5753     cd runtime/etc/mono/
5754     rm -f browscap.ini
5755     $LN_S $reldir/data/browscap.ini browscap.ini
5756     cd $depth
5757 ],[LN_S='$LN_S'])
5759 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5760 [   depth=../../../../..
5761     case $srcdir in
5762     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5763     .) reldir=$depth ;;
5764     *) reldir=$depth/$srcdir ;;
5765     esac
5766     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5767     cd runtime/etc/mono/2.0/Browsers
5768     rm -f Compat.browser
5769     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5770     cd $depth
5771 ],[LN_S='$LN_S'])
5773 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5774 [   depth=../../../../..
5775     case $srcdir in
5776     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5777     .) reldir=$depth ;;
5778     *) reldir=$depth/$srcdir ;;
5779     esac
5780     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5781     cd runtime/etc/mono/4.0/Browsers
5782     rm -f Compat.browser
5783     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5784     cd $depth
5785 ],[LN_S='$LN_S'])
5787 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5788 [   depth=../../../../..
5789     case $srcdir in
5790     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5791     .) reldir=$depth ;;
5792     *) reldir=$depth/$srcdir ;;
5793     esac
5794     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5795     cd runtime/etc/mono/4.5/Browsers
5796     rm -f Compat.browser
5797     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5798     cd $depth
5799 ],[LN_S='$LN_S'])
5801 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5802 [   depth=../../../..
5803     case $srcdir in
5804     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5805     .) reldir=$depth ;;
5806     *) reldir=$depth/$srcdir ;;
5807     esac
5808     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5809     cd runtime/etc/mono/4.0
5810     rm -f machine.config
5811     $LN_S $reldir/data/net_4_0/machine.config machine.config
5812     cd $depth
5813 ],[LN_S='$LN_S'])
5815 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5816 [   depth=../../../..
5817     case $srcdir in
5818     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5819     .) reldir=$depth ;;
5820     *) reldir=$depth/$srcdir ;;
5821     esac
5822     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5823     cd runtime/etc/mono/4.0
5824     rm -f web.config
5825     $LN_S $reldir/data/net_4_0/web.config web.config
5826     cd $depth
5827 ],[LN_S='$LN_S'])
5829 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5830 [   depth=../../../..
5831     case $srcdir in
5832     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5833     .) reldir=$depth ;;
5834     *) reldir=$depth/$srcdir ;;
5835     esac
5836     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5837     cd runtime/etc/mono/4.5
5838     rm -f machine.config
5839     $LN_S $reldir/data/net_4_5/machine.config machine.config
5840     cd $depth
5841 ],[LN_S='$LN_S'])
5843 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5844 [   depth=../../../..
5845     case $srcdir in
5846     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5847     .) reldir=$depth ;;
5848     *) reldir=$depth/$srcdir ;;
5849     esac
5850     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5851     cd runtime/etc/mono/4.5
5852     rm -f web.config
5853     $LN_S $reldir/data/net_4_5/web.config web.config
5854     cd $depth
5855 ],[LN_S='$LN_S'])
5857 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])
5858 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])
5859 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5861 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5862 if test x"$GCC" = xyes -a "x$with_jemalloc" != "xyes"; then
5864         # incompatible-pointer-types requires gcc circa 5.x
5866         ORIG_CFLAGS=$CFLAGS
5867         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5868         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5869         AC_TRY_COMPILE([],[
5870         ], [
5871                 AC_MSG_RESULT(yes)
5872                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5873         ], [
5874                 AC_MSG_RESULT(no)
5875                 CFLAGS=$ORIG_CFLAGS
5876         ])
5878         CFLAGS="$CFLAGS -Werror=return-type"
5882 # Mono.Native Support
5883 # -------------------
5884 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5885 # It is built as a stand-alone shared library and not bundled with the runtime because we
5886 # may need to build two different versions of it.
5888 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5889 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5891 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5892 # implementation accordingly.  We build a single `libmono_native` shared library.
5894 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5896 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5897 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5898 # depending on platform.
5900 # We build two versions of the shared library:
5901 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5902 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5904 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5905 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5906 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5908 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5909 # to verify that it's the correct version of it.
5912 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5913 if test x$target_osx = xyes; then
5914         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5915         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5916         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5917         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5918         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5919         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5920         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5921         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5922         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5924         mono_native=yes
5925         MONO_NATIVE_PLATFORM=macos
5926         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5927         AC_MSG_CHECKING([Mono.Native support])
5928         AC_MSG_RESULT(macos)
5930         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5931                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5933         if test x$mono_native_compat = xyes; then
5934                 mono_native_compat=yes
5935                 mono_native_text="Mac OSX (compat+unified)"
5936                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5937                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5938                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5939                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5940         else
5941                 mono_native_compat=no
5942                 mono_native_text="Mac OSX"
5943         fi
5944 elif test x$mono_native_platform_ios = xyes; then
5945         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5947         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5948                 if test x$mono_native_ios_sim = xyes; then
5949                         mono_native_ios_target=ios-simulator
5950                         mono_native_text="iOS Simulator"
5951                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5952                 else
5953                         mono_native_ios_target=iphoneos
5954                         mono_native_text="iOS Device"
5955                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5956                 fi
5957                 mono_native_unified_version="10.0"
5958                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5959         ], [
5960                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5961                         if test x$mono_native_ios_sim = xyes; then
5962                                 mono_native_ios_target=tvos-simulator
5963                                 mono_native_text="AppleTV Simulator"
5964                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5965                         else
5966                                 mono_native_ios_target=tvos
5967                                 mono_native_text="AppleTV Device"
5968                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5969                         fi
5970                         mono_native_unified_version="10.0"
5971                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5972                 ], [
5973                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5974                                 if test x$mono_native_ios_sim = xyes; then
5975                                         mono_native_ios_target=watchos-simulator
5976                                         mono_native_text="Apple Watch Simulator"
5977                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5978                                 else
5979                                         mono_native_ios_target=watchos
5980                                         mono_native_text="Apple Watch Device"
5981                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5982                                 fi
5983                                 mono_native_unified_version="5.0"
5984                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5985                         ], [
5986                                 AC_MSG_ERROR([Unknown iOS Target])
5987                         ])
5988                 ])
5989         ])
5991         AC_MSG_CHECKING([Mono.Native support])
5992         AC_MSG_RESULT([$mono_native_ios_target])
5994         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5996         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5997         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5999         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
6001         if test x$with_bitcode = xyes; then
6002                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6003                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6004         else
6005                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6006         fi
6008         if test x$enable_gss = xyes; then
6009                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6010         fi
6012         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
6013         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
6014         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
6015         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
6016         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
6017         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
6019         if test x$mono_native_compat = xyes; then
6020                 mono_native_text="$mono_native_text (compat+unified)"
6021                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
6022                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
6023                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6024                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6025         fi
6027         mono_native=yes
6028         MONO_NATIVE_PLATFORM=ios
6029 elif test x$host_linux = xyes; then
6030         mono_native_text="Linux"
6031         MONO_NATIVE_CC=$CC
6032         MONO_NATIVE_CXX=$CXX
6033         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6034         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6035         MONO_NATIVE_CFLAGS=$CFLAGS
6036         MONO_NATIVE_LDFLAGS=$LDFLAGS
6038         mono_native=yes
6039         mono_native_compat=no
6040         MONO_NATIVE_PLATFORM=linux
6041         AC_MSG_CHECKING([Mono.Native support])
6042         AC_MSG_RESULT(linux)
6044         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6045 elif test x$target_wasm = xyes; then
6046         mono_native_text="wasm"
6047         MONO_NATIVE_CC=$CC
6048         MONO_NATIVE_CXX=$CXX
6049         # The system.native code uses _WASM_ to check for wasm
6050         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6051         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6052         MONO_NATIVE_CFLAGS=$CFLAGS
6053         MONO_NATIVE_LDFLAGS=$LDFLAGS
6055         mono_native=yes
6056         mono_native_compat=no
6057         MONO_NATIVE_PLATFORM=linux
6058         AC_MSG_CHECKING([Mono.Native support])
6059         AC_MSG_RESULT(wasm)
6061         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6062 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6063         mono_native_text="AIX"
6064         MONO_NATIVE_CC=$CC
6065         MONO_NATIVE_CXX=$CXX
6066         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6067         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6068         MONO_NATIVE_CFLAGS=$CFLAGS
6069         MONO_NATIVE_LDFLAGS=$LDFLAGS
6071         mono_native=yes
6072         mono_native_compat=no
6073         MONO_NATIVE_PLATFORM=aix
6074         AC_MSG_CHECKING([Mono.Native support])
6075         AC_MSG_RESULT(aix)
6077         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6078 elif test x$platform_android = xyes; then
6079         mono_native_text="Android"
6080         MONO_NATIVE_CC=$CC
6081         MONO_NATIVE_CXX=$CXX
6082         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6083         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6084         MONO_NATIVE_CFLAGS=$CFLAGS
6085         MONO_NATIVE_LDFLAGS=$LDFLAGS
6087         mono_native=yes
6088         mono_native_compat=no
6089         MONO_NATIVE_PLATFORM=android
6090         AC_MSG_CHECKING([Mono.Native support])
6091         AC_MSG_RESULT(Android)
6093         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6094 else
6095         mono_native=no
6096         mono_native_text="no"
6097         AC_MSG_CHECKING([Mono.Native support])
6098         AC_MSG_RESULT(no)
6101 if test x$mono_native_compat = xyes; then
6102         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6103 else
6104         MONO_NATIVE_LIBRARY_NAME=libmono-native
6107 AC_SUBST(MONO_NATIVE_PLATFORM)
6108 AC_SUBST(MONO_NATIVE_CC)
6109 AC_SUBST(MONO_NATIVE_CXX)
6110 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6111 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6112 AC_SUBST(MONO_NATIVE_CFLAGS)
6113 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6114 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6115 AC_SUBST(MONO_NATIVE_LDFLAGS)
6116 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6117 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6118 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6119 AC_SUBST(MONO_NATIVE_LIBADD)
6121 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6122 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6123 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6124 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6125 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6126 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6127 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6129 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6130 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6131 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6132 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6133 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6135 # Update all submodules recursively to ensure everything is checked out
6136 (cd $srcdir && scripts/update_submodules.sh)
6138 AC_OUTPUT([
6139 Makefile
6140 mono-uninstalled.pc
6141 acceptance-tests/Makefile
6142 llvm/Makefile
6143 scripts/mono-find-provides
6144 scripts/mono-find-requires
6145 mk/Makefile
6146 mono/Makefile
6147 mono/btls/Makefile
6148 mono/native/Makefile
6149 mono/utils/Makefile
6150 mono/utils/jemalloc/Makefile
6151 mono/metadata/Makefile
6152 mono/dis/Makefile
6153 mono/cil/Makefile
6154 mono/arch/Makefile
6155 mono/arch/x86/Makefile
6156 mono/arch/amd64/Makefile
6157 mono/arch/ppc/Makefile
6158 mono/arch/sparc/Makefile
6159 mono/arch/s390x/Makefile
6160 mono/arch/arm/Makefile
6161 mono/arch/arm64/Makefile
6162 mono/arch/mips/Makefile
6163 mono/arch/riscv/Makefile
6164 mono/sgen/Makefile
6165 mono/native/platform-type.c
6166 mono/native/platform-type-compat.c
6167 mono/native/platform-type-unified.c
6168 mono/tests/Makefile
6169 mono/tests/assembly-load-reference/Makefile
6170 mono/tests/tests-config
6171 mono/tests/gc-descriptors/Makefile
6172 mono/tests/testing_gac/Makefile
6173 mono/tests/llvmonly-mixed/Makefile
6174 mono/unit-tests/Makefile
6175 mono/benchmark/Makefile
6176 mono/mini/Makefile
6177 mono/profiler/Makefile
6178 mono/eglib/Makefile
6179 mono/eglib/eglib-config.h
6180 mono/eglib/test/Makefile
6181 m4/Makefile
6182 ikvm-native/Makefile
6183 scripts/Makefile
6184 man/Makefile
6185 docs/Makefile
6186 data/Makefile
6187 data/net_2_0/Makefile
6188 data/net_4_0/Makefile
6189 data/net_4_5/Makefile
6190 data/net_2_0/Browsers/Makefile
6191 data/net_4_0/Browsers/Makefile
6192 data/net_4_5/Browsers/Makefile
6193 data/mint.pc
6194 data/mono-2.pc
6195 data/monosgen-2.pc
6196 data/mono.pc
6197 data/mono-cairo.pc
6198 data/mono-nunit.pc
6199 data/mono-options.pc
6200 data/mono-lineeditor.pc
6201 data/monodoc.pc
6202 data/dotnet.pc
6203 data/dotnet35.pc
6204 data/wcf.pc
6205 data/cecil.pc
6206 data/system.web.extensions_1.0.pc
6207 data/system.web.extensions.design_1.0.pc
6208 data/system.web.mvc.pc
6209 data/system.web.mvc2.pc
6210 data/system.web.mvc3.pc
6211 data/aspnetwebstack.pc
6212 data/reactive.pc
6213 samples/Makefile
6214 support/Makefile
6215 data/config
6216 tools/Makefile
6217 tools/locale-builder/Makefile
6218 tools/sgen/Makefile
6219 tools/monograph/Makefile
6220 tools/pedump/Makefile
6221 runtime/Makefile
6222 msvc/Makefile
6223 po/Makefile
6226 if test x$host_win32 = xyes; then
6227    # Get rid of 'cyg' prefixes in library names
6228    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6229    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6230    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6231    # executable doesn't work...
6232    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6235 if test x$host_darwin = xyes; then
6236    # This doesn't seem to be required and it slows down parallel builds
6237    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6241   case $prefix in
6242   NONE) prefix=$ac_default_prefix ;;
6243   esac
6244   case $exec_prefix in
6245   NONE) exec_prefix='${prefix}' ;;
6246   esac
6248   #
6249   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6250   # any existing config.make.  This allows people to share the same source tree
6251   # with different build directories, one native and one cross
6252   #
6253   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6255     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6257     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6258     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6259     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6260     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6261     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6262     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6263     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6264     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6265     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6267     case $INSTALL in
6268     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6269     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6270     esac
6272     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6274     export VERSION
6275     [myver=$($AWK 'BEGIN {
6276       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6277       if(length(vsplit [1]) > 4) {
6278         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6279       }
6280       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6281     }')]
6283     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6284     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6286     if test x$host_darwin = xyes; then
6287       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6288       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6289       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6290     elif test x$host_win32 = xyes; then
6291       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6292       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6293       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6294     elif test x$host_linux = xyes; then
6295       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6296       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6297       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6298     else
6299       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6300       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6301       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6302     fi
6304     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6305       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6306     fi
6308         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6309            enable_system_aot=yes
6310         fi
6312     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6313       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6314     fi
6316     if test x$DISABLE_MCS_DOCS = xyes; then
6317       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6318     fi
6320     if test x$has_extension_module != xno; then
6321         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6322     fi
6323     
6324     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6325     
6326     if test "x$test_bcl_opt" = "xyes"; then    
6327       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6328     fi
6330     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6332     if test $csc_compiler = mcs; then
6333       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6334     fi
6336     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6337       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6338       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6339       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6340     fi
6342     if test "x$AOT_MODE" != "x" ; then
6343       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6344     fi
6346     if test "x$enable_btls" = "xyes"; then
6347       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6348     fi
6350     if test "x$mono_native" = "xyes"; then
6351       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6352     else
6353       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6354     fi
6356     if test x$mono_native_compat = xyes; then
6357       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6358     else
6359       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6360     fi
6362     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6363     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6365   fi
6369 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6371 btls_platform_string=
6372 if test x$enable_btls = xyes; then
6373         if test x$btls_android = xyes; then
6374                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6375         else
6376                 btls_platform_string=" ($BTLS_PLATFORM)"
6377         fi
6380 thread_suspend_msg=
6381 if test x$buildsgen = xyes; then
6382         if test x$enable_cooperative_suspend != xno; then
6383                 thread_suspend_msg="Suspend:       Cooperative"
6384         elif test x$enable_hybrid_suspend != xno; then
6385                 thread_suspend_msg="Suspend:       Hybrid"
6386         else
6387                 thread_suspend_msg="Suspend:       Preemptive"
6388         fi
6390         
6391 echo "
6392         mcs source:    $mcsdir
6393         C# Compiler:   $csc_compiler
6395    Engine:
6396         Host:          $host
6397         Target:        $target
6398         GC:            $gc_msg 
6399         $thread_suspend_msg
6400         TLS:           $with_tls
6401         SIGALTSTACK:   $with_sigaltstack
6402         Engine:        $jit_status
6403         BigArrays:     $enable_big_arrays
6404         DTrace:        $enable_dtrace
6405         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6406         Spectre:       $spectre_mitigation_status
6407         Mono.Native:   $mono_native_text
6409    Libraries:
6410         .NET 4.x:        $with_profile4_x
6411         Xamarin.Android: $with_monodroid
6412         Xamarin.iOS:     $with_monotouch
6413         Xamarin.WatchOS: $with_monotouch_watch
6414         Xamarin.TVOS:    $with_monotouch_tv
6415         Xamarin.Mac:     $with_xammac
6416         Windows AOT:     $with_winaot
6417         Orbis:           $with_orbis
6418         Unreal:          $with_unreal
6419         WebAssembly:     $with_wasm
6420         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6421         JNI support:     $jdk_headers_found
6422         libgdiplus:      $libgdiplus_msg
6423         zlib:            $zlib_msg
6424         BTLS:            $enable_btls$btls_platform_string
6425         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6426         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6427         .NET Core:       $with_core
6428         $disabled
6430 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6431    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)