Bump binary-reference-assemblies
[mono-project.git] / configure.ac
blobb6b44d7237e4be81ec1ecab0c455df41f4c1063d
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [6.0.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-xz 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=9032116E-BB4E-4ED5-9C71-9E5E0B0230CA
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 if test -z "$HOST_WASM_TRUE"; then :
480 AC_DEFINE(HAVE_UTIME)
481 AC_DEFINE(HAVE_UTIMES)
484 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
486 AC_CHECK_TOOL(CC, gcc, gcc)
487 AC_PROG_CC
488 AC_CHECK_TOOL(CXX, g++, g++)
489 AC_PROG_CXX
490 AM_PROG_AS
491 AC_PROG_INSTALL
492 AC_PROG_AWK
493 AM_PROG_CC_C_O
494 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
495 : ${CCAS='$(CC)'}
496 # Set ASFLAGS if not already set.
497 : ${CCASFLAGS='$(CFLAGS)'}
498 AC_SUBST(CCAS)
499 AC_SUBST(CCASFLAGS)
501 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
502 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
503 if test "x$CXX" = "xg++"; then
504         if test "x$GXX" != "xyes"; then
505                 # automake/libtool is so broken, it requires g++ even if the c++ sources
506                 # are inside automake conditionals
507                 AC_MSG_ERROR([You need to install g++])
508         fi
511 dnl may require a specific autoconf version
512 dnl AC_PROG_CC_FOR_BUILD
513 dnl CC_FOR_BUILD not automatically detected
514 CC_FOR_BUILD=$CC
515 CFLAGS_FOR_BUILD=$CFLAGS
516 BUILD_EXEEXT=
517 if test "x$cross_compiling" = "xyes"; then
518         CC_FOR_BUILD=cc
519         CFLAGS_FOR_BUILD=
520         BUILD_EXEEXT=""
522 AC_SUBST(CC_FOR_BUILD)
523 AC_SUBST(CFLAGS_FOR_BUILD)
524 AC_SUBST(HOST_CC)
525 AC_SUBST(BUILD_EXEEXT)
527 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
528 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
530 # Set STDC_HEADERS
531 AC_HEADER_STDC
532 AC_LIBTOOL_WIN32_DLL
533 # This causes monodis to not link correctly
534 #AC_DISABLE_FAST_INSTALL
536 #lookup makedev() header
537 AC_HEADER_MAJOR
539 AM_PROG_LIBTOOL
540 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
541 DOLT
543 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
544 AC_SUBST(export_ldflags)
546 # Test whenever ld supports -version-script
547 AC_PROG_LD
548 AC_PROG_LD_GNU
550 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)
551 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)
552 AC_CHECK_HEADER(unistd.h, [HAVE_UNISTD_H=1], [HAVE_UNISTD_H=0])
553 AC_SUBST(HAVE_UNISTD_H)
554 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
555                   [], [], [#include <stddef.h>
556                   #include <sys/socket.h>
557                   #include <linux/socket.h>])
559 AC_CHECK_HEADERS(sys/user.h, [], [],
561 #ifdef HAVE_SYS_PARAM_H
562 # include <sys/param.h>
563 #endif
566 AC_CHECK_HEADERS(linux/serial.h)
568 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
569 if test x$have_zlib = xyes; then
570    AC_TRY_COMPILE([#include <zlib.h>], [
571    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
572    #else
573    #error No good zlib found
574    #endif
575    ],[
576         AC_MSG_RESULT(Using system zlib)
577         zlib_msg="system zlib"
578         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
579    ],[
580         AC_MSG_RESULT(Using embedded zlib)
581         have_zlib=no
582         zlib_msg="bundled zlib"
583    ])
586 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
587 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
589 # for mono/metadata/debug-symfile.c
590 AC_CHECK_HEADERS(elf.h)
592 # for support
593 AC_CHECK_HEADERS(poll.h)
594 AC_CHECK_HEADERS(sys/poll.h)
595 AC_CHECK_HEADERS(sys/wait.h)
596 AC_CHECK_HEADERS(grp.h)
597 AC_CHECK_HEADERS(syslog.h)
598 AC_CHECK_FUNCS(vsyslog)
600 # for mono/dis
601 AC_CHECK_HEADERS(wchar.h)
603 # for Linux statfs support
604 AC_CHECK_HEADERS(linux/magic.h)
606 # For Android NDK unified headers
607 if test x$platform_android = xyes; then
608         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
609         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
610         AC_CHECK_HEADERS(android/ndk-version.h)
612         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
613         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
614         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
615         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
616         # doesn't contain the required definitions (NDK 14)
617         if test x$have_android_signal_inlines = xyes; then
618                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
619                 AC_COMPILE_IFELSE([
620                         AC_LANG_PROGRAM([#include <signal.h>
621                                 #include <android/legacy_signal_inlines.h>],[
622                                 int i;
623                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
624                                 }
625                         ])],[
626                                 AC_MSG_RESULT(yes)
627                                 android_sigrtminmax_work=yes
628                         ],[
629                                 AC_MSG_RESULT(no)
630                                 android_sigrtminmax_work=no
631                         ]
632                 )
634                 if test x$android_sigrtminmax_work = xno; then
635                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
636                 fi
637         fi
639         # Attempt to detect whether we're using Android NDK unified headers
640         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
641         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
643         android_unified_headers=no
644         if test x$have_android_api_level = xyes; then
645                 if test x$have_android_versioning = xyes; then
646                         AC_MSG_CHECKING([whether using Android NDK unified headers])
648                         # Both macros are defined only in the NDK unified headers
649                         AC_COMPILE_IFELSE([
650                                 AC_LANG_PROGRAM([
651                                         #include <android/api-level.h>
652                                         #include <android/versioning.h>
653                                 ],[
654                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
655                                         #else
656                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
657                                         #endif
658                                 ])],[
659                                         AC_MSG_RESULT(yes)
660                                         android_unified_headers=yes
661                                 ],[
662                                         AC_MSG_RESULT(no)
663                                         android_unified_headers=no
664                                 ]
665                         )
666                 fi
667         fi
669         if test x$android_unified_headers = xyes; then
670                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
671         fi
672 fi # Android
674 # not 64 bit clean in cross-compile
675 AC_CHECK_SIZEOF(void *)
676 AC_CHECK_SIZEOF(long)
678 AC_CHECK_SIZEOF(int)
679 AC_CHECK_SIZEOF(long long)
681 AC_CACHE_CHECK([for clang],
682         mono_cv_clang,[
683         AC_TRY_COMPILE([], [
684                 #ifdef __clang__
685                 #else
686                 #error "FAILED"
687                 #endif
688         ],
689         [mono_cv_clang=yes],
690         [mono_cv_clang=no],
691         [])
694 AC_ARG_ENABLE(visibility-hidden,
695 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
696    disable_visibility_hidden=yes, disable_visibility_hidden=no)
698 WARN=''
699 if test x"$GCC" = xyes; then
700                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
701                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
703                 # We require C99 with some GNU extensions, e.g. `linux` macro
704                 CFLAGS="$CFLAGS -std=gnu99"
706                 # The runtime code does not respect ANSI C strict aliasing rules
707                 CFLAGS="$CFLAGS -fno-strict-aliasing"
709                 # We rely on signed overflow to behave
710                 CFLAGS="$CFLAGS -fwrapv"
712                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
713                 if test x"$disable_visibility_hidden" = xno; then
714                    # Don't export any symbols by default
715                    SHARED_CFLAGS="-fvisibility=hidden"
716                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
717                 fi
719                 ORIG_CFLAGS=$CFLAGS
720                 # Check for the normal version, since gcc ignores unknown -Wno options
721                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
722                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
723                 AC_TRY_COMPILE([],[
724                 ], [
725                    AC_MSG_RESULT(yes)
726                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
727                 ], [
728                    AC_MSG_RESULT(no)
729                    CFLAGS=$ORIG_CFLAGS
730                 ])
732                 if test "x$mono_cv_clang" = "xyes"; then
733                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
734                    WARN="$WARN -Qunused-arguments"
735                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
736                    # We rely on zero length arrays in structs
737                    WARN="$WARN -Wno-zero-length-array"
738                 fi
739 else
740         # The Sun Forte compiler complains about inline functions that access static variables
741         # so disable all inlining.
742         case "$host" in
743         *-*-solaris*)
744                 CFLAGS="$CFLAGS -Dinline="
745                 ;;
746         esac
748 CFLAGS="$WARN $CFLAGS -g"
749 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
750 CPPFLAGS="$WARN $CPPFLAGS -g"
752 # Where's the 'mcs' source tree?
753 if test -d $srcdir/mcs; then
754   mcsdir=mcs
755 else
756   mcsdir=../mcs
759 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
760         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
761                 mcsdir=$with_mcs_path
762         fi
765 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
767 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
768 if test x$with_core = xonly; then
769     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
770     with_runtime_preset=netcore
772 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
775 # A sanity check to catch cases where the package was unpacked
776 # with an ancient tar program (Solaris)
778 AC_ARG_ENABLE(solaris-tar-check,
779 [  --disable-solaris-tar-check    disable solaris tar check],
780    do_solaris_tar_check=no, do_solaris_tar_check=yes)
782 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
783         AC_MSG_CHECKING(integrity of package)
784         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
785         then
786                 AC_MSG_RESULT(ok)
787         else
788                 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"
789                 AC_MSG_ERROR([$errorm])
790         fi
793 if test "x$with_mcs_path" != "x"; then
794 mcs_topdir=$(cd "$mcsdir" && pwd)
795 mcs_topdir_from_srcdir=$mcs_topdir
796 else
797 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
798 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
801 # Convert mcs_topdir* paths to Windows syntax.
802 if test x$cross_compiling$host_win32 = xnoyes; then
803   mcs_topdir=$(cygpath -m $mcs_topdir)
804   case $mcs_topdir_from_srcdir in
805     /cygdrive/*)
806         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
807         ;;
808   esac
811 AC_SUBST([mcs_topdir])
812 AC_SUBST([mcs_topdir_from_srcdir])
814 # gettext: prepare the translation directories. 
815 # we do not configure the full gettext, as we consume it dynamically from C#
816 AM_PO_SUBDIRS
818 if test "x$USE_NLS" = "xyes"; then
819    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
821    if test "x$HAVE_MSGFMT" = "xno"; then
822           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
823    fi
826 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
828 pkg_config_path=
829 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
830         if test x$with_crosspkgdir = "x"; then
831                 if test -s $PKG_CONFIG_PATH; then
832                         pkg_config_path=$PKG_CONFIG_PATH
833                 fi
834         else
835                 pkg_config_path=$with_crosspkgdir
836                 PKG_CONFIG_PATH=$pkg_config_path
837                 export PKG_CONFIG_PATH
838         fi
841 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
842 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
843 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
845 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
846 if test x$werror_flag = xyes; then
847         WERROR_CFLAGS="-Werror"
849 AC_SUBST([WERROR_CFLAGS])
850 AC_SUBST([SHARED_CFLAGS])
852 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
853   
854 AC_SUBST(GLIB_CFLAGS)
856 # Enable support for fast thread-local storage
857 # Some systems have broken support, so we allow to disable it.
858 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
860 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
861 # This does not work on some platforms (bug #55253)
862 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
864 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
865 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
866 # Same as --with-shared_mono=no
867 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
869 if test "x$enable_static" = "xno"; then
870    with_static_mono=no
873 if test "x$enable_shared" = "xno"; then
874    with_shared_mono=no
877 if test "x$enable_libraries" = "xno"; then
878    with_shared_mono=no
881 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
883 if test "x$host_win32" = "xyes"; then
884    # Boehm GC requires the runtime to be in its own dll
885    with_static_mono=no
888 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
889 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
890 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
891 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
893 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
894 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
895         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
896         ORIG_CFLAGS=$CFLAGS
897         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
898         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
899         AC_TRY_COMPILE([], [
900         ], [
901            AC_MSG_RESULT(yes)
902            # Pass it to libgc as well
903            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
904         ], [
905            AC_MSG_RESULT(no)
906            CFLAGS=$ORIG_CFLAGS
907         ])
910 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
912 if test x$enable_small_config = xyes; then
913         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
914         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
917 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)
919 DISABLED_FEATURES=none
920 csc_compiler=default
921 endian=unknown
922 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
923 AC_MSG_CHECKING([CSharp compiler to use])
924 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
925    if test x$withval = xmcs; then
926        csc_compiler=mcs
927    elif test x$withval = xroslyn; then
928        csc_compiler=roslyn
929    elif test x$withval = xdefault; then
930        :
931    else
932        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
933    fi
934 ],[csc_compiler=default])
936 if test $csc_compiler = default; then
937    if test $endian = big; then
938       csc_compiler=mcs
939    elif test $endian = little; then
940       case "$host" in
941         powerpc*) csc_compiler=mcs ;;
942         *) csc_compiler=roslyn ;;
943       esac
944    else
945       csc_compiler=mcs
946    fi
948 AC_MSG_RESULT($csc_compiler)
950 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
951 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
952 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])
955 if test x$target_win32 = xyes; then
956 with_jemalloc=no
957 with_jemalloc_assert=no
958 with_jemalloc_always=no
961 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
962 if test "x$with_jemalloc_assert" = "xyes"; then
963 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
964 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
965 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
968 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
969 if test "x$with_jemalloc_always" = "xyes"; then
970 with_jemalloc=yes
971 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
972 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
973 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
976 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
977 if test "x$with_jemalloc" = "xyes"; then
978 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
979 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
980 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
982 if test "x$target_mach" = "xyes"; then
983         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
986 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
987 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
989 AC_SUBST(JEMALLOC_CFLAGS)
990 AC_SUBST(JEMALLOC_CPPFLAGS)
991 AC_SUBST(JEMALLOC_LDFLAGS)
992 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
995 # Terminology:
996 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
997 # MERP - The MS telemetry profile. Not for general use.
998 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
1000 # 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.
1002 #--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.
1003 #--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.
1004 #--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.
1005 #--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.
1007 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])
1008 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])
1009 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1011 if test "x$with_crash_privacy" = "xyes"; then
1012 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1015 if test "x$with_structured_crashes" = "xno"; then
1016 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1019 case "$host" in
1020         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1021                 crash_reporting=no
1022                 ;;
1023 esac
1025 if test "x$crash_reporting" != "xyes"; then
1026 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1027 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1030 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1031 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1033 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1034 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1036 if test x$enable_monodroid = xyes; then
1037         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1040 if test x$enable_monotouch = xyes; then
1041         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1044 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1046 # mono/corefx/native has a lot of invalid C++98 in its headers
1047 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1048 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1049 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1050 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1052 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1053 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1054 # and add it whenever we're running clang on Darwin.
1055 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1056         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1059 AC_SUBST(CXXFLAGS_COMMON)
1061 if test "x$enable_cxx" = "xyes"; then
1063         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1065         # -std=gnu99 -xc++ is not allowed and errors.
1066         CXX_REMOVE_CFLAGS=-std=gnu99
1067         # These give warnings and should be removed. They are C-only.
1068         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1069         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1070         # Likewise with CentOS 6 gcc 4.4.
1071         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1073         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1074         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1075         # generates a warning every time we run gcc which is very unsightly.
1076         # The warning is for e.g. sprintf(foo, "") which can just be
1077         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1078         # and completely legal and valid.
1079         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1080         # Alternatively, just run $CXX -xc++ -c /dev/null.
1081         AC_LANG_PUSH(C++)
1082         ORIG_CXXFLAGS=$CXXFLAGS
1083         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1084         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1085         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1086                                  [ AC_MSG_RESULT(no)
1087                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1088         CXXFLAGS=$ORIG_CXXFLAGS
1089         AC_LANG_POP(C++)
1091 AC_SUBST(CXX_ADD_CFLAGS)
1092 AC_SUBST(CXX_REMOVE_CFLAGS)
1095 # Set the build profiles and options before things which use them
1098 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])
1099 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1100 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1101 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])
1102 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])
1103 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1104 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1105 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])
1106 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])
1107 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])
1108 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1109 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1110 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1111 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1114 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,winaot,winaot_llvm,bitcode,bitcodeinterp,unreal,fullaotinterp,fullaotinterp_llvm  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1115 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])
1116 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])
1117 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])
1120 dnl Spectre compiler mitigation flag checks
1122 if test "x$with_spectre_mitigation" = "xyes"; then
1123    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1124    SPECTRE_CFLAGS=
1125    SPECTRE_INDIRECT_BRANCH_KIND=
1126    case "x$with_spectre_indirect_branch_choice" in
1127        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1128        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1129        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1130        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1131        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1132    esac
1134    SPECTRE_FUNCTION_RETURN_KIND=""
1135    case "x$with_spectre_function_return_choice" in
1136        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1137        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1138        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1139        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1140        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1141    esac
1143    AX_CHECK_COMPILE_FLAG(
1144         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1145         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1146    )
1148    AX_CHECK_COMPILE_FLAG(
1149         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1150         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1151    )
1153    if test "x$SPECTRE_CFLAGS" != "x" ; then
1154         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1155         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1156         spectre_mitigation_status="mitigation enabled"
1157    fi
1158 else
1159         spectre_mitigation_status="no mitigation"
1163 dnl Profile defaults
1165 TEST_PROFILE=default
1166 enable_llvm_default=no
1168 with_profile4_x_default=no
1169 with_monodroid_default=no
1170 with_monotouch_default=no
1171 with_monotouch_watch_default=no
1172 with_monotouch_tv_default=no
1173 with_xammac_default=no
1174 with_testing_aot_full_interp_default=no
1175 with_testing_aot_hybrid_default=no
1176 with_testing_aot_full_default=no
1177 with_winaot_default=no
1178 with_orbis_default=no
1179 with_unreal_default=no
1180 with_wasm_default=no
1182 with_bitcode_default=no
1183 enable_cooperative_suspend_default=no
1184 enable_hybrid_suspend_default=no
1186 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000,nftnptr-arg-trampolines=4000
1188 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1190 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1191    DISABLE_MCS_DOCS_default=yes
1192 elif test x$with_runtime_preset = xnetcore; then
1193    DISABLE_MCS_DOCS_default=yes
1195    mono_feature_disable_remoting='yes'
1196    mono_feature_disable_reflection_emit_save='yes'
1197    mono_feature_disable_appdomains='yes'
1198    disable_mono_native=yes
1199 elif test x$with_runtime_preset = xnet_4_x; then
1200    with_profile4_x_default=yes
1201    TEST_PROFILE=net_4_x
1202 elif test x$with_runtime_preset = xall; then
1203    with_profile4_x_default=yes
1204    with_monodroid_default=yes
1205    with_monotouch_default=yes
1206    with_monotouch_watch_default=yes
1207    with_monotouch_tv_default=yes
1208    with_xammac_default=yes
1209    with_winaot_default=yes
1210    with_orbis_default=yes
1211    with_unreal_default=yes
1212    with_wasm_default=yes
1213    with_testing_aot_full_interp_default=yes
1214    with_testing_aot_hybrid_default=yes
1215    with_testing_aot_full_default=yes
1216    TEST_PROFILE=net_4_x
1217 elif test x$with_runtime_preset = xbitcode; then
1218    DISABLE_MCS_DOCS_default=yes
1219    with_testing_aot_full_default=yes
1220    with_bitcode_default=yes
1221    enable_cooperative_suspend_default=yes
1222    # FIXME: use TEST_PROFILE=testing_aot_full
1223    TEST_PROFILE=testing_aot_bitcode
1224    enable_llvm_default=yes
1226    mono_feature_disable_com='yes'
1227    mono_feature_disable_remoting='yes'
1228    mono_feature_disable_reflection_emit_save='yes'
1229    mono_feature_disable_reflection_emit='yes'
1230    mono_feature_disable_appdomains='yes'
1232    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1233    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1234    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1235    AOT_MODE="llvmonly"
1236 elif test x$with_runtime_preset = xbitcodeinterp; then
1237    with_testing_aot_full_interp_default=yes
1238    with_bitcode_default=yes
1239    enable_cooperative_suspend_default=yes
1240    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1241    TEST_PROFILE=testing_aot_bitcode_interp
1242    enable_llvm_default=yes
1244    # mscorlib.dll aot compilation crashes
1245    mono_feature_disable_com='yes'
1247    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1248    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1249    AOT_RUN_FLAGS="--llvmonly-interp"
1250 elif test x$with_runtime_preset = xfullaot; then
1251    DISABLE_MCS_DOCS_default=yes
1252    with_testing_aot_full_default=yes
1253    TEST_PROFILE=testing_aot_full
1255    mono_feature_disable_com='yes'
1256    mono_feature_disable_remoting='yes'
1257    mono_feature_disable_reflection_emit_save='yes'
1258    mono_feature_disable_reflection_emit='yes'
1259    mono_feature_disable_appdomains='yes'
1261    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1262    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1263    AOT_MODE="full"
1264 elif test x$with_runtime_preset = xfullaot_llvm; then
1265    DISABLE_MCS_DOCS_default=yes
1266    with_testing_aot_full_default=yes
1267    TEST_PROFILE=testing_aot_full
1269    mono_feature_disable_com='yes'
1270    mono_feature_disable_remoting='yes'
1271    mono_feature_disable_reflection_emit_save='yes'
1272    mono_feature_disable_reflection_emit='yes'
1273    mono_feature_disable_appdomains='yes'
1275    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1276    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1277    AOT_MODE="full"
1278 elif test x$with_runtime_preset = xhybridaot; then
1279    DISABLE_MCS_DOCS_default=yes
1280    with_testing_aot_hybrid_default=yes
1281    TEST_PROFILE=testing_aot_hybrid 
1283    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1284    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1285 elif test x$with_runtime_preset = xhybridaot_llvm; then
1286    DISABLE_MCS_DOCS_default=yes
1287    with_testing_aot_hybrid_default=yes
1288    TEST_PROFILE=testing_aot_hybrid
1290    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1291    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1292 elif test x$with_runtime_preset = xfullaotinterp; then
1293    with_testing_aot_full_interp_default=yes
1294    TEST_PROFILE=testing_aot_full_interp
1296    # mscorlib.dll aot compilation crashes
1297    mono_feature_disable_com='yes'
1299    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1300    AOT_RUN_FLAGS="--full-aot-interp"
1301 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1302    with_testing_aot_full_interp_default=yes
1303    TEST_PROFILE=testing_aot_full_interp_llvm
1305    # mscorlib.dll aot compilation crashes
1306    mono_feature_disable_com='yes'
1308    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1309    AOT_RUN_FLAGS="--full-aot-interp"
1310 elif test x$with_runtime_preset = xaot; then
1311    with_profile4_x_default=yes
1313    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1314    AOT_RUN_FLAGS=""
1316    DISABLE_MCS_DOCS_default=yes
1317 elif test x$with_runtime_preset = xaot_llvm; then
1318    with_profile4_x_default=yes
1320    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1321    AOT_RUN_FLAGS=""
1323    DISABLE_MCS_DOCS_default=yes
1324 elif test x$with_runtime_preset = xwinaot; then
1325    DISABLE_MCS_DOCS_default=yes
1326    with_winaot_default=yes
1327    TEST_PROFILE=winaot
1329    mono_feature_disable_com='yes'
1330    mono_feature_disable_remoting='yes'
1331    mono_feature_disable_reflection_emit_save='yes'
1332    mono_feature_disable_reflection_emit='yes'
1333    mono_feature_disable_appdomains='yes'
1335    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1336    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1337    AOT_MODE="full"
1338 elif test x$with_runtime_preset = xwinaot_llvm; then
1339    DISABLE_MCS_DOCS_default=yes
1340    with_winaot_default=yes
1341    TEST_PROFILE=winaot
1343    mono_feature_disable_com='yes'
1344    mono_feature_disable_remoting='yes'
1345    mono_feature_disable_reflection_emit_save='yes'
1346    mono_feature_disable_reflection_emit='yes'
1347    mono_feature_disable_appdomains='yes'
1349    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1350    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1351    AOT_MODE="full"
1352 elif test x$with_runtime_preset = xorbis; then
1353    DISABLE_MCS_DOCS_default=yes
1354    with_orbis_default=yes
1355    TEST_PROFILE=orbis
1357    mono_feature_disable_com='yes'
1358    mono_feature_disable_remoting='yes'
1359    mono_feature_disable_reflection_emit_save='yes'
1360    mono_feature_disable_reflection_emit='yes'
1361    mono_feature_disable_appdomains='yes'
1363    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1364    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1365    AOT_MODE="full"
1366 elif test x$with_runtime_preset = xunreal; then
1367    DISABLE_MCS_DOCS_default=yes
1368    with_unreal_default=yes
1369    TEST_PROFILE=unreal
1371    mono_feature_disable_com='yes'
1372    mono_feature_disable_remoting='yes'
1373    mono_feature_disable_appdomains='no'
1375    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1376    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1377 elif test x$with_runtime_preset = xwasm; then
1378    DISABLE_MCS_DOCS_default=yes
1379    with_wasm_default=yes
1380    TEST_PROFILE=wasm
1382    mono_feature_disable_com='yes'
1383    mono_feature_disable_remoting='yes'
1384    mono_feature_disable_reflection_emit_save='yes'
1385    mono_feature_disable_reflection_emit='yes'
1386    mono_feature_disable_appdomains='yes'
1388    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1389    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1390 else
1391    TEST_PROFILE=net_4_x
1392    with_profile4_x_default=yes
1395 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1396    AC_SUBST(AOT_BUILD_FLAGS)
1397    AC_SUBST(AOT_RUN_FLAGS)
1398    # For llvmonlycheck + fullaotcheck
1399    AC_SUBST(INVARIANT_AOT_OPTIONS)
1402 AC_SUBST(TEST_PROFILE)
1404 if test "x$with_profile4_x" = "xdefault"; then
1405    with_profile4_x=$with_profile4_x_default
1407 if test "x$with_monodroid" = "xdefault"; then
1408    with_monodroid=$with_monodroid_default
1410 if test "x$with_monotouch" = "xdefault"; then
1411    with_monotouch=$with_monotouch_default
1413 if test "x$with_monotouch_watch" = "xdefault"; then
1414    with_monotouch_watch=$with_monotouch_watch_default
1416 if test "x$with_monotouch_tv" = "xdefault"; then
1417    with_monotouch_tv=$with_monotouch_tv_default
1419 if test "x$with_bitcode" = "xdefault"; then
1420    with_bitcode=$with_bitcode_default
1422 if test "x$with_xammac" = "xdefault"; then
1423    with_xammac=$with_xammac_default
1425 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1426    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1428 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1429    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1431 if test "x$with_testing_aot_full" = "xdefault"; then
1432    with_testing_aot_full=$with_testing_aot_full_default
1434 if test "x$with_winaot" = "xdefault"; then
1435    with_winaot=$with_winaot_default
1437 if test "x$with_orbis" = "xdefault"; then
1438    with_orbis=$with_orbis_default
1440 if test "x$with_unreal" = "xdefault"; then
1441    with_unreal=$with_unreal_default
1443 if test "x$with_wasm" = "xdefault"; then
1444    with_wasm=$with_wasm_default
1448 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1449 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1450 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1451 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1452 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1453 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1454 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1455 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1456 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1457 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1458 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1459 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1460 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1461 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1462 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1463 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"])
1464 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1465 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1466 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1467 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1469 default_profile=net_4_x
1470 if test -z "$INSTALL_MONODROID_TRUE"; then :
1471    default_profile=monodroid
1473 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1474    default_profile=monotouch
1476 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1477    default_profile=xammac
1479 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1480    default_profile=testing_aot_full_interp
1482 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1483    default_profile=testing_aot_hybrid
1485 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1486    default_profile=testing_aot_full
1488 if test -z "$INSTALL_WINAOT_TRUE"; then :
1489    default_profile=winaot
1491 if test -z "$INSTALL_ORBIS_TRUE"; then :
1492    default_profile=orbis
1494 if test -z "$INSTALL_UNREAL_TRUE"; then :
1495    default_profile=unreal
1497 if test -z "$INSTALL_WASM_TRUE"; then :
1498    default_profile=wasm
1500 if test -z "$INSTALL_4_x_TRUE"; then :
1501    default_profile=net_4_x
1503 DEFAULT_PROFILE=$default_profile
1504 AC_SUBST(DEFAULT_PROFILE)
1507 # End build profile configuration
1510 if test x$USE_NLS = xprofile_default; then
1512         AC_MSG_CHECKING([NLS used])
1514         # We make the default value for USE_NLS
1515         # "no" on OSX because it isn't available on most
1516         # default OSX installs. The most common configurations will
1517         # all disable it, so this saves us typing.
1518         if test x$host_darwin = xyes; then
1519                 USE_NLS=no;
1520         else
1521                 USE_NLS=yes;
1522         fi
1524         AC_SUBST([USE_NLS])
1525         AC_MSG_RESULT([$USE_NLS])
1528 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1529      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1530      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1531          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1533         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1534                 eval "mono_feature_disable_$feature='yes'"
1535         done
1536         DISABLED_FEATURES=$enable_minimal
1537         disabled="Disabled:      $enable_minimal"
1538 ],[])
1540 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1542 if test "x$mono_feature_disable_aot" = "xyes"; then
1543         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1544         enable_system_aot=no
1545         AC_MSG_NOTICE([Disabled AOT compiler])
1548 if test "x$mono_feature_disable_profiler" = "xyes"; then
1549         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1550         AC_MSG_NOTICE([Disabled support for the profiler])
1552 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1554 if test "x$mono_feature_disable_decimal" = "xyes"; then
1555         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1556         AC_MSG_NOTICE([Disabled support for decimal])
1559 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1560         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1561         AC_MSG_NOTICE([Disabled support for P/Invoke])
1564 if test "x$mono_feature_disable_debug" = "xyes"; then
1565         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1566         AC_MSG_NOTICE([Disabled support for runtime debugging])
1569 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1570         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1571         mono_feature_disable_reflection_emit_save=yes
1572         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1575 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1576         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1577         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1580 if test "x$mono_feature_disable_large_code" = "xyes"; then
1581         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1582         AC_MSG_NOTICE([Disabled support for large assemblies])
1585 if test "x$mono_feature_disable_logging" = "xyes"; then
1586         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1587         AC_MSG_NOTICE([Disabled support for logging])
1590 if test "x$mono_feature_disable_com" = "xyes"; then
1591         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1592         AC_MSG_NOTICE([Disabled COM support])
1595 if test "x$mono_feature_disable_ssa" = "xyes"; then
1596         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1597         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1600 if test "x$mono_feature_disable_generics" = "xyes"; then
1601         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1602         AC_MSG_NOTICE([Disabled Generics Support])
1605 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1606         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1607         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1610 if test "x$mono_feature_disable_portability" = "xyes"; then
1611         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1612         AC_MSG_NOTICE([Disabled IO Portability layer])
1615 if test "x$mono_feature_disable_attach" = "xyes"; then
1616         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1617         AC_MSG_NOTICE([Disabled agent attach])
1620 if test "x$mono_feature_disable_verifier" = "xyes"; then
1621         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1622         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1625 if test "x$mono_feature_disable_jit" = "xyes"; then
1626         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1627         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1630 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1632 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1633         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1634         AC_MSG_NOTICE([Disabled the interpreter])
1637 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1639 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1640         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1643 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1645 if test "x$mono_feature_disable_simd" = "xyes"; then
1646         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1647         AC_MSG_NOTICE([Disabled SIMD support])
1650 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1651         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1652         AC_MSG_NOTICE([Disabled Soft Debugger.])
1655 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1657 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1658         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1659         AC_MSG_NOTICE([Disabled Performance Counters.])
1661 if test "x$mono_feature_disable_normalization" = "xyes"; then
1662         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1663         AC_MSG_NOTICE([Disabled String normalization support.])
1666 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1667 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1668         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1669         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1672 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1673         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1674         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1677 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1678         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1679         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1682 if test "x$mono_feature_disable_remoting" = "xyes"; then
1683         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1684         AC_MSG_NOTICE([Disabled remoting])
1687 if test "x$mono_feature_disable_security" = "xyes"; then
1688         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1689         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1692 if test "x$mono_feature_disable_lldb" = "xyes"; then
1693         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1694         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1697 if test "x$mono_feature_disable_mdb" = "xyes"; then
1698         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1699         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1702 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1703         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1704         AC_MSG_NOTICE([Disabled assertion messages.])
1707 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1708         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1709         AC_MSG_NOTICE([Disabled runtime cleanup.])
1712 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1713         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1714         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1718 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1719         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1720         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1723 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1724         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1725         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1728 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1729         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1730         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1733 if test "x$mono_feature_disable_sockets" = "xyes"; then
1734         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1735         AC_MSG_NOTICE([Disabled sockets])
1738 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1739 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1741 has_extension_module=no
1742 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1744         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1745                 if test x$extension = xdefault ; then
1746                         has_extension_module=yes;
1747                 fi
1748         done
1749         if test x$enable_extension_module = xyes; then
1750                 has_extension_module=yes;
1751         fi
1752 ], [])
1754 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1756 if test x$has_extension_module != xno ; then
1757         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1758         AC_MSG_NOTICE([Enabling mono extension module.])
1761 # Deprecated
1762 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1764 AC_MSG_CHECKING(for visibility __attribute__)
1765 AC_COMPILE_IFELSE([
1766         AC_LANG_SOURCE([[
1767                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1768                 int main () { doit (); return 0; }
1769         ]])
1770 ], [
1771    have_visibility_hidden=yes
1772    AC_MSG_RESULT(yes)
1773 ], [
1774    have_visibility_hidden=no
1775    AC_MSG_RESULT(no)
1779 dnl Boehm GC configuration
1782 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1784 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1785 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1787 if test "x$support_boehm" = "xyes"; then
1789         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1790         if test x$enable_parallel_mark = xyes; then
1791                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1792         fi
1794         gc_msg=""
1795         LIBGC_CPPFLAGS=
1796         LIBGC_LIBS=
1797         LIBGC_STATIC_LIBS=
1798         libgc_dir=
1799         case "x$libgc" in
1800                 xincluded)
1801                         if test "x$support_boehm" = "xyes"; then
1802                                 libgc_dir=libgc
1803                         fi
1805                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1806                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1807                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1809                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1811                         if test x$target_win32 = xyes; then
1812                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1813                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1814                         fi
1816                         gc_msg="Included Boehm GC with typed GC"
1817                         if test x$enable_parallel_mark = xyes; then
1818                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1819                                 gc_msg="$gc_msg and parallel mark"
1820                         else
1821                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1822                         fi
1823                         ;;
1825                 xboehm|xbohem|xyes)
1826                         AC_MSG_WARN("External Boehm is no longer supported")
1827                         ;;
1829                 xsgen)
1830                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1831                         ;;
1833                 xnone)
1834                         AC_MSG_WARN("Compiling mono without GC.")
1835                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1836                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1837                         gc_msg="none"
1838                         ;;
1839                 *)
1840                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1841                         ;;
1842         esac
1844         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])
1845         if test "x$large_heap" = "xyes"; then
1846            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1847         fi
1849         AC_SUBST(LIBGC_CPPFLAGS)
1850         AC_SUBST(LIBGC_LIBS)
1851         AC_SUBST(LIBGC_STATIC_LIBS)
1852         AC_SUBST(libgc_dir)
1853         AC_SUBST(BOEHM_DEFINES)
1856 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1859 dnl End of Boehm GC Configuration
1862 dnl *************************************
1863 dnl *** Checks for zero length arrays ***
1864 dnl *************************************
1865 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1866 AC_TRY_COMPILE([
1867         struct s {
1868                 int  length;
1869                 char data [0];
1870         };
1871 ], [], [
1872         AC_MSG_RESULT(yes)
1873         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1874 ], [
1875         AC_MSG_RESULT(no)
1876         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1879 dnl ***********************************
1880 dnl *** Checks for signals
1881 dnl ***********************************
1882 AC_CHECK_HEADERS(signal.h)
1883 AC_CHECK_FUNCS(sigaction)
1884 AC_CHECK_FUNCS(kill)
1885 AC_CHECK_FUNCS(signal)
1887 # signal() is declared inline in Android headers
1888 # so we need to workaround it by overriding the check.
1889 if test x$platform_android = xyes; then
1890         AC_DEFINE(HAVE_SIGNAL,1)
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_CHECK_FUNCS(readlink)
2024         AC_CHECK_FUNCS(chmod)
2025         AC_CHECK_FUNCS(lstat)
2026         AC_CHECK_FUNCS(getdtablesize)
2028         AC_CHECK_FUNCS(ftruncate)
2029         AC_CHECK_FUNCS(msync)
2031         AC_CHECK_FUNCS(gethostname getpeername)
2032         AC_CHECK_FUNCS(utime utimes)
2034         AC_CHECK_FUNCS(openlog closelog)
2035         AC_CHECK_FUNCS(atexit)
2037         AC_FUNC_STRERROR_R()
2039         dnl ****************************************************************
2040         dnl *** Check for sched_setaffinity from glibc versions before   ***
2041         dnl *** 2.3.4. The older versions of the function only take 2    ***
2042         dnl *** parameters, not 3.                                       ***
2043         dnl ***                                                          ***
2044         dnl *** Because the interface change was not made in a minor     ***
2045         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2046         dnl *** won't always indicate the interface sched_affinity has.  ***
2047         dnl ****************************************************************
2048         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2049         AC_TRY_COMPILE([#include <sched.h>], [
2050             int mask = 1; 
2051             sched_setaffinity(0, &mask);
2052         ], [
2053                 # Yes, we have it...
2054                 AC_MSG_RESULT(yes)
2055                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2056         ], [
2057                 # We have the new, three-parameter version
2058                 AC_MSG_RESULT(no)
2059         ])
2060         AC_TRY_COMPILE([#include <sched.h>], [
2061              CPU_COUNT((void *) 0);
2062         ], [
2063                 AC_MSG_RESULT(yes)
2064                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2065         ], [
2066                 # We have the new, three-parameter version
2067                 AC_MSG_RESULT(no)
2068         ])
2070         dnl ******************************************************************
2071         dnl *** Check for large file support                               ***
2072         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2073         dnl ******************************************************************
2074         
2075         # Check that off_t can represent 2**63 - 1 correctly, working around
2076         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2077         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2078         large_offt=no
2079         AC_DEFUN([LARGE_FILES], [
2080                 large_CPPFLAGS=$CPPFLAGS
2081                 CPPFLAGS="$CPPFLAGS $1"
2082                 AC_TRY_COMPILE([
2083                         #include <sys/types.h>
2084                         #include <limits.h>
2085                 ], [
2086                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2087                         #define COMPILE_TIME_ASSERT(pred) \
2088                                 switch(0){case 0:case pred:;}
2089                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2090                 ], [
2091                         AC_MSG_RESULT(ok)
2092                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2093                         large_CPPFLAGS="$large_CPPFLAGS $1"
2094                         large_offt=yes
2095                 ], [
2096                         AC_MSG_RESULT(no)
2097                 ])
2098                 CPPFLAGS=$large_CPPFLAGS
2099         ])
2101         AC_MSG_CHECKING(if off_t is 64 bits wide)
2102         LARGE_FILES("")
2103         if test $large_offt = no; then
2104                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2105                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2106         fi
2107         if test $large_offt = no; then
2108                 AC_MSG_WARN([No 64 bit file size support available])
2109         fi
2110         
2111         dnl *****************************
2112         dnl *** Checks for libsocket  ***
2113         dnl *****************************
2114         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2116         case "$host" in
2117                 *-*-*freebsd*)
2118                         dnl *****************************
2119                         dnl *** Checks for libinotify ***
2120                         dnl *****************************
2121                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2122         esac
2124         dnl *******************************
2125         dnl *** Checks for MSG_NOSIGNAL ***
2126         dnl *******************************
2127         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2128         AC_TRY_COMPILE([#include <sys/socket.h>], [
2129                 int f = MSG_NOSIGNAL;
2130         ], [
2131                 # Yes, we have it...
2132                 AC_MSG_RESULT(yes)
2133                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2134         ], [
2135                 # We'll have to use signals
2136                 AC_MSG_RESULT(no)
2137         ])
2139         dnl *****************************
2140         dnl *** Checks for IPPROTO_IP ***
2141         dnl *****************************
2142         AC_MSG_CHECKING(for IPPROTO_IP)
2143         AC_TRY_COMPILE([#include <netinet/in.h>], [
2144                 int level = IPPROTO_IP;
2145         ], [
2146                 # Yes, we have it...
2147                 AC_MSG_RESULT(yes)
2148                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2149         ], [
2150                 # We'll have to use getprotobyname
2151                 AC_MSG_RESULT(no)
2152         ])
2154         dnl *******************************
2155         dnl *** Checks for IPPROTO_IPV6 ***
2156         dnl *******************************
2157         AC_MSG_CHECKING(for IPPROTO_IPV6)
2158         AC_TRY_COMPILE([#include <netinet/in.h>], [
2159                 int level = IPPROTO_IPV6;
2160         ], [
2161                 # Yes, we have it...
2162                 AC_MSG_RESULT(yes)
2163                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2164         ], [
2165                 # We'll have to use getprotobyname
2166                 AC_MSG_RESULT(no)
2167         ])
2169         dnl ******************************
2170         dnl *** Checks for IPPROTO_TCP ***
2171         dnl ******************************
2172         AC_MSG_CHECKING(for IPPROTO_TCP)
2173         AC_TRY_COMPILE([#include <netinet/in.h>], [
2174                 int level = IPPROTO_TCP;
2175         ], [
2176                 # Yes, we have it...
2177                 AC_MSG_RESULT(yes)
2178                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2179         ], [
2180                 # We'll have to use getprotobyname
2181                 AC_MSG_RESULT(no)
2182         ])
2184         dnl *****************************
2185         dnl *** Checks for SOL_IP     ***
2186         dnl *****************************
2187         AC_MSG_CHECKING(for SOL_IP)
2188         AC_TRY_COMPILE([#include <netdb.h>], [
2189                 int level = SOL_IP;
2190         ], [
2191                 # Yes, we have it...
2192                 AC_MSG_RESULT(yes)
2193                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2194         ], [
2195                 # We'll have to use getprotobyname
2196                 AC_MSG_RESULT(no)
2197         ])
2199         dnl *****************************
2200         dnl *** Checks for SOL_IPV6     ***
2201         dnl *****************************
2202         AC_MSG_CHECKING(for SOL_IPV6)
2203         AC_TRY_COMPILE([#include <netdb.h>], [
2204                 int level = SOL_IPV6;
2205         ], [
2206                 # Yes, we have it...
2207                 AC_MSG_RESULT(yes)
2208                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2209         ], [
2210                 # We'll have to use getprotobyname
2211                 AC_MSG_RESULT(no)
2212         ])
2214         dnl *****************************
2215         dnl *** Checks for SOL_TCP    ***
2216         dnl *****************************
2217         AC_MSG_CHECKING(for SOL_TCP)
2218         AC_TRY_COMPILE([#include <netdb.h>], [
2219                 int level = SOL_TCP;
2220         ], [
2221                 # Yes, we have it...
2222                 AC_MSG_RESULT(yes)
2223                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2224         ], [
2225                 # We'll have to use getprotobyname
2226                 AC_MSG_RESULT(no)
2227         ])
2229         dnl *****************************
2230         dnl *** Checks for IP_PKTINFO ***
2231         dnl *****************************
2232         AC_MSG_CHECKING(for IP_PKTINFO)
2233         AC_TRY_COMPILE([#include <linux/in.h>], [
2234                 int level = IP_PKTINFO;
2235         ], [
2236                 # Yes, we have it...
2237                 AC_MSG_RESULT(yes)
2238                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2239         ], [
2240                 AC_MSG_RESULT(no)
2241         ])
2243         dnl *****************************
2244         dnl *** Checks for IPV6_PKTINFO ***
2245         dnl *****************************
2246         AC_MSG_CHECKING(for IPV6_PKTINFO)
2247         AC_TRY_COMPILE([#include <netdb.h>], [
2248                 int level = IPV6_PKTINFO;
2249         ], [
2250                 # Yes, we have it...
2251                 AC_MSG_RESULT(yes)
2252                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2253         ], [
2254                 AC_MSG_RESULT(no)
2255         ])
2257         dnl **********************************
2258         dnl *** Checks for IP_DONTFRAG     ***
2259         dnl **********************************
2260         AC_MSG_CHECKING(for IP_DONTFRAG)
2261         AC_TRY_COMPILE([#include <netinet/in.h>], [
2262                 int level = IP_DONTFRAG;
2263         ], [
2264                 # Yes, we have it...
2265                 AC_MSG_RESULT(yes)
2266                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2267         ], [
2268                 AC_MSG_RESULT(no)
2269         ])
2271         dnl **********************************
2272         dnl *** Checks for IP_DONTFRAGMENT ***
2273         dnl **********************************
2274         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2275         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2276                 int level = IP_DONTFRAGMENT;
2277         ], [
2278                 # Yes, we have it...
2279                 AC_MSG_RESULT(yes)
2280                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2281         ], [
2282                 AC_MSG_RESULT(no)
2283         ])
2285         dnl **********************************
2286         dnl *** Checks for IP_MTU_DISCOVER ***
2287         dnl **********************************
2288         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2289         AC_TRY_COMPILE([#include <linux/in.h>], [
2290                 int level = IP_MTU_DISCOVER;
2291         ], [
2292                 # Yes, we have it...
2293                 AC_MSG_RESULT(yes)
2294                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2295         ], [
2296                 AC_MSG_RESULT(no)
2297         ])
2299         dnl **********************************
2300         dnl *** Checks for  IP_PMTUDISC_DO ***
2301         dnl **********************************
2302         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2303         AC_TRY_COMPILE([#include <linux/in.h>], [
2304                 int level = IP_PMTUDISC_DO;
2305         ], [
2306                 # Yes, we have it...
2307                 AC_MSG_RESULT(yes)
2308                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2309         ], [
2310                 AC_MSG_RESULT(no)
2311         ])
2313         dnl *********************************
2314         dnl *** Check for struct ip_mreqn ***
2315         dnl *********************************
2316         AC_MSG_CHECKING(for struct ip_mreqn)
2317         AC_TRY_COMPILE([#include <netinet/in.h>], [
2318                 struct ip_mreqn mreq;
2319                 mreq.imr_address.s_addr = 0;
2320         ], [
2321                 # Yes, we have it...
2322                 AC_MSG_RESULT(yes)
2323                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2324         ], [
2325                 # We'll just have to try and use struct ip_mreq
2326                 AC_MSG_RESULT(no)
2327                 AC_MSG_CHECKING(for struct ip_mreq)
2328                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2329                         struct ip_mreq mreq;
2330                         mreq.imr_interface.s_addr = 0;
2331                 ], [
2332                         # Yes, we have it...
2333                         AC_MSG_RESULT(yes)
2334                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2335                 ], [
2336                         # No multicast support
2337                         AC_MSG_RESULT(no)
2338                 ])
2339         ])
2340         
2341         dnl **********************************
2342         dnl *** Check for getaddrinfo ***
2343         dnl **********************************
2344         AC_MSG_CHECKING(for getaddrinfo)
2345                 AC_TRY_LINK([
2346                 #include <stdio.h>
2347                 #include <netdb.h>
2348         ], [
2349                 getaddrinfo(NULL,NULL,NULL,NULL);
2350         ], [
2351                 # Yes, we have it...
2352                 AC_MSG_RESULT(yes)
2353                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2354         ], [
2355                 AC_MSG_RESULT(no)
2356         ])
2358         dnl **********************************
2359         dnl *** Check for gethostbyname2_r ***
2360         dnl **********************************
2361         AC_MSG_CHECKING(for gethostbyname2_r)
2362                 AC_TRY_LINK([
2363                 #include <stdio.h>
2364                 #include <netdb.h>
2365         ], [
2367                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2368         ], [
2369                 # Yes, we have it...
2370                 AC_MSG_RESULT(yes)
2371                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2372         ], [
2373                 AC_MSG_RESULT(no)
2374         ])
2376         dnl **********************************
2377         dnl *** Check for gethostbyname2 ***
2378         dnl **********************************
2379         AC_MSG_CHECKING(for gethostbyname2)
2380                 AC_TRY_LINK([
2381                 #include <stdio.h>
2382                 #include <netdb.h>
2383         ], [
2384                 gethostbyname2(NULL,0);
2385         ], [
2386                 # Yes, we have it...
2387                 AC_MSG_RESULT(yes)
2388                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2389         ], [
2390                 AC_MSG_RESULT(no)
2391         ])
2393         dnl **********************************
2394         dnl *** Check for gethostbyname ***
2395         dnl **********************************
2396         AC_MSG_CHECKING(for gethostbyname)
2397                 AC_TRY_LINK([
2398                 #include <stdio.h>
2399                 #include <netdb.h>
2400         ], [
2401                 gethostbyname(NULL);
2402         ], [
2403                 # Yes, we have it...
2404                 AC_MSG_RESULT(yes)
2405                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2406         ], [
2407                 AC_MSG_RESULT(no)
2408         ])
2410         dnl **********************************
2411         dnl *** Check for getprotobyname ***
2412         dnl **********************************
2413         AC_MSG_CHECKING(for getprotobyname)
2414                 AC_TRY_LINK([
2415                 #include <stdio.h>
2416                 #include <netdb.h>
2417         ], [
2418                 getprotobyname(NULL);
2419         ], [
2420                 # Yes, we have it...
2421                 AC_MSG_RESULT(yes)
2422                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2423         ], [
2424                 AC_MSG_RESULT(no)
2425         ])
2427         dnl **********************************
2428         dnl *** Check for getprotobyname_r ***
2429         dnl **********************************
2430         AC_MSG_CHECKING(for getprotobyname_r)
2431                 AC_TRY_LINK([
2432                 #include <stdio.h>
2433                 #include <netdb.h>
2434         ], [
2435                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2436         ], [
2437                 # Yes, we have it...
2438                 AC_MSG_RESULT(yes)
2439                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2440         ], [
2441                 AC_MSG_RESULT(no)
2442         ])
2444         dnl **********************************
2445         dnl *** Check for getnameinfo ***
2446         dnl **********************************
2447         AC_MSG_CHECKING(for getnameinfo)
2448                 AC_TRY_LINK([
2449                 #include <stdio.h>
2450                 #include <netdb.h>
2451         ], [
2452                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2453         ], [
2454                 # Yes, we have it...
2455                 AC_MSG_RESULT(yes)
2456                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2457         ], [
2458                 AC_MSG_RESULT(no)
2459         ])
2462         dnl **********************************
2463         dnl *** Check for inet_ntop ***
2464         dnl **********************************
2465         AC_MSG_CHECKING(for inet_ntop)
2466                 AC_TRY_LINK([
2467                 #include <stdio.h>
2468                 #include <arpa/inet.h>
2469         ], [
2470                 inet_ntop (0, NULL, NULL, 0);
2471         ], [
2472                 # Yes, we have it...
2473                 AC_MSG_RESULT(yes)
2474                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2475         ], [
2476                 AC_MSG_RESULT(no)
2477         ])
2479         dnl *****************************
2480         dnl *** Checks for libnsl     ***
2481         dnl *****************************
2482         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2484         AC_CHECK_FUNCS(inet_pton inet_aton)
2486         dnl *****************************
2487         dnl *** Checks for libxnet    ***
2488         dnl *****************************
2489         case "${host}" in
2490                 *solaris* )
2491                         AC_MSG_CHECKING(for Solaris XPG4 support)
2492                         if test -f /usr/lib/libxnet.so; then
2493                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2494                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2495                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2496                                 LIBS="$LIBS -lxnet"
2497                                 AC_MSG_RESULT(yes)
2498                         else
2499                                 AC_MSG_RESULT(no)
2500                         fi
2502                         if test "$GCC" = "yes"; then
2503                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2504                         fi
2505                 ;;
2506         esac
2508         dnl *****************************
2509         dnl *** Checks for libpthread ***
2510         dnl *****************************
2511 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2512 # and libpthread does not exist
2514         case "${host}" in
2515                 *-*-*haiku*)
2516                         dnl Haiku has pthread in libroot (libc equiv)
2517                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2518                 ;;
2519                 *-*-*freebsd*)
2520                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2521                 ;;
2522                 *-*-*openbsd*)
2523                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2524                 ;;
2525                 *)
2526                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2527                 ;;
2528         esac
2529         AC_CHECK_HEADERS(pthread.h)
2530         AC_CHECK_HEADERS(pthread_np.h)
2531         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2532         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2533         AC_CHECK_FUNCS(pthread_kill)
2534         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2535         AC_TRY_COMPILE([ #include <pthread.h>], [
2536                 pthread_mutexattr_t attr;
2537                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2538         ], [
2539                 AC_MSG_RESULT(ok)
2540         ], [
2541                 AC_MSG_RESULT(no)
2542                 AC_ERROR(Posix system lacks support for recursive mutexes)
2543         ])
2544         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2545         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2546         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2547         AC_CHECK_FUNCS(mincore mlock munlock)
2549         dnl ***********************************
2550         dnl *** Checks for working __thread ***
2551         dnl ***********************************
2552         AC_MSG_CHECKING(for working __thread)
2553         if test "x$with_tls" != "x__thread"; then
2554                 AC_MSG_RESULT(disabled)
2555         elif test "x$cross_compiling" = "xyes"; then
2556                 AC_MSG_RESULT(cross compiling, assuming yes)
2557         else
2558                 AC_TRY_RUN([
2559                         #if defined(__APPLE__) && defined(__clang__)
2560                         #error "__thread does not currently work with clang on Mac OS X"
2561                         #endif
2562                         
2563                         #include <unistd.h>
2564                         #include <pthread.h>
2565                         __thread int i;
2566                         static int res1, res2;
2568                         void thread_main (void *arg)
2569                         {
2570                                 i = arg;
2571                                 sleep (1);
2572                                 if (arg == 1)
2573                                         res1 = (i == arg);
2574                                 else
2575                                         res2 = (i == arg);
2576                         }
2578                         int main () {
2579                                 pthread_t t1, t2;
2581                                 i = 5;
2583                                 pthread_create (&t1, NULL, thread_main, 1);
2584                                 pthread_create (&t2, NULL, thread_main, 2);
2586                                 pthread_join (t1, NULL);
2587                                 pthread_join (t2, NULL);
2589                                 return !(res1 + res2 == 2);
2590                         }
2591                 ], [
2592                                 AC_MSG_RESULT(yes)
2593                 ], [
2594                                 AC_MSG_RESULT(no)
2595                                 with_tls=pthread
2596                 ])
2597         fi
2599         dnl **************************************
2600         dnl *** Checks for working sigaltstack ***
2601         dnl **************************************
2602         AC_MSG_CHECKING(for working sigaltstack)
2603         if test "x$with_sigaltstack" != "xyes"; then
2604                 AC_MSG_RESULT(disabled)
2605         elif test "x$cross_compiling" = "xyes"; then
2606                 AC_MSG_RESULT(cross compiling, assuming no)
2607                 with_sigaltstack=no
2608         else
2609                 AC_TRY_RUN([
2610                         #include <stdio.h>
2611                         #include <stdlib.h>
2612                         #include <unistd.h>
2613                         #include <signal.h>
2614                         #include <pthread.h>
2615                         #include <sys/wait.h>
2616                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2617                         #define SA_STACK SA_ONSTACK
2618                         #endif
2619                         static void
2620                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2621                         {
2622                                 exit (0);
2623                         }
2625                         volatile char*__ptr = NULL;
2626                         static void *
2627                         loop (void *ignored)
2628                         {
2629                                 *__ptr = 0;
2630                                 return NULL;
2631                         }
2633                         static void
2634                         child ()
2635                         {
2636                                 struct sigaction sa;
2637                                 stack_t sas;
2638                                 pthread_t id;
2639                                 pthread_attr_t attr;
2641                                 sa.sa_sigaction = sigsegv_signal_handler;
2642                                 sigemptyset (&sa.sa_mask);
2643                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2644                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2645                                         perror ("sigaction");
2646                                         return;
2647                                 }
2649                                 /* x86 darwin deliver segfaults using SIGBUS */
2650                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2651                                         perror ("sigaction");
2652                                         return;
2653                                 }
2654                                 sas.ss_sp = malloc (SIGSTKSZ);
2655                                 sas.ss_size = SIGSTKSZ;
2656                                 sas.ss_flags = 0;
2657                                 if (sigaltstack (&sas, NULL) == -1) {
2658                                         perror ("sigaltstack");
2659                                         return;
2660                                 }
2662                                 pthread_attr_init (&attr);
2663                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2664                                         printf ("pthread_create\n");
2665                                         return;
2666                                 }
2668                                 sleep (100);
2669                         }
2671                         int
2672                         main ()
2673                         {
2674                                 pid_t son;
2675                                 int status;
2676                                 int i;
2678                                 son = fork ();
2679                                 if (son == -1) {
2680                                         return 1;
2681                                 }
2683                                 if (son == 0) {
2684                                         child ();
2685                                         return 0;
2686                                 }
2688                                 for (i = 0; i < 300; ++i) {
2689                                         waitpid (son, &status, WNOHANG);
2690                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2691                                                 return 0;
2692                                         usleep (10000);
2693                                 }
2695                                 kill (son, SIGKILL);
2696                                 return 1;
2697                         }
2699                 ], [
2700                                 AC_MSG_RESULT(yes)
2701                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2702                 ], [
2703                                 with_sigaltstack=no
2704                                 AC_MSG_RESULT(no)
2705                 ])
2706         fi
2708         dnl ********************************
2709         dnl *** Checks for semaphore lib ***
2710         dnl ********************************
2711         # 'Real Time' functions on Solaris
2712         # posix4 on Solaris 2.6
2713         # pthread (first!) on Linux
2714         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2716         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2717         AC_CHECK_FUNCS(shm_open)
2719         dnl ********************************
2720         dnl *** Checks for timezone stuff **
2721         dnl ********************************
2722         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2723                 AC_TRY_COMPILE([
2724                         #include <time.h>
2725                         ], [
2726                         struct tm tm;
2727                         tm.tm_gmtoff = 1;
2728                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2729         if test $ac_cv_struct_tm_gmtoff = yes; then
2730                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2731         else
2732                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2733                         AC_TRY_COMPILE([
2734                                 #include <time.h>
2735                         ], [
2736                                 timezone = 1;
2737                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2738                 if test $ac_cv_var_timezone = yes; then
2739                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2740                 else
2741                         AC_ERROR(unable to find a way to determine timezone)
2742                 fi
2743         fi
2745         dnl *********************************
2746         dnl *** Checks for math functions ***
2747         dnl *********************************
2748         AC_SEARCH_LIBS(sqrtf, m)
2750         dnl ****************************************************************
2751         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2752         dnl *** have it in the library (duh))                            ***
2753         dnl ****************************************************************
2754         AC_CHECK_FUNCS(poll)
2756         dnl **********************************
2757         dnl *** epoll                      ***
2758         dnl **********************************
2759         AC_CHECK_HEADERS(sys/epoll.h)
2760         haveepoll=no
2761         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2762         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2763                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2764         fi
2766         havekqueue=no
2768         AC_CHECK_HEADERS(sys/event.h)
2769         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2771         dnl **************************************
2772         dnl * Darwin has a race that prevents us from using reliably:
2773         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2774         dnl * Since kqueue is mostly used for scaling large web servers, 
2775         dnl * and very few folks run Mono on large web servers on OSX, falling
2776         dnl * back 
2777         dnl **************************************
2778         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2779                 if test "x$host_darwin" = "xno"; then
2780                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2781                 fi
2782         fi
2784         dnl ******************************
2785         dnl *** Checks for SIOCGIFCONF ***
2786         dnl ******************************
2787         AC_CHECK_HEADERS(sys/ioctl.h)
2788         AC_CHECK_HEADERS(net/if.h, [], [],
2789            [
2790            #ifdef HAVE_SYS_TYPES_H
2791            # include <sys/types.h>
2792            #endif
2793            #ifdef HAVE_SYS_SOCKET_H
2794            # include <sys/socket.h>
2795            #endif
2796            ])
2797         AC_MSG_CHECKING(for ifreq)
2798         AC_TRY_COMPILE([
2799                 #include <stdio.h>
2800                 #include <sys/ioctl.h>
2801                 #include <net/if.h>
2802                 ], [
2803                 struct ifconf ifc;
2804                 struct ifreq *ifr;
2805                 void *x;
2806                 ifc.ifc_len = 0;
2807                 ifc.ifc_buf = NULL;
2808                 x = (void *) &ifr->ifr_addr;
2809                 ],[
2810                         AC_MSG_RESULT(yes)
2811                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2812                 ], [
2813                         AC_MSG_RESULT(no)
2814                 ])
2815         dnl **********************************
2816         dnl ***     Checks for sin_len     ***
2817         dnl **********************************
2818         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2819         AC_TRY_COMPILE([
2820                 #include <netinet/in.h>
2821                 ], [
2822                 struct sockaddr_in saddr;
2823                 saddr.sin_len = sizeof (saddr);
2824                 ],[
2825                         AC_MSG_RESULT(yes)
2826                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2827                 ], [
2828                         AC_MSG_RESULT(no)
2829                 ])      
2830         dnl **********************************
2831         dnl ***    Checks for sin6_len     ***
2832         dnl **********************************
2833         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2834         AC_TRY_COMPILE([
2835                 #include <netinet/in.h>
2836                 ], [
2837                 struct sockaddr_in6 saddr6;
2838                 saddr6.sin6_len = sizeof (saddr6);
2839                 ],[
2840                         AC_MSG_RESULT(yes)
2841                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2842                 ], [
2843                         AC_MSG_RESULT(no)
2844                 ])
2845         dnl **********************************
2846         dnl *** Check for getifaddrs       ***
2847         dnl **********************************
2848         AC_MSG_CHECKING(for getifaddrs)
2849                 AC_TRY_LINK([
2850                 #include <stdio.h>
2851                 #include <sys/types.h>
2852                 #include <sys/socket.h>
2853                 #ifdef HAVE_NET_IF_H
2854                 #include <net/if.h>
2855                 #endif
2856                 #include <ifaddrs.h>
2857         ], [
2858                 getifaddrs(NULL);
2859         ], [
2860                 # Yes, we have it...
2861                 AC_MSG_RESULT(yes)
2862                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2863         ], [
2864                 AC_MSG_RESULT(no)
2865         ])
2866         dnl **********************************
2867         dnl *** Check for if_nametoindex   ***
2868         dnl **********************************
2869         AC_MSG_CHECKING(for if_nametoindex)
2870                 AC_TRY_LINK([
2871                 #include <stdio.h>
2872                 #include <sys/types.h>
2873                 #include <sys/socket.h>
2874                 #include <net/if.h>
2875         ], [
2876                 if_nametoindex(NULL);
2877         ], [
2878                 # Yes, we have it...
2879                 AC_MSG_RESULT(yes)
2880                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2881         ], [
2882                 AC_MSG_RESULT(no)
2883         ])
2884         dnl **********************************
2885         dnl *** Check for access ***
2886         dnl **********************************
2887         AC_MSG_CHECKING(for access)
2888                 AC_TRY_LINK([
2889                 #include <unistd.h>
2890         ], [
2891                 access(NULL,0);
2892         ], [
2893                 # Yes, we have it...
2894                 AC_MSG_RESULT(yes)
2895                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2896         ], [
2897                 AC_MSG_RESULT(no)
2898         ])
2899                         
2900         dnl **********************************
2901         dnl *** Checks for proclib         ***
2902         dnl **********************************
2903         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.)])
2904         dnl **********************************
2905         dnl *** Checks for MonoPosixHelper ***
2906         dnl **********************************
2907         AC_CHECK_HEADERS(checklist.h)
2908         AC_CHECK_HEADERS(pathconf.h)
2909         AC_CHECK_HEADERS(fstab.h)
2910         AC_CHECK_HEADERS(attr/xattr.h)
2911         AC_CHECK_HEADERS(sys/extattr.h)
2912         AC_CHECK_HEADERS(sys/sendfile.h)
2913         AC_CHECK_HEADERS(sys/statvfs.h)
2914         AC_CHECK_HEADERS(sys/statfs.h)
2915         AC_CHECK_HEADERS(sys/vfstab.h)
2916         AC_CHECK_HEADERS(sys/xattr.h)
2917         AC_CHECK_HEADERS(sys/mman.h)
2918         AC_CHECK_HEADERS(sys/param.h)
2919         AC_CHECK_HEADERS(sys/mount.h, [], [],
2920                 [
2921                 #ifdef HAVE_SYS_PARAM_H
2922                 # include <sys/param.h>
2923                 #endif
2924                 ])
2925         AC_CHECK_HEADERS(sys/mount.h)
2926         AC_CHECK_FUNCS(confstr)
2927         AC_CHECK_FUNCS(seekdir telldir)
2928         AC_CHECK_FUNCS(getdomainname)
2929         AC_CHECK_FUNCS(setdomainname)
2930         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2931         AC_CHECK_FUNCS(setgroups)
2932         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2933         AC_CHECK_FUNCS(getfsstat)
2934         AC_CHECK_FUNCS(lutimes futimes)
2935         AC_CHECK_FUNCS(mremap)
2936         AC_CHECK_FUNCS(remap_file_pages)
2937         AC_CHECK_FUNCS(posix_fadvise)
2938         AC_CHECK_FUNCS(posix_fallocate)
2939         AC_CHECK_FUNCS(posix_madvise)
2940         AC_CHECK_FUNCS(vsnprintf)
2941         AC_CHECK_FUNCS(sendfile)
2942         AC_CHECK_FUNCS(gethostid sethostid)
2943         AC_CHECK_FUNCS(sethostname)
2944         AC_CHECK_FUNCS(statfs)
2945         AC_CHECK_FUNCS(fstatfs)
2946         AC_CHECK_FUNCS(statvfs)
2947         AC_CHECK_FUNCS(fstatvfs)
2948         AC_CHECK_FUNCS(stime)
2949         AC_CHECK_FUNCS(ttyname_r)
2950         AC_CHECK_FUNCS(psignal)
2951         AC_CHECK_FUNCS(getlogin_r)
2952         AC_CHECK_FUNCS(lockf)
2953         AC_CHECK_FUNCS(swab)
2954         AC_CHECK_FUNCS(setusershell endusershell)
2955         AC_CHECK_FUNCS(futimens utimensat)
2956         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2957         AC_CHECK_FUNCS(readv writev preadv pwritev)
2958         AC_CHECK_FUNCS(setpgid)
2959         AC_CHECK_FUNCS(system)
2960         AC_CHECK_FUNCS(fork execv execve)
2961         AC_CHECK_FUNCS(waitpid)
2962         AC_CHECK_FUNCS(accept4)
2963         AC_CHECK_FUNCS(localtime_r)
2964         AC_CHECK_FUNCS(mkdtemp)
2965         AC_CHECK_SIZEOF(size_t)
2966         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2967                 [#include <sys/types.h>
2968                  #include <sys/stat.h>
2969                  #include <unistd.h>])
2970         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2971                 [#include <sys/types.h>
2972                  #include <sys/stat.h>
2973                  #include <unistd.h>])
2974         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2975                 [#include <sys/time.h>])
2976         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2977                 [#include <sys/socket.h>])
2978         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2979                 [#include <unistd.h>
2980                  #include <fcntl.h>])
2981         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2982                 [#include <sys/uio.h>])
2983         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2984                 [#include <sys/socket.h>])
2985         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2986                 [#include <sys/poll.h>])
2987         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2988                 [#include <sys/socket.h>])
2989         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2990                 [#include <sys/socket.h>])
2991         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2992                 [#include <netinet/in.h>])
2993         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2994                 [#include <netinet/in.h>])
2995         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2996                 [#include <sys/un.h>])
2997         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2998                 [#include <sys/types.h>
2999                  #include <sys/stat.h>
3000                  #include <unistd.h>])
3001         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3002                 [#include <time.h>])
3003         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3004                 [#include <sys/time.h>
3005                  #include <sys/types.h>
3006                  #include <utime.h>])
3007         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3008                 [#include <sys/time.h>])
3009         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3010                 [#include <sys/types.h>
3011                  #include <utime.h>])
3012         AC_CHECK_MEMBERS(
3013                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3014                 [#include <sys/types.h>
3015                  #include <dirent.h>])
3016         AC_CHECK_MEMBERS(
3017                 [struct passwd.pw_gecos],,, 
3018                 [#include <sys/types.h>
3019                  #include <pwd.h>])
3020         AC_CHECK_MEMBERS(
3021                 [struct statfs.f_flags],,, 
3022                 [#include <sys/types.h>
3023                  #include <sys/vfs.h>])
3024         AC_CHECK_MEMBERS(
3025                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3026                 [#include <sys/types.h>
3027                  #include <sys/stat.h>
3028                  #include <unistd.h>])
3030         dnl Favour xattr through glibc, but use libattr if we have to
3031         AC_CHECK_FUNC(lsetxattr, ,
3032                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3033         )
3034         AC_SUBST(XATTR_LIB)
3036         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3037         AC_CHECK_MEMBERS(
3038                 [struct kinfo_proc.kp_proc],,, 
3039                 [#include <sys/types.h>
3040                  #include <sys/param.h>
3041                  #include <sys/sysctl.h>
3042                  #include <sys/proc.h>
3043                  ])
3045         dnl *********************************
3046         dnl *** Checks for Windows compilation ***
3047         dnl *********************************
3048         AC_CHECK_HEADERS(sys/time.h)
3049         AC_CHECK_HEADERS(sys/param.h)
3050         AC_CHECK_HEADERS(dirent.h)
3052         dnl ******************************************
3053         dnl *** Checks for OSX and iOS compilation ***
3054         dnl ******************************************
3055         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3057         dnl *********************************
3058         dnl *** Check for Console 2.0 I/O ***
3059         dnl *********************************
3060         AC_CHECK_HEADERS([curses.h])
3061         AC_CHECK_HEADERS([term.h], [], [],
3062         [#if HAVE_CURSES_H
3063          #include <curses.h>
3064          #endif
3065         ])
3066         AC_CHECK_HEADERS([termios.h])
3068         dnl *********************************
3069         dnl *** Checks for random         ***
3070         dnl *********************************
3071         if test x$host_darwin = xno; then
3072                 AC_CHECK_HEADERS(sys/random.h)
3073                 AC_CHECK_FUNCS(getrandom getentropy)
3074         fi
3076         dnl *********************************
3077         dnl *** Checks for Mono.Native    ***
3078         dnl *********************************
3080         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3081         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3083         AC_MSG_CHECKING(for linux/in.h)
3084         AC_TRY_COMPILE([
3085                 #include <sys/socket.h>
3086                 #include <linux/in.h>
3087         ], [
3088         ],[
3089                 AC_MSG_RESULT(yes)
3090                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3091         ], [
3092                 AC_MSG_RESULT(no)
3093         ])
3095         AC_CHECK_HEADERS([linux/if_packet.h])
3097         AC_MSG_CHECKING(for struct in_pktinfo)
3098         AC_TRY_COMPILE([
3099                 #ifdef HAVE_LINUX_IN_H
3100                 #include <sys/socket.h>
3101                 #include <linux/in.h>
3102                 #else
3103                 #include <netinet/in.h>
3104                 #endif
3105         ], [
3106                 struct in_pktinfo pktinfo;
3107         ],[
3108                 AC_MSG_RESULT(yes)
3109                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3110         ], [
3111                 AC_MSG_RESULT(no)
3112         ])
3114         AC_MSG_CHECKING(for struct ip_mreqn)
3115         AC_TRY_COMPILE([
3116                 #if HAVE_LINUX_IN_H
3117                 #include <sys/socket.h>
3118                 #include <linux/in.h>
3119                 #else
3120                 #include <netinet/in.h>
3121                 #endif
3122         ], [
3123                 struct ip_mreqn mreqn;
3124         ],[
3125                 AC_MSG_RESULT(yes)
3126                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3127         ], [
3128                 AC_MSG_RESULT(no)
3129         ])
3131         if test x$host_darwin = xno; then
3132                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3133         fi
3135         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3136         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3138         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3140         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3141         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3142         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3143         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3145         if test "x$mono_native_platform_ios" = "xno"; then
3146                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3147                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3148                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3149         fi
3151         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3152         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3153         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3154         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3155         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_ADVISE, 1, [posix_fadvise])]) # the define is called HAVE_POSIX_ADVISE in corefx, not a typo
3156         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3157         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3158         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3160         if test "x$platform_android" != "xyes"; then
3161                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3162         fi
3164         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3165         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3166         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3167         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3168         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3169         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3171         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>]])
3172         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>]])
3173         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>]])
3174         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>]])
3175         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3176         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3177         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3179         AC_MSG_CHECKING(for struct statfs)
3180         AC_TRY_COMPILE([
3181                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3182                 #include <sys/mount.h>
3183                 #else
3184                 #include <sys/statfs.h>
3185                 #endif
3186         ], [
3187                 struct statfs;
3188         ],[
3189                 AC_MSG_RESULT(yes)
3190                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3191         ], [
3192                 AC_MSG_RESULT(no)
3193         ])
3195         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3196                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3197         fi
3199         AC_MSG_CHECKING(for readdir_r)
3200         AC_TRY_LINK([
3201                 #include <dirent.h>
3202         ], [
3203                 DIR* dir;
3204                 struct dirent* entry;
3205                 struct dirent* result;
3206                 readdir_r(dir, entry, &result);
3207         ],[
3208                 AC_MSG_RESULT(yes)
3209                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3210         ], [
3211                 AC_MSG_RESULT(no)
3212         ])
3214         AC_MSG_CHECKING(for kevent with void *data)
3215         AC_TRY_LINK([
3216                 #include <sys/types.h>
3217                 #include <sys/event.h>
3218         ], [
3219                 struct kevent event;
3220                 void* data;
3221                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3222         ],[
3223                 AC_MSG_RESULT(yes)
3224                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3225         ], [
3226                 AC_MSG_RESULT(no)
3227         ])
3229         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3230         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3232         AC_MSG_CHECKING(for sendfile with 4 arguments)
3233         AC_TRY_LINK([
3234                 #include <sys/sendfile.h>
3235         ], [
3236                 #if defined(TARGET_ANDROID)
3237                 #if !defined(__ANDROID_API__)
3238                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3239                 #elif __ANDROID_API__ < 21
3240                 #error sendfile is not supported on this Android API level
3241                 #endif
3242                 #endif
3244                 int result = sendfile(0, 0, 0, 0);
3245         ],[
3246                 AC_MSG_RESULT(yes)
3247                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3248         ], [
3249                 AC_MSG_RESULT(no)
3250         ])
3252         ORIG_CFLAGS="$CFLAGS"
3253         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3255         AC_MSG_CHECKING(for sendfile with 6 arguments)
3256         AC_TRY_LINK([
3257                 #include <stdlib.h>
3258                 #include <sys/types.h>
3259                 #include <sys/socket.h>
3260                 #include <sys/uio.h>
3261         ], [
3262                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3263         ],[
3264                 AC_MSG_RESULT(yes)
3265                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3266         ], [
3267                 AC_MSG_RESULT(no)
3268         ])
3270         CFLAGS="$ORIG_CFLAGS"
3272         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3273         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3274         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3275         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3277         ORIG_CFLAGS="$CFLAGS"
3278         CFLAGS="$CFLAGS -Werror=sign-conversion"
3280         AC_MSG_CHECKING(for getnameinfo with signed flags)
3281         AC_TRY_LINK([
3282                 #include <sys/types.h>
3283                 #include <netdb.h>
3284         ], [
3285                 const struct sockaddr *addr;
3286                 socklen_t addrlen;
3287                 char *host;
3288                 socklen_t hostlen;
3289                 char *serv;
3290                 socklen_t servlen;
3291                 int flags;
3292                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3293         ],[
3294                 AC_MSG_RESULT(yes)
3295                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3296         ], [
3297                 AC_MSG_RESULT(no)
3298         ])
3300         CFLAGS="$ORIG_CFLAGS"
3302         if test "x$host_linux" = "xyes"; then
3303                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3304         else
3305                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3306         fi
3308         # HAVE_CLOCK_MONOTONIC check already done above
3309         # HAVE_CLOCK_REALTIME check already done above
3310         # HAVE_MACH_ABSOLUTE_TIME check already done above
3311         # HAVE_MACH_TIMEBASE_INFO check already done above
3312         # HAVE_FUTIMES check already done above
3313         # HAVE_FUTIMENS check already done above
3315         ORIG_CFLAGS="$CFLAGS"
3316         CFLAGS="$CFLAGS -Werror=sign-conversion"
3318         AC_MSG_CHECKING(for bind with unsigned addrlen)
3319         AC_TRY_LINK([
3320                 #include <sys/socket.h>
3321         ], [
3322                 int fd;
3323                 struct sockaddr* addr;
3324                 socklen_t addrLen;
3325                 bind(fd, addr, addrLen);
3326         ],[
3327                 AC_MSG_RESULT(yes)
3328                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3329         ], [
3330                 AC_MSG_RESULT(no)
3331         ])
3333         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3334         AC_TRY_LINK([
3335                 #include <netinet/in.h>
3336                 #include <netinet/tcp.h>
3337         ], [
3338                 struct ipv6_mreq opt;
3339                 unsigned int index = 0;
3340                 opt.ipv6mr_interface = index;
3341         ],[
3342                 AC_MSG_RESULT(yes)
3343                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3344         ], [
3345                 AC_MSG_RESULT(no)
3346         ])
3348         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3349         AC_TRY_LINK([
3350                 #include <sys/inotify.h>
3351         ], [
3352                 intptr_t fd;
3353                 uint32_t wd;
3354                 int result = inotify_rm_watch(fd, wd);
3355         ],[
3356                 AC_MSG_RESULT(yes)
3357                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3358         ], [
3359                 AC_MSG_RESULT(no)
3360         ])
3362         CFLAGS="$ORIG_CFLAGS"
3364         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3365         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3366                 AC_MSG_RESULT(no)
3367         elif test "x$cross_compiling" = "xyes"; then
3368                 AC_MSG_RESULT(cross compiling, assuming yes)
3369                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3370         else
3371                 AC_TRY_RUN([
3372                         #include <sys/mman.h>
3373                         #include <fcntl.h>
3374                         #include <unistd.h>
3376                         int main ()
3377                         {
3378                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3379                                 if (fd == -1)
3380                                         return -1;
3382                                 shm_unlink("/mono_configure_shm_open");
3384                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3385                                 //       on at least the current version of Mac OS X
3387                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3388                                         return -1;
3390                                 return 0;
3391                         }
3392                 ],[
3393                         AC_MSG_RESULT(yes)
3394                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3395                 ], [
3396                         AC_MSG_RESULT(no)
3397                 ])
3398         fi
3400         AC_MSG_CHECKING(for getpriority with int who)
3401         AC_TRY_LINK([
3402                 #include <sys/resource.h>
3403         ], [
3404                 int which;
3405                 int who;
3406                 int result = getpriority(which, who);
3407         ],[
3408                 AC_MSG_RESULT(yes)
3409                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3410         ], [
3411                 AC_MSG_RESULT(no)
3412         ])
3414         AC_MSG_CHECKING(for kevent with int parameters)
3415         AC_TRY_LINK([
3416                 #include <sys/types.h>
3417                 #include <sys/event.h>
3418         ], [
3419                 int kg;
3420                 const struct kevent* chagelist;
3421                 int nchanges;
3422                 struct kevent* eventlist;
3423                 int nevents;
3424                 const struct timespec* timeout;
3425                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3426         ],[
3427                 AC_MSG_RESULT(yes)
3428                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3429         ], [
3430                 AC_MSG_RESULT(no)
3431         ])
3433         AC_CHECK_FUNCS(mkstemps)
3434         # AC_CHECK_FUNCS(mkstemp) # already done above
3436         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3437                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3438         fi
3440         AC_MSG_CHECKING(for tcp/var.h)
3441         AC_TRY_LINK([
3442                 #include <sys/types.h>
3443                 #include <sys/socketvar.h>
3444                 #include <netinet/ip.h>
3445                 #include <netinet/tcp.h>
3446                 #include <netinet/tcp_var.h>
3447         ], [
3448         ],[
3449                 AC_MSG_RESULT(yes)
3450                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3451         ], [
3452                 AC_MSG_RESULT(no)
3453         ])
3455         AC_CHECK_HEADERS([sys/cdefs.h])
3457         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3458         AC_TRY_LINK([
3459                 #ifdef HAVE_SYS_CDEFS_H
3460                 #include <sys/cdefs.h>
3461                 #endif
3462                 #include <netinet/tcp.h>
3463         ], [
3464                 int result = TCP_ESTABLISHED;
3465         ],[
3466                 AC_MSG_RESULT(yes)
3467                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3468         ], [
3469                 AC_MSG_RESULT(no)
3470         ])
3472         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3474         AC_MSG_CHECKING(for struct rt_msghdr)
3475         AC_TRY_COMPILE([
3476                 #include <sys/types.h>
3477                 #include <net/route.h>
3478         ], [
3479                 struct rt_msghdr;
3480         ],[
3481                 AC_MSG_RESULT(yes)
3482                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3483         ], [
3484                 AC_MSG_RESULT(no)
3485         ])
3487         AC_CHECK_HEADERS([sys/sysctl.h])
3488         AC_CHECK_HEADERS([linux/rtnetlink.h])
3490         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3491         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3492         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3494         ORIG_CFLAGS="$CFLAGS"
3495         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3497         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3498         AC_TRY_LINK([
3499                 #include <unistd.h>
3500         ], [
3501                 size_t namelen = 20;
3502                 char name[20];
3503                 int result = getdomainname(name, namelen);
3504         ],[
3505                 AC_MSG_RESULT(yes)
3506                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3507         ], [
3508                 AC_MSG_RESULT(no)
3509         ])
3511         CFLAGS="$ORIG_CFLAGS"
3513         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3514         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3515         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3517         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
3518                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3519         elif test "x$host_linux" = "xyes"; then
3520                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3521         fi
3523         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3524         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3525         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3526         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3528         enable_gss=no;
3529         AC_MSG_CHECKING(for GSS/GSS.h)
3530         AC_TRY_COMPILE([
3531                         #include <GSS/GSS.h>
3532         ], [
3533         ],[
3534                         AC_MSG_RESULT(yes)
3535                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3536                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3537                         enable_gss=yes
3538         ], [
3539                         AC_MSG_RESULT(no)
3540         ])
3542         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3543         AC_TRY_COMPILE([
3544                         #include <gssapi/gssapi_ext.h>
3545         ], [
3546         ],[
3547                         AC_MSG_RESULT(yes)
3548                         enable_gss=yes
3549         ], [
3550                         AC_MSG_RESULT(no)
3551         ])
3553         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3554         AC_TRY_COMPILE([
3555                         #include <gssapi/gssapi_ext.h>
3556                         #include <gssapi/gssapi_krb5.h>
3557                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3558         ], [
3559         ],[
3560                         AC_MSG_RESULT(yes)
3561                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3562         ], [
3563                         AC_MSG_RESULT(no)
3564         ])
3566         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3568         AC_CHECK_HEADERS([crt_externs.h])
3570         AC_MSG_CHECKING(for _NSGetEnviron)
3571         AC_TRY_LINK([
3572                 #include <crt_externs.h>
3573         ], [
3574                 char **result = *(_NSGetEnviron());
3575         ],[
3576                 AC_MSG_RESULT(yes)
3577                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3578         ], [
3579                 AC_MSG_RESULT(no)
3580         ])
3582         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3584         # *** End of Mono.Native checks ***
3585 else
3586         AM_CONDITIONAL(ENABLE_GSS, false)
3588         dnl *********************************
3589         dnl *** Checks for Windows compilation ***
3590         dnl *********************************
3591         AC_CHECK_HEADERS(winternl.h)
3593         jdk_headers_found=no
3594         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3595         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3596         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3597         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3598         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3599         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3600         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3602         dnl *********************************
3603         dnl *** Check for struct ip_mreqn ***
3604         dnl *********************************
3605         AC_MSG_CHECKING(for struct ip_mreqn)
3606         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3607                 struct ip_mreqn mreq;
3608                 mreq.imr_address.s_addr = 0;
3609         ], [
3610                 # Yes, we have it...
3611                 AC_MSG_RESULT(yes)
3612                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3613         ], [
3614                 # We'll just have to try and use struct ip_mreq
3615                 AC_MSG_RESULT(no)
3616                 AC_MSG_CHECKING(for struct ip_mreq)
3617                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3618                         struct ip_mreq mreq;
3619                         mreq.imr_interface.s_addr = 0;
3620                 ], [
3621                         # Yes, we have it...
3622                         AC_MSG_RESULT(yes)
3623                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3624                 ], [
3625                         # No multicast support
3626                         AC_MSG_RESULT(no)
3627                 ])
3628         ])
3630         dnl **********************************
3631         dnl *** Check for getaddrinfo ***
3632         dnl **********************************
3633         AC_MSG_CHECKING(for getaddrinfo)
3634                 AC_TRY_LINK([
3635                 #include <stdio.h>
3636                 #include <winsock2.h>
3637                 #include <ws2tcpip.h>
3638         ], [
3639                 getaddrinfo(NULL,NULL,NULL,NULL);
3640         ], [
3641                 # Yes, we have it...
3642                 AC_MSG_RESULT(yes)
3643                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3644         ], [
3645                 AC_MSG_RESULT(no)
3646         ])
3648         dnl **********************************
3649         dnl *** Check for gethostbyname ***
3650         dnl **********************************
3651         AC_MSG_CHECKING(for gethostbyname)
3652                 AC_TRY_LINK([
3653                 #include <stdio.h>
3654                 #include <winsock2.h>
3655                 #include <ws2tcpip.h>
3656         ], [
3657                 gethostbyname(NULL);
3658         ], [
3659                 # Yes, we have it...
3660                 AC_MSG_RESULT(yes)
3661                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3662         ], [
3663                 AC_MSG_RESULT(no)
3664         ])
3666         dnl **********************************
3667         dnl *** Check for getprotobyname ***
3668         dnl **********************************
3669         AC_MSG_CHECKING(for getprotobyname)
3670                 AC_TRY_LINK([
3671                 #include <stdio.h>
3672                 #include <winsock2.h>
3673                 #include <ws2tcpip.h>
3674         ], [
3675                 getprotobyname(NULL);
3676         ], [
3677                 # Yes, we have it...
3678                 AC_MSG_RESULT(yes)
3679                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3680         ], [
3681                 AC_MSG_RESULT(no)
3682         ])
3684         dnl **********************************
3685         dnl *** Check for getnameinfo ***
3686         dnl **********************************
3687         AC_MSG_CHECKING(for getnameinfo)
3688                 AC_TRY_LINK([
3689                 #include <stdio.h>
3690                 #include <winsock2.h>
3691                 #include <ws2tcpip.h>
3692         ], [
3693                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3694         ], [
3695                 # Yes, we have it...
3696                 AC_MSG_RESULT(yes)
3697                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3698         ], [
3699                 AC_MSG_RESULT(no)
3700         ])
3702         dnl **********************************
3703         dnl *** Check for inet_ntop ***
3704         dnl **********************************
3705         AC_MSG_CHECKING(for inet_ntop)
3706                 AC_TRY_LINK([
3707                 #include <stdio.h>
3708                 #include <winsock2.h>
3709                 #include <ws2tcpip.h>
3710         ], [
3711                 inet_ntop (0, NULL, NULL, 0);
3712         ], [
3713                 # Yes, we have it...
3714                 AC_MSG_RESULT(yes)
3715                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3716         ], [
3717                 AC_MSG_RESULT(no)
3718         ])
3720         dnl **********************************
3721         dnl *** Check for inet_pton ***
3722         dnl **********************************
3723         AC_MSG_CHECKING(for inet_pton)
3724                 AC_TRY_LINK([
3725                 #include <stdio.h>
3726                 #include <winsock2.h>
3727                 #include <ws2tcpip.h>
3728         ], [
3729                 #ifndef inet_pton
3730                 (void) inet_pton;
3731                 #endif
3732                 inet_pton (0, NULL, NULL);
3733         ], [
3734                 # Yes, we have it...
3735                 AC_MSG_RESULT(yes)
3736                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3737         ], [
3738                 AC_MSG_RESULT(no)
3739         ])
3741         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3742         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3743         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3744         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3745         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3746         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3747         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3750 dnl socklen_t check
3751 AC_MSG_CHECKING(for socklen_t)
3752 AC_TRY_COMPILE([
3753 #include <sys/types.h>
3754 #include <sys/socket.h>
3756   socklen_t foo;
3758 ac_cv_c_socklen_t=yes
3759         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3760         AC_MSG_RESULT(yes)
3762         AC_MSG_RESULT(no)
3765 AC_CHECK_FUNCS(execvp)
3767 dnl ****************************
3768 dnl *** Look for /dev/random ***
3769 dnl ****************************
3771 AC_MSG_CHECKING([if usage of random device is requested])
3772 AC_ARG_ENABLE(dev-random,
3773 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3774 try_dev_random=$enableval, try_dev_random=yes)
3776 AC_MSG_RESULT($try_dev_random)
3778 case "{$build}" in
3780 dnl IBM i does not have /dev/random, use unblocking only
3782     *-*-os400*)
3783     NAME_DEV_RANDOM="/dev/urandom"
3784     ;;
3786 dnl Win32 does not have /dev/random, they have their own method...
3788     *-mingw*|*-*-cygwin*)
3789     ac_cv_have_dev_random=no
3790     ;;
3792 dnl Everywhere else, it's /dev/random
3794     *)
3795     NAME_DEV_RANDOM="/dev/random"
3796     ;;
3797 esac
3799 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3801 dnl Now check if the device actually exists
3803 if test "x$try_dev_random" = "xyes"; then
3804     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3805     [if test -r "$NAME_DEV_RANDOM" ; then
3806         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3807     if test "x$ac_cv_have_dev_random" = "xyes"; then
3808         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3809     fi
3810 else
3811     AC_MSG_CHECKING(for random device)
3812     ac_cv_have_dev_random=no
3813     AC_MSG_RESULT(has been disabled)
3816 if test "x$host_win32" = "xyes"; then
3817     AC_DEFINE(HAVE_CRYPT_RNG)
3820 if test "x$ac_cv_have_dev_random" = "xno" \
3821     && test "x$host_win32" = "xno"; then
3822     AC_MSG_WARN([[
3824 *** A system-provided entropy source was not found on this system.
3825 *** Because of this, the System.Security.Cryptography random number generator
3826 *** will throw a NotImplemented exception.
3828 *** If you are seeing this message, and you know your system DOES have an
3829 *** entropy collection in place, please report an issue on GitHub and
3830 *** provide information about the system and how to access the random device.
3832 *** Otherwise you can install either egd or prngd and set the environment
3833 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3834 ***]])
3837 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)
3839 AC_MSG_CHECKING([if big-arrays are to be enabled])
3840 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)
3841 if test "x$enable_big_arrays" = "xyes" ; then
3842     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3843         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3844     else
3845         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3846     fi
3848 AC_MSG_RESULT($enable_big_arrays)
3850 dnl **************
3851 dnl *** DTRACE ***
3852 dnl **************
3854 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3856 if test "x$enable_dtrace" = "xyes"; then
3857    if test "x$has_dtrace" = "xno"; then
3858           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3859    fi
3860    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3861    if test "x$DTRACE" = "xno"; then
3862           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3863           enable_dtrace=no
3864    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3865           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3866           enable_dtrace=no
3867    fi
3870 dtrace_g=no
3871 if test "x$enable_dtrace" = "xyes"; then
3872         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3873         DTRACEFLAGS=
3874         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3875                 case "$host" in
3876                         powerpc-*-darwin*)
3877                         DTRACEFLAGS="-arch ppc64"
3878                         ;;
3879                         i*86-*-darwin*)
3880                         DTRACEFLAGS="-arch x86_64"
3881                         ;;
3882                         *)
3883                         DTRACEFLAGS=-64
3884                         ;;
3885                 esac
3886         else
3887                 case "$host" in
3888                         powerpc-*-darwin*)
3889                         DTRACEFLAGS="-arch ppc"
3890                         ;;
3891                         i*86-*-darwin*)
3892                         DTRACEFLAGS="-arch i386"
3893                         ;;
3894                         *)
3895                         DTRACEFLAGS=-32
3896                         ;;
3897                 esac
3898         fi
3899         AC_SUBST(DTRACEFLAGS)
3900         case "$host" in
3901                 *-*-solaris*)
3902                 dtrace_g=yes
3903                 ;;
3904         esac
3905         AC_CHECK_HEADERS([sys/sdt.h])
3907 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3908 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3910 dnl **************************
3911 dnl *** AOT cross offsets  ***
3912 dnl **************************
3914 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3915     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3917 dnl **************
3918 dnl ***  LLVM  ***
3919 dnl **************
3921 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3922 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3923 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)
3924 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3925 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3927 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3929 if test "x$enable_llvm" = "xdefault"; then
3930    enable_llvm=$enable_llvm_default
3933 enable_llvm_msvc_only="no"
3934 if test "x$enable_llvm" = "xyes"; then
3935         if test "x$host_win32" = "xyes"; then
3936                 if test "x$cross_compiling" = "xno"; then
3937                         case "$target" in
3938                         x86_64*)
3939                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3940                                 enable_llvm_msvc_only="yes"
3941                                 ;;
3942                         i686*)
3943                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3944                                 ;;
3945                         esac
3946                 fi
3947                 if test "x$enable_loadedllvm" = "xyes"; then
3948                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3949                         enable_loadedllvm=no
3950                 fi
3951         fi
3954 internal_llvm="no"
3955 if test "x$enable_llvm" = "xyes"; then
3956         if test "x$with_llvm" != "x"; then
3957                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3958                 if test x$host_win32 = xyes; then
3959                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3960                 fi
3961                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3962                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3963                 fi
3964         else
3965                 if test x$host_win32 = xyes; then
3966                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3967                 else
3968                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3969                 fi
3970                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3971                         internal_llvm=yes
3972                 fi
3973         fi
3975         LLVM_CODEGEN_LIBS="x86codegen"
3976         case "$target" in
3977         arm*)
3978                 LLVM_CODEGEN_LIBS="armcodegen"
3979                 ;;
3980         aarch64*)
3981                 LLVM_CODEGEN_LIBS="aarch64codegen"
3982                 ;;
3983         powerpc*)
3984                 LLVM_CODEGEN_LIBS="powerpccodegen"
3985                 ;;
3986         esac
3987         if test "x$host" != "x$target"; then
3988                 # No need for jit libs
3989                 LLVM_CODEGEN_LIBS=
3990         fi
3992         AC_SUBST(LLVM_CODEGEN_LIBS)
3993         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3995         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3996                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3997                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3998         fi
3999         if test "x$enable_llvm_msvc_only" != "xyes"; then
4000                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4001         else
4002                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4003         fi
4004 fi # ENABLE_LLVM
4006 # AC_DEFINE necessary for correct restore behavior on Linux
4007 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4008 if test "x$internal_llvm" != "xno"; then
4009         if test "x$enable_llvm_msvc_only" != "xyes"; then
4010                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4011         else
4012                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4013         fi
4016 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4017 if test "x$enable_llvm_asserts" != "xno"; then
4018         if test "x$enable_llvm_msvc_only" != "xyes"; then
4019                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4020         else
4021                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4022         fi
4025 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4027 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4028 if test "x$enable_loadedllvm" = "xyes"; then
4029         if test "x$enable_llvm_msvc_only" != "xyes"; then
4030                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4031         fi
4034 if test "x$enable_llvm" = "xyes"; then
4035         enable_llvm_runtime=yes
4038 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4039 if test "x$enable_llvm_runtime" = "xyes"; then
4040         if test "x$enable_llvm_msvc_only" != "xyes"; then
4041                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4042         else
4043                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4044         fi
4047 TARGET="unknown"
4048 ACCESS_UNALIGNED="yes"
4050 LIBC="libc.so.6"
4051 INTL="libc.so.6"
4052 SQLITE="libsqlite.so.0"
4053 SQLITE3="libsqlite3.so.0"
4054 X11="libX11.so"
4055 GDKX11="libgdk-x11-2.0.so.0"
4056 GTKX11="libgtk-x11-2.0.so.0"
4057 XINERAMA="libXinerama.so.1"
4059 sizeof_register="SIZEOF_VOID_P"
4061 jit_wanted=true
4062 boehm_supported=true
4063 BTLS_SUPPORTED=no
4064 BTLS_PLATFORM=
4066 case "$host" in
4067         wasm32*)
4068                 TARGET=WASM
4069                 arch_target=wasm
4070                 BTLS_SUPPORTED=no
4071                 ACCESS_UNALIGNED="no"
4072                 with_tls=pthread
4073                 target_wasm=yes
4074                 ;;
4075         mips*)
4076                 TARGET=MIPS;
4077                 arch_target=mips;
4078                 with_tls=pthread;
4079                 ACCESS_UNALIGNED="no"
4081                 AC_MSG_CHECKING(for mips n32)
4082                 AC_TRY_COMPILE([],[
4083                 #if _MIPS_SIM != _ABIN32
4084                 #error Not mips n32
4085                 #endif
4086                 ],[
4087                 AC_MSG_RESULT(yes)
4088                 sizeof_register=8
4089                 ],[
4090                 AC_MSG_RESULT(no)
4091                 ])
4092                 ;;
4093         i*86-*-*)
4094                 TARGET=X86;
4095                 arch_target=x86;
4096                 case $host_os in
4097                   solaris*)
4098                         LIBC="libc.so"
4099                         INTL="libintl.so"
4100                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4101                                 TARGET=AMD64
4102                                 arch_target=amd64
4103                         fi
4105                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4106                         # int astruct __attribute__ ((visibility ("hidden")));
4107                         # void foo ()
4108                         # {
4109                         #       void *p = &astruct;
4110                         # }
4111                         # gcc -fPIC --shared -o libfoo.so foo.c
4112                         # yields:
4113                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4114                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4115                         have_visibility_hidden=no
4116                         ;;
4117                   mingw*|cygwin*)
4118                         have_visibility_hidden=no
4119                         BTLS_SUPPORTED=no
4120                         BTLS_PLATFORM=i386
4121                         ;;
4122                   haiku*)
4123                         LIBC=libroot.so
4124                         ;;
4125                   linux*)
4126                         AOT_SUPPORTED="yes"
4127                         BTLS_SUPPORTED=yes
4128                         BTLS_PLATFORM=i386
4129                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4130                         ;;
4131                   darwin*)
4132                         AOT_SUPPORTED="yes"
4133                         BTLS_SUPPORTED=yes
4134                         BTLS_PLATFORM=i386
4135                         ;;
4136                   openbsd*|freebsd*|kfreebsd-gnu*)
4137                         AOT_SUPPORTED="yes"
4138                         BTLS_SUPPORTED=yes
4139                         BTLS_PLATFORM=i386
4140                         ;;
4141                 esac
4142                 ;;
4143         x86_64-*-* | amd64-*-*)
4144                 TARGET=AMD64;
4145                 arch_target=amd64;
4146                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4147                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4148                         sizeof_register=8
4149                 fi
4150                 case $host_os in
4151                   linux*)
4152                         AOT_SUPPORTED="yes"
4153                         BTLS_SUPPORTED=yes
4154                         BTLS_PLATFORM=x86_64
4155                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4156                         ;;
4157                   darwin*)
4158                         AOT_SUPPORTED="yes"
4159                         BTLS_SUPPORTED=yes
4160                         BTLS_PLATFORM=x86_64
4161                         boehm_supported=false
4162                         ;;
4163                   openbsd*|freebsd*|kfreebsd-gnu*)
4164                         AOT_SUPPORTED="yes"
4165                         BTLS_SUPPORTED=yes
4166                         BTLS_PLATFORM=x86_64
4167                         ;;
4168                   mingw*|cygwin*)
4169                         BTLS_SUPPORTED=no
4170                         BTLS_PLATFORM=x86_64
4171                         ;;
4172                 esac
4173                 ;;
4174         sparc*-*-*)
4175                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4176                    TARGET=SPARC64
4177                 else
4178                         TARGET=SPARC
4179                 fi
4180                 arch_target=sparc;
4181                 ACCESS_UNALIGNED="no"
4182                 case $host_os in
4183                   linux*) ;;
4184                   *)
4185                         LIBC="libc.so"
4186                         INTL="libintl.so"
4187                 esac
4188                 if test x"$GCC" = xyes; then
4189                         # We don't support v8 cpus
4190                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4191                 fi
4192                 if test x"$AR" = xfalse; then
4193                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4194                 fi
4195                 ;;
4196         *-mingw*|*-*-cygwin*)
4197                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4198                 have_visibility_hidden=no
4199                 INTL="intl"
4200                 case "$host" in
4201                         x86_64*mingw*)
4202                                 # Old Boehm fails to compile for x86_64-mingw.
4203                                 # It is trivial to fix, but just silently drop it.
4204                                 boehm_supported=false
4205                                 ;;
4206                 esac
4207                 ;;
4208         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4209         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4210         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4211                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4212                         TARGET=POWERPC64;
4213                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4214                         if ! (echo $CC | grep -q -- 'clang'); then
4215                                 CFLAGS="$CFLAGS -mminimal-toc"
4216                         fi
4217                 else
4218                         TARGET=POWERPC;
4219                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4220                 fi
4221                 arch_target=ppc;
4222                 case $host_os in
4223                   aix*|os400*)
4224                         BTLS_SUPPORTED=yes
4225                         BTLS_PLATFORM=powerpc
4226                         dnl on AIX/PASE, shared libraries can be inside archives
4227                         dnl if they are, we specify them by lib.a(lib.so)
4228                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4229                         LIBC="libc.a(shr_64.o)"
4230                         INTL="libintl.a(libintl.so.8)"
4231                         ;;
4232                   linux*)
4233                         BTLS_SUPPORTED=yes
4234                         BTLS_PLATFORM=powerpc
4235                         ;;
4236                 esac
4237                 ;;
4238         armv7k-*-darwin*)
4239                 TARGET=ARM;
4240                 TARGET_SYS=WATCHOS
4241                 arch_target=arm;
4242                 arm_fpu=VFP_HARD
4243                 ACCESS_UNALIGNED="no"
4244                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4245                 ;;
4247         arm*-darwin*)
4248                 TARGET=ARM;
4249                 arch_target=arm;
4250                 ACCESS_UNALIGNED="no"
4251                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4252                 ;;
4253         arm*-linux*)
4254                 TARGET=ARM;
4255                 arch_target=arm;
4256                 ACCESS_UNALIGNED="no"
4257                 AOT_SUPPORTED="yes"
4258                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4259                 BTLS_SUPPORTED=yes
4260                 BTLS_PLATFORM=arm
4261                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4262                 case "$target" in
4263                 arm*-linux*-gnueabi)
4264                         BTLS_PLATFORM=armsoft
4265                         ;;
4266                 esac
4267                 ;;
4268         arm*-netbsd*-eabi*)
4269                 TARGET=ARM;
4270                 arch_target=arm;
4271                 ACCESS_UNALIGNED="no"
4272                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4273                 ;;
4274         aarch64-*darwin*ilp32)
4275                 TARGET=ARM6432
4276                 arch_target=arm64
4277                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4278                 sizeof_register=8
4279                 # assuming no other target other than watchOS is using aarch64*darwin triple
4280                 TARGET_SYS=WATCHOS
4281                 ;;
4282         aarch64-*)
4283                 # https://lkml.org/lkml/2012/7/15/133
4284                 TARGET=ARM64
4285                 arch_target=arm64
4286                 boehm_supported=false
4287                 AOT_SUPPORTED="yes"
4288                 BTLS_SUPPORTED=yes
4289                 BTLS_PLATFORM=aarch64
4290                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4291                 ;;
4292         s390x-*-linux*)
4293                 TARGET=S390X;
4294                 arch_target=s390x;
4295                 ACCESS_UNALIGNED="yes"
4296                 BTLS_SUPPORTED=yes
4297                 BTLS_PLATFORM=s390x
4298                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4299                 ;;
4300         riscv32-*)
4301                 TARGET=RISCV32
4302                 ACCESS_UNALIGNED=no
4303                 AOT_SUPPORTED=no
4304                 BTLS_SUPPORTED=yes
4305                 BTLS_PLATFORM=riscv32
4306                 arch_target=riscv32
4307                 boehm_supported=false
4308                 ;;
4309         riscv64*)
4310                 TARGET=RISCV64
4311                 ACCESS_UNALIGNED=no
4312                 AOT_SUPPORTED=no
4313                 BTLS_SUPPORTED=yes
4314                 BTLS_PLATFORM=riscv64
4315                 arch_target=riscv64
4316                 boehm_supported=false
4317                 ;;
4318 esac
4320 HOST=$TARGET
4322 if test "x$host" != "x$target"; then
4323    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4324    enable_mcs_build=no
4325    enable_support_build=no
4326    BTLS_SUPPORTED=no
4327    # Can't use tls, since it depends on the runtime detection of tls offsets
4328    # in mono-compiler.h
4329    with_tls=pthread
4330    target_mach=no
4331    case "$target" in
4332    wasm32*)
4333                 TARGET=WASM
4334                 arch_target=wasm
4335                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4336                 ;;
4337    arm*-darwin*)
4338                 TARGET=ARM;
4339                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4340                 case "$target" in
4341                 armv7k-*)
4342                         arm_fpu=VFP_HARD
4343                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4344                         ;;
4345                 esac            
4346                 ;;
4347    powerpc64-ps3-linux-gnu)
4348                 TARGET=POWERPC64
4349                 arch_target=powerpc64
4350                 AC_DEFINE(TARGET_PS3, 1, [...])
4351                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4352                 # uses this define
4353                 AC_DEFINE(__mono_ppc64__, 1, [...])
4354                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4355                 sizeof_register=8
4356                 target_byte_order=G_BIG_ENDIAN
4357                 ;;
4358    powerpc64-xbox360-linux-gnu)
4359                 TARGET=POWERPC64
4360                 arch_target=powerpc64
4361                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4362                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4363                 # uses this define
4364                 sizeof_register=8
4365                 target_byte_order=G_BIG_ENDIAN
4366                 ;;
4367    arm*-linux-*)
4368                 TARGET=ARM;
4369                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4370                 ;;
4371    arm*-netbsd*-eabi*)
4372                 TARGET=ARM;
4373                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4374                 ;;
4375    i686*-linux-*)
4376                 TARGET=X86;
4377                 ;;
4378    i*86-apple-*)
4379                 TARGET=X86;
4380                 ;;
4381    x86_64*-linux-*)
4382                 TARGET=AMD64;
4383                 ;;
4384    x86_64-ps4-freebsd)
4385                 TARGET=AMD64;
4386                 AC_DEFINE(TARGET_PS4, 1, [...])
4387                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4388                 CPPFLAGS="$CPPFLAGS"
4389                 target_win32=no
4390                 ;;
4391         aarch64*darwin*_ilp32)
4392                 TARGET=ARM6432;
4393                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4394                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4395                 ;;
4396         aarch64-*)
4397                 TARGET=ARM64
4398                 ;;
4399         riscv32*)
4400                 TARGET=RISCV32
4401                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4402                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4403                 arch_target=riscv32
4404                 target_mach=no
4405                 with_tls=pthread
4406                 ;;
4407         riscv64*)
4408                 TARGET=RISCV64
4409                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4410                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4411                 arch_target=riscv64
4412                 target_mach=no
4413                 with_tls=pthread
4414                 ;;
4415         *)
4416                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4417         esac
4419         case "$target" in
4420         *-darwin*)
4421                 target_mach=yes
4422                 ;;
4423         *-linux-android*)
4424                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4425                 ;;
4426         esac
4429 case "$TARGET" in
4430 WASM)
4431         AC_DEFINE(TARGET_WASM, 1, [...])
4432         arch_target=wasm
4433         ;;
4434 X86)
4435         AC_DEFINE(TARGET_X86, 1, [...])
4436         arch_target=x86
4437         ;;
4438 AMD64)
4439         AC_DEFINE(TARGET_AMD64, 1, [...])
4440         arch_target=amd64
4441         ;;
4442 ARM)
4443         AC_DEFINE(TARGET_ARM, 1, [...])
4444         arch_target=arm
4445         ACCESS_UNALIGNED="no"
4446         ;;
4447 ARM64|ARM6432)
4448         AC_DEFINE(TARGET_ARM64, 1, [...])
4449         arch_target=arm64
4450         ;;
4451 POWERPC)
4452         AC_DEFINE(TARGET_POWERPC, 1, [...])
4453         ;;
4454 POWERPC64)
4455         AC_DEFINE(TARGET_POWERPC, 1, [...])
4456         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4457         ;;
4458 S390X)
4459         AC_DEFINE(TARGET_S390X, 1, [...])
4460         ;;
4461 MIPS)
4462         AC_DEFINE(TARGET_MIPS, 1, [...])
4463         ;;
4464 SPARC)
4465         AC_DEFINE(TARGET_SPARC, 1, [...])
4466         ;;
4467 SPARC64)
4468         AC_DEFINE(TARGET_SPARC64, 1, [...])
4469         ;;
4470 RISCV32)
4471         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4472         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4473         ;;
4474 RISCV64)
4475         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4476         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4477         ;;
4478 esac
4480 case "$TARGET" in
4481 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4482     target_sizeof_void_p=4
4483     ;;
4484 *64* | S390X)
4485     target_sizeof_void_p=8
4486     ;;
4488     AC_MSG_ERROR([unknown target])
4489     ;;
4490 esac
4492 case "$HOST" in
4493 WASM)
4494         AC_DEFINE(HOST_WASM, 1, [...])
4495         ;;
4496 X86)
4497         AC_DEFINE(HOST_X86, 1, [...])
4498         ;;
4499 AMD64)
4500         AC_DEFINE(HOST_AMD64, 1, [...])
4501         ;;
4502 ARM)
4503         AC_DEFINE(HOST_ARM, 1, [...])
4504         ;;
4505 ARM64)
4506         AC_DEFINE(HOST_ARM64, 1, [...])
4507         ;;
4508 POWERPC)
4509         AC_DEFINE(HOST_POWERPC, 1, [...])
4510         ;;
4511 POWERPC64)
4512         AC_DEFINE(HOST_POWERPC, 1, [...])
4513         AC_DEFINE(HOST_POWERPC64, 1, [...])
4514         ;;
4515 S390X)
4516         AC_DEFINE(HOST_S390X, 1, [...])
4517         ;;
4518 MIPS)
4519         AC_DEFINE(HOST_MIPS, 1, [...])
4520         ;;
4521 SPARC)
4522         AC_DEFINE(HOST_SPARC, 1, [...])
4523         ;;
4524 SPARC64)
4525         AC_DEFINE(HOST_SPARC64, 1, [...])
4526         ;;
4527 RISCV32)
4528         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4529         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4530         ;;
4531 RISCV64)
4532         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4533         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4534         ;;
4535 esac
4537 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4538 case "$HOST" in
4539 X86 | AMD64 | ARM | ARM64)
4540         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4541         ;;
4542 esac
4544 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4545 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4547 dnl *************
4548 dnl *** VTUNE ***
4549 dnl *************
4551 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4552 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4554 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4556 if test "x$enable_vtune" = "xyes"; then
4557         if test "x$with_vtune" = "x"; then
4558                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4559         else
4560                 VTUNE_PATH=$with_vtune
4561         fi
4562         VTUNE_INCLUDE=$VTUNE_PATH/include
4563         case "$TARGET" in
4564         X86)
4565                 VTUNE_LIB=$VTUNE_PATH/lib32
4566                 ;;
4567         AMD64)
4568                 VTUNE_LIB=$VTUNE_PATH/lib64
4569                 ;;
4570         *)
4571                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4572                 ;;
4573         esac
4574         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4575                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4576         fi
4577         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4578                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4579         fi
4581         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4582         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4584         AC_SUBST(VTUNE_LIBS)
4585         AC_SUBST(VTUNE_CFLAGS)
4587 dnl Use GCC atomic ops if they work on the target.
4588 if test x$GCC = "xyes"; then
4589         case $TARGET in
4590         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4591                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4592                 ;;
4593         esac
4596 if test "x$target_mach" = "xyes"; then
4598    if test "x$TARGET_SYS" = "xWATCHOS"; then
4599           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4600           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4601           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4602           BTLS_SUPPORTED=no
4603    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4604           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4605           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4606           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4607           BTLS_SUPPORTED=no
4608           target_ios=yes
4609    else
4610        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4611        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4612        #error fail this for ios
4613        #endif
4614        ], [
4615                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4616           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4617           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4618           target_osx=yes
4619        ], [
4620           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4621           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4622           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4623           BTLS_SUPPORTED=no
4624                   target_ios=yes
4625        ])
4626         fi
4627    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4630 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4632 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4634 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4635    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4636 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4637    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4638 else
4639    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4642 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4644 if test "x$sizeof_register" = "x4"; then
4645   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4646 elif test "x$sizeof_register" = "x8"; then
4647   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4648 else
4649   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4652 if test "x$have_visibility_hidden" = "xyes"; then
4653    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4656 if test "x$have_deprecated" = "xyes"; then
4657    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4660 dnl 
4661 dnl Simple Generational checks (sgen)
4663 SGEN_DEFINES=
4664 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4665 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4666 if test x$buildsgen = xyes; then
4667    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4668    SGEN_DEFINES="-DHAVE_SGEN_GC"
4670         conc_gc_msg=""
4671    if test x$with_sgen_default_concurrent != xno; then
4672        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4673            conc_gc_msg=" (concurrent by default)"
4674    fi
4676    if test "x$gc_msg" = "x"; then
4677       gc_msg="sgen$conc_gc_msg"
4678    else
4679       gc_msg="sgen$conc_gc_msg and $gc_msg"
4680    fi
4682 AC_SUBST(SGEN_DEFINES)
4683 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4685 jit_status="Building and using the JIT"
4687 libsuffix=".so"
4689 case "$host" in
4690      *-*-darwin*)
4691         libsuffix=".dylib"
4692         LIBC="libc.dylib"
4693         INTL="libintl.dylib"
4694         SQLITE="libsqlite.0.dylib"
4695         SQLITE3="libsqlite3.0.dylib"
4696         X11="libX11.dylib"
4697         GDKX11="libgdk-x11-2.0.dylib"
4698         GTKX11="libgtk-x11-2.0.dylib"
4699         ;;
4700      *-*-*netbsd*)
4701         LIBC="libc.so"
4702         INTL="libintl.so"
4703         SQLITE="libsqlite.so"
4704         SQLITE3="libsqlite3.so"
4705         ;;
4706      *-*-kfreebsd*-gnu)
4707         LIBC="libc.so.0.1"
4708         INTL="libc.so.0.1"
4709         X11="libX11.so.6"
4710         ;;
4711     *-*-*freebsd*)
4712         LIBC="libc.so.7"
4713         INTL="libintl.so"
4714         SQLITE="libsqlite.so"
4715         SQLITE3="libsqlite3.so"
4716         ;;
4717     *-*-*openbsd*)
4718         LIBC="libc.so"
4719         INTL="libintl.so"
4720         SQLITE="libsqlite.so"
4721         SQLITE3="libsqlite3.so"
4722         ;;
4723     *-*-*linux*)
4724         AC_PATH_X
4725         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4726         AC_MSG_CHECKING(for the soname of libX11.so)
4727         for i in $x_libraries $dlsearch_path; do
4728                 for r in 4 5 6; do
4729                         if test -f $i/libX11.so.$r; then
4730                                 X11=libX11.so.$r
4731                                 AC_MSG_RESULT($X11)
4732                         fi
4733                 done
4734         done
4735         
4736         if test "x$X11" = "xlibX11.so"; then
4737                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4738                 X11=libX11.so.6
4739         fi
4740         ;;
4741 esac
4743 AC_SUBST(libsuffix)
4745 ######################################
4746 # EGLIB CHECKS
4747 ######################################
4749 GNUC_PRETTY=
4750 GNUC_UNUSED=
4751 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4752 if test x$GCC = xyes; then
4753    GNUC_UNUSED='__attribute__((__unused__))'
4754    GNUC_NORETURN='__attribute__((__noreturn__))'
4755    case $host_cpu in
4756      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4757    esac
4759 AC_SUBST(GNUC_PRETTY)
4760 AC_SUBST(GNUC_UNUSED)
4761 AC_SUBST(GNUC_NORETURN)
4762 AC_SUBST(BREAKPOINT)
4764 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4766 case $host in
4767 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4768     PATHSEP='\\'
4769     SEARCHSEP=';'
4770     OS="WIN32"
4771     PIDTYPE='void *'
4772     ;;
4774     PATHSEP='/'
4775     SEARCHSEP=':'
4776     OS="UNIX"
4777     PIDTYPE='int'
4778     ;;
4779 esac
4781 case $host in
4782         *-*-solaris*)
4783         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4784         ;;
4785 esac
4787 case $target in
4788 arm*-darwin*|aarch64*-*|riscv*)
4789     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4790     ;;
4791 i*86-*-darwin*)
4792     ORDER=G_LITTLE_ENDIAN
4793     ;;
4794 *-*-haiku*)
4795     LDFLAGS="$LDFLAGS -ltextencoding"
4796     ;;
4797 *-*-openbsd*)
4798     CFLAGS="$CFLAGS -pthread"
4799     LDFLAGS="$LDFLAGS -pthread"
4800     ;;
4801 esac
4803 AC_SUBST(ORDER)
4804 AC_SUBST(PATHSEP)
4805 AC_SUBST(SEARCHSEP)
4806 AC_SUBST(OS)
4807 AC_SUBST(PIDTYPE)
4809 # Defined for all targets/platforms using classic Windows API support.
4810 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4811 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4813 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4814 AC_CHECK_FUNCS(getrlimit)
4815 AC_CHECK_FUNCS(fork execv execve)
4816 AC_CHECK_FUNCS(waitpid)
4818 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4820 if test x$with_overridable_allocators = xyes; then
4821         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4822   AC_MSG_NOTICE([Overridable allocator support enabled])
4823 else
4824   AC_MSG_NOTICE([Overridable allocator support disabled])
4828 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4829 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4830 # removed once support for 10.6 is dropped.
4832 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4834 if test x$target_osx = xyes; then
4835 AC_CHECK_FUNCS(getpwuid_r)
4836 elif test x$target_ios = xno; then
4837 AC_CHECK_FUNCS(strndup getpwuid_r)
4840 AC_SEARCH_LIBS(sqrtf, m)
4842 # nanosleep may not be part of libc, also search it in other libraries
4843 AC_SEARCH_LIBS(nanosleep, rt)
4845 AC_SEARCH_LIBS(dlopen, dl)
4846 old_ldflags="${LDFLAGS}"
4847 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4848 if test $lt_cv_prog_gnu_ld = yes; then
4849         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4850 else
4851         case $host in
4852         *-*-aix*|*-*-os400*)
4853                 ;;
4854         *)
4855                 dnl Try to use export-dynamic anyways
4856                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4857                 ;;
4858         esac
4860 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4861 if test $found_export_dynamic = no; then
4862         LDFLAGS="${old_ldflags}"
4865 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4866 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4867 AC_CHECK_LIB(iconv, iconv_open)
4868 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4869 AC_SUBST(HAVE_ALLOCA_H)
4871 # Get the exact type of size_t, not just its size.
4872 # This is so we can find an exact printf format among u, lu, llu, I64u.
4873 # To avoid warnings about slight mismatches.
4874 # C99 runtime "zu" dependency is being avoided here.
4876 # We have to compile as C++ because C is too lenient
4877 # and lets the wrong thing compile, with warnings.
4879 # Note: "zu" or ifdef <something> have the advantage
4880 # of producing installable "biarch" headers. i.e. one Mac header
4881 # for Mac/x86 and Mac/amd64.
4883 AC_LANG_PUSH(C++)
4885 # Check long before int because it is the overwhelming Unix answer,
4886 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4888 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4890 AC_MSG_CHECKING(if size_t is unsigned long)
4891 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4892         #include <stddef.h>
4893         unsigned long *a = (size_t*)0;
4894 ])], [
4895         AC_MSG_RESULT(yes)
4896         AC_SUBST(GSIZE_FORMAT, '"lu"')
4897 ], [
4898         AC_MSG_RESULT(no)
4899         AC_MSG_CHECKING(if size_t is unsigned int)
4900         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4901                 #include <stddef.h>
4902                 unsigned *a = (size_t*)0;
4903         ])], [
4904                 AC_MSG_RESULT(yes)
4905                 AC_SUBST(GSIZE_FORMAT, '"u"')
4906         ], [
4907 # At this point the majority of systems have their answer,
4908 # and we descend into non-standard or new-standard territory.
4910 # Check __int64 first because I64 on some systems predates ll, enabling
4911 # new compiler/old runtime interop, and the types always have the same size.
4912                 AC_MSG_RESULT(no)
4913                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4914                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4915                         #include <stddef.h>
4916                         unsigned __int64 *a = (size_t*)0;
4917                 ])], [
4918                         AC_MSG_RESULT(yes)
4919                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4920                 ], [
4921                         AC_MSG_RESULT(no)
4922                         AC_MSG_CHECKING(if size_t is unsigned long long)
4923                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4924                                 #include <stddef.h>
4925                                 unsigned long long *a = (size_t*)0;
4926                         ])], [
4927                                 AC_MSG_RESULT(yes)
4928                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4929                         ], [
4930                                 AC_MSG_RESULT(no)
4931                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4932                         ] )
4933                 ] )
4934         ] )
4935 ] )
4937 AC_LANG_POP
4939 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4940 # This provides for an exact match with functions that
4941 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4942 # uintptr_t is not necessarily the same.
4944 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4945 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4947 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4948    GSIZE="size_t"
4949    GSSIZE="ptrdiff_t"
4950 else
4951    GSIZE="uintptr_t"
4952    GSSIZE="intptr_t"
4955 AC_SUBST(GSIZE)
4956 AC_SUBST(GSSIZE)
4957 AC_SUBST(GSIZE_FORMAT)
4960 # END OF EGLIB CHECKS
4963 AC_ARG_WITH([libgdiplus],
4964         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4965         [], [with_libgdiplus=installed])
4967 # default install location
4968 libgdiplus_install_loc=libgdiplus${libsuffix}
4969 case "$host" in
4970     *-*-*linux*)
4971     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4972     ;;
4973 esac
4975 case $with_libgdiplus in
4976     no)
4977     libgdiplus_loc=
4978     ;;
4980     installed)
4981     libgdiplus_loc=
4982     if test x$cross_compiling = xno; then
4983         if test x$host_darwin = xyes; then
4984             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4985             if test -x $a; then
4986               libgdiplus_install_loc=$a
4987               libgdiplus_loc=$a
4988             fi
4989         fi
4990     fi
4991     ;;
4993     yes|sibling)
4994     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4995     ;;
4997     /*) # absolute path, assume it is an install location
4998     libgdiplus_loc=$with_libgdiplus
4999     libgdiplus_install_loc=$with_libgdiplus
5000     ;;
5002     *)
5003     libgdiplus_loc=`pwd`/$with_libgdiplus
5004     ;;
5005 esac
5006 AC_SUBST(libgdiplus_loc)
5007 AC_SUBST(libgdiplus_install_loc)
5009 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)
5010 if test "x$icall_symbol_map" = "xyes"; then
5011    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5014 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5015 if test "x$icall_export" = "xyes"; then
5016    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5019 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5020 if test "x$icall_tables" = "xno"; then
5021    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5024 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5026 if test "x$with_tls" = "x__thread"; then
5027         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5028         # Pass the information to libgc
5029         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5030         AC_MSG_CHECKING(if the tls_model attribute is supported)
5031         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5032                 ], [
5033                         AC_MSG_RESULT(yes)
5034                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5035                 ], [
5036                         AC_MSG_RESULT(no)
5037         ])
5040 if test ${TARGET} = ARM; then
5041         dnl ******************************************
5042         dnl *** Check to see what FPU is available ***
5043         dnl ******************************************
5044         AC_MSG_CHECKING(which FPU to use)
5046         #
5047         # This is a bit tricky:
5048         #
5049         # if (__ARM_PCS_VFP) {
5050         #       /* mfloat-abi=hard == VFP with hard ABI */
5051         # } elif (!__SOFTFP__) {
5052         #       /* mfloat-abi=softfp == VFP with soft ABI */
5053         # } else {
5054         #       /* mfloat-abi=soft == no VFP */
5055         # }
5056         #
5057         # The exception is iOS (w/ GCC) where none of the above
5058         # are defined (but iOS always uses the 'softfp' ABI).
5059         #
5060         # No support for FPA.
5061         #
5063         fpu=NONE
5065         # iOS GCC always uses the 'softfp' ABI.
5066         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5067                 fpu=VFP
5068         fi
5070         # Are we using the 'hard' ABI?
5071         if test x$fpu = xNONE; then
5072                 AC_TRY_COMPILE([], [
5073                         #ifndef __ARM_PCS_VFP
5074                         #error "Float ABI is not 'hard'"
5075                         #endif
5076                 ], [
5077                         fpu=VFP_HARD
5078                 ], [
5079                         fpu=NONE
5080                 ])
5081         fi
5083         # No 'hard' ABI. 'soft' or 'softfp'?
5084         if test x$fpu = xNONE; then
5085                 AC_TRY_COMPILE([], [
5086                         #ifdef __SOFTFP__
5087                         #error "Float ABI is not 'softfp'"
5088                         #endif
5089                 ], [
5090                         fpu=VFP
5091                 ], [
5092                         fpu=NONE
5093                 ])
5094         fi
5096         if test x$arm_fpu != x; then
5097            fpu=$arm_fpu
5098         fi
5100         AC_MSG_RESULT($fpu)
5101         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5102         unset fpu
5104         dnl *********************************************
5105         dnl *** Check which ARM version(s) we can use ***
5106         dnl *********************************************
5107         AC_MSG_CHECKING(which ARM version to use)
5109         AC_TRY_COMPILE([], [
5110                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5111                 #error Not on ARM v5.
5112                 #endif
5113         ], [
5114                 arm_v5=yes
5116                 arm_ver=ARMv5
5117         ], [])
5119         AC_TRY_COMPILE([], [
5120                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5121                 #error Not on ARM v6.
5122                 #endif
5123         ], [
5124                 arm_v5=yes
5125                 arm_v6=yes
5127                 arm_ver=ARMv6
5128         ], [])
5130         AC_TRY_COMPILE([], [
5131                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5132                 #error Not on ARM v7.
5133                 #endif
5134         ], [
5135                 arm_v5=yes
5136                 arm_v6=yes
5137                 arm_v7=yes
5139                 arm_ver=ARMv7
5140         ], [])
5142         AC_MSG_RESULT($arm_ver)
5144         if test x$arm_v5 = xyes; then
5145                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5146                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5147         fi
5149         if test x$arm_v6 = xyes; then
5150                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5151                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5152         fi
5154         if test x$arm_v7 = xyes; then
5155                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5156                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5157         fi
5160 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5161         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5163         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5165         if test x$fpabi = xauto; then
5166                 AC_TRY_COMPILE([], [
5167                         #ifdef __riscv_float_abi_double
5168                         #error "double"
5169                         #endif
5170                 ], [
5171                         fpabi=auto
5172                 ], [
5173                         fpabi=double
5174                 ])
5175         fi
5177         if test x$fpabi = xauto; then
5178                 AC_TRY_COMPILE([], [
5179                         #ifdef __riscv_float_abi_single
5180                         #error "single"
5181                         #endif
5182                 ], [
5183                         fpabi=auto
5184                 ], [
5185                         fpabi=single
5186                 ])
5187         fi
5189         if test x$fpabi = xauto; then
5190                 AC_TRY_COMPILE([], [
5191                         #ifdef __riscv_float_abi_soft
5192                         #error "soft"
5193                         #endif
5194                 ], [
5195                         fpabi=auto
5196                 ], [
5197                         fpabi=soft
5198                 ])
5199         fi
5201         case $fpabi in
5202         double)
5203                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5204                 AC_MSG_RESULT([double-precision])
5205                 ;;
5206         single)
5207                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5208                 AC_MSG_ERROR([single-precision, not supported])
5209                 ;;
5210         soft)
5211                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5212                 AC_MSG_RESULT([soft float])
5213                 ;;
5214         auto)
5215                 AC_MSG_ERROR([unknown])
5216                 ;;
5217         *)
5218                 AC_MSG_ERROR([invalid option: $fpabi])
5219                 ;;
5220         esac
5223 if test ${TARGET} = unknown; then
5224         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5225         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5228 if test "x$platform_android" = "xyes"; then
5229         case "x${TARGET}" in
5230         xARM)
5231                 case "x$arm_ver" in
5232                 xARMv5)
5233                         BTLS_SUPPORTED=yes
5234                         BTLS_PLATFORM=android-armv5
5235                         ;;
5236                 xARMv6)
5237                         BTLS_SUPPORTED=yes
5238                         BTLS_PLATFORM=android-armv6
5239                         ;;
5240                 xARMv7)
5241                         BTLS_SUPPORTED=yes
5242                         BTLS_PLATFORM=android-armv7
5243                         ;;
5244                 *)
5245                         BTLS_SUPPORTED=no
5246                         ;;
5247                 esac
5248                 ;;
5249         xARM64)
5250                 BTLS_SUPPORTED=yes
5251                 BTLS_PLATFORM=android-v8a
5252                 ;;
5253         xX86)
5254                 BTLS_SUPPORTED=yes
5255                 BTLS_PLATFORM=android-x86
5256                 ;;
5257         xAMD64)
5258                 BTLS_SUPPORTED=yes
5259                 BTLS_PLATFORM=android-x64
5260                 ;;
5261         *)
5262                 BTLS_SUPPORTED=no
5263                 ;;
5264         esac
5267 if test ${ACCESS_UNALIGNED} = no; then
5268         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5271 if test x$host_darwin = xyes; then
5272         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5273         AS_IF(
5274                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5275                 [AC_MSG_RESULT([no])],
5276                 [
5277                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5278                         AR_FLAGS="Scru"
5279                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5280                         AC_MSG_RESULT([yes])
5281                 ]
5282         )
5285 case "x$libgc" in
5286         xincluded)
5287                 # Pass CPPFLAGS to libgc configure
5288                 # We should use a separate variable for this to avoid passing useless and
5289                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5290                 # This should be executed late so we pick up the final version of CPPFLAGS
5291                 # The problem with this approach, is that during a reconfigure, the main
5292                 # configure scripts gets invoked with these arguments, so we use separate
5293                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5294                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5295                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5296                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5297                 fi
5298                 # Don't pass -finstrument-for-thread-suspension in, 
5299                 # if these are instrumented it will be very bad news 
5300                 # (infinite recursion, undefined parking behavior, etc)
5301                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5302                 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\""
5303                 if test "x$support_boehm" = "xyes"; then
5304                         AC_CONFIG_SUBDIRS(libgc)
5305                 fi
5306                 ;;
5307 esac
5309 MALLOC_MEMPOOLS=no
5310 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5311         if test x$with_malloc_mempools = xyes; then
5312                 MALLOC_MEMPOOLS=yes
5313                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5314         fi
5318 DISABLE_MCS_DOCS=default
5319 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5320         if test x$with_mcs_docs != xyes; then
5321                 DISABLE_MCS_DOCS=yes
5322         fi
5324 if test -n "$INSTALL_4_x_TRUE"; then :
5325         DISABLE_MCS_DOCS=yes
5327 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5328    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5331 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)],[
5332         if test x$with_lazy_gc_thread_creation != xno ; then
5333                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5334         fi
5335 ], [with_lazy_gc_thread_creation=no])
5337 dnl *****************************
5338 dnl *** Thread suspend policy ***
5339 dnl *****************************
5341 dnl Set a default hybrid or cooperative suspend on some platforms
5343 dnl Coop default is set by the bitcode preset.
5345 dnl If coop isn't on by default, maybe hybrid should be?
5346 if test x$enable_cooperative_suspend_default != xyes; then
5347         case $HOST in
5348         X86 | AMD64)
5349                 dnl Some host/target confusion, there's no host_osx (and
5350                 dnl host_darwin would be true on iOS not just macOS).
5351                 if test x$target_osx = xyes; then
5352                         enable_hybrid_suspend_default=yes
5353                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5354                         enable_hybrid_suspend_default=yes
5355                 fi
5356                 ;;
5357         esac
5360 dnl Now check if there were flags overriding the defaults
5362 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])
5363 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5365 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5366         enable_cooperative_suspend=$with_cooperative_gc
5369 if test x$enable_cooperative_suspend = xdefault; then
5370         enable_cooperative_suspend=$enable_cooperative_suspend_default
5373 if test x$enable_cooperative_suspend != xno; then
5374         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5377 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5379 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])
5381 if test x$enable_hybrid_suspend = xdefault; then
5382    enable_hybrid_suspend=$enable_hybrid_suspend_default
5385 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5386         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5389 if test x$enable_hybrid_suspend != xno ; then
5390         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5393 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5395 dnl End of thread suspend policy
5397 dnl ***************************
5398 dnl *** feature experiments ***
5399 dnl ***************************
5401 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5402 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5404         if test x$enable_experiment != x ; then
5405                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5406         fi
5407         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5408                 eval "mono_experiment_test_enable_$feature='yes'"
5409         done
5411         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5412                 eval "mono_experiment_test_enable_null='yes'"
5413                 true
5414         fi
5416         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5417                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5418         fi
5419 ],[])
5421 dnl **********************
5422 dnl *** checked builds ***
5423 dnl **********************
5425 AC_ARG_ENABLE(checked_build, [  --enable-checked-build=LIST      To enable checked build (expensive asserts), configure with a comma-separated LIST of checked build modules and then include that same list in the environment variable MONO_CHECK_MODE at runtime. Recognized checked build modules: all, gc, metadata, thread, private_types, crash_reporting],[
5427         if test x$enable_checked_build != x ; then
5428                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5429         fi
5430         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5431                 eval "mono_checked_build_test_enable_$feature='yes'"
5432         done
5434         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5435                 eval "mono_checked_build_test_enable_gc='yes'"
5436                 eval "mono_checked_build_test_enable_metadata='yes'"
5437                 eval "mono_checked_build_test_enable_thread='yes'"
5438                 eval "mono_checked_build_test_enable_private_types='yes'"
5439                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5440         fi
5442         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5443                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5444         fi
5446         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5447                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5448         fi
5450         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5451                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5452         fi
5454         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5455                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5456         fi
5458         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5459                 # Required
5460                 with_overridable_allocators=yes
5461                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5463                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5464         fi
5465 ], [])
5467 dnl End of checked builds
5469 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5471 AC_CHECK_HEADER([malloc.h], 
5472                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5473                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5475 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5476 # instead of libmono-static.a
5477 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5478    LIBMONO_LA=libmini-static.la
5479 else
5480    if test x$buildsgen = xyes; then
5481       LIBMONO_LA=libmonosgen-$API_VER.la
5482    else
5483       LIBMONO_LA=libmonoboehm-$API_VER.la
5484    fi
5486 AC_SUBST(LIBMONO_LA)
5488 dnl **************
5489 dnl ***  Btls  ***
5490 dnl **************
5492 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5493 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5494 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5495 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5496 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5497 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])
5499 if test "x$with_btls_android_api" = "x" ; then
5500         case "$BTLS_PLATFORM" in
5501                 android-armv5)
5502                         with_btls_android_api=16" ;;
5503                 android-armv6)
5504                         with_btls_android_api=16" ;;
5505                 android-armv7)
5506                         with_btls_android_api=16 ;;
5507                 android-v8a)
5508                         with_btls_android_api=21 ;;
5509                 android-x86)
5510                         with_btls_android_api=16 ;;
5511                 android-x64)
5512                         with_btls_android_api=21 ;;
5513         esac
5516 if test "x$enable_btls" = "xno"; then
5517    enable_btls_lib=no
5520 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5522 btls_android=no
5523 if test "x$enable_btls" = "xyes"; then
5524         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5525         if test "x$CMAKE" = "xno"; then
5526                 AC_MSG_ERROR("cmake not found")
5527         fi
5529         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5530         AC_SUBST(BTLS_ROOT)
5532         btls_arch=
5533         btls_cflags=
5534         BTLS_CMAKE_ARGS=
5536         if test "x$host_win32" = "xyes"; then
5537                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5538         fi
5540         case "$BTLS_PLATFORM" in
5541         i386)
5542                 btls_arch=i386
5543                 btls_cflags="-m32"
5544                 case $host_os in
5545                         darwin*)
5546                                 btls_cflags="$btls_cflags -arch i386"
5547                                 ;;
5548                         mingw*|cygwin*)
5549                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5550                                 if test "x$HAVE_YASM" != "xyes"; then
5551                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5552                                 fi
5553                                 ;;
5554                 esac
5555                 ;;
5556         x86_64)
5557                 btls_arch=x86_64
5558                 case $host_os in
5559                         mingw*|cygwin*)
5560                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5561                                 if test "x$HAVE_YASM" != "xyes"; then
5562                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5563                                 fi
5564                                 ;;
5565                 esac
5566                 ;;
5567         arm)
5568                 btls_arch=arm
5569                 btls_cflags="-DOPENSSL_NO_ASM=1"
5570                 ;;
5571         armsoft)
5572                 btls_arch=arm
5573                 btls_cflags="-DOPENSSL_NO_ASM=1"
5574                 ;;
5575         aarch64)
5576                 btls_arch=aarch64
5577                 btls_cflags="-march=armv8-a+crypto"
5578                 ;;
5579         s390x)
5580                 btls_arch=s390x
5581                 ;;
5582         powerpc)
5583                 btls_arch=powerpc
5584                 case $host_os in
5585                         aix*|os400*)
5586                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5587                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5588                 esac
5589                 ;;
5590         android-armv5)
5591                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5592                 ;;
5593         android-armv6)
5594                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5595                 ;;
5596         android-armv7)
5597                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5598                 ;;
5599         android-v8a)
5600                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5601                 ;;
5602         android-x86)
5603                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5604                 ;;
5605         android-x64)
5606                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5607                 ;;
5608         riscv32)
5609                 btls_arch=riscv32
5610                 ;;
5611         riscv64)
5612                 btls_arch=riscv64
5613                 ;;
5614         *)
5615                 AC_MSG_ERROR(Invalid BTLS platform)
5616         esac
5618         if test "x$platform_android" = "xyes"; then
5619                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5620                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5621                 fi
5623                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5624                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5625                 fi
5627                 btls_android=yes
5628                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5629                 if test "x$with_btls_android_ndk" != "x"; then
5630                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5631                 else
5632                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5633                 fi
5634         fi
5636         if test "x$btls_arch" != "x"; then
5637                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5638         fi
5640         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5641         AC_SUBST(BTLS_ARCH)
5642         AC_SUBST(BTLS_CFLAGS)
5643         AC_SUBST(BTLS_PLATFORM)
5644         AC_SUBST(BTLS_CMAKE_ARGS)
5646         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5647 else
5648         enable_btls=no
5651 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5653 if test x$DISABLE_MCS_DOCS = xyes; then
5654    docs_dir=""
5655 else
5656    docs_dir=docs
5658 AC_SUBST(docs_dir)
5660 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5661 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5662 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5664 libmono_ldflags="$libmono_ldflags $LIBS"
5666 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5667 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5668 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5669 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5670 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5671 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5672 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5673 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5674 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5675 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5676 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5677 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5678 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5679 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5680 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5681 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5682 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5683 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5684 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5685 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5686 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5687 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5688 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5689 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5691 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5693 AC_SUBST(LIBC)
5694 AC_SUBST(INTL)
5695 AC_SUBST(SQLITE)
5696 AC_SUBST(SQLITE3)
5697 AC_SUBST(X11)
5698 AC_SUBST(GDKX11)
5699 AC_SUBST(GTKX11)
5700 AC_SUBST(XINERAMA)
5701 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5702 AC_SUBST(arch_target)
5704 #This must always be defined when building the runtime
5705 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5707 mono_build_root=`pwd`
5708 AC_SUBST(mono_build_root)
5710 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5711 if test x$host_win32 = xno; then
5712         if test x$enable_msvc = xyes; then
5713                 echo "Error, --enable-msvc only supported for Windows builds."
5714                 exit 1
5715         fi
5717 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5719 if test "x$enable_msvc" = "xyes"; then
5720         if test "x$support_boehm" = "xyes"; then
5721                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5722                 exit 1
5723         fi
5724         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5725         if test "x$host_cpu" = "xi686"; then
5726                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5727                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5728                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5729                 mono_runtime_wrapper=$mono_runtime
5730         else
5731                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5732                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5733                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5734                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
5735         fi
5736         AC_SUBST(mono_msvc_build_dir)
5737         AC_SUBST(mono_msvc_build_lib_dir)
5738         AC_SUBST(mono_msvc_build_bin_dir)
5739 else
5740         mono_runtime=mono/mini/mono
5741         mono_runtime_wrapper=$mono_runtime
5744 AC_SUBST(mono_runtime)
5745 AC_SUBST(mono_runtime_wrapper)
5747 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5749 if test $csc_compiler = mcs; then
5750   CSC=$mcs_topdir/class/lib/build/mcs.exe
5751 else
5752   CSC=$CSC_LOCATION
5755 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5757 mono_cfg_root=$mono_build_root/runtime
5758 if test x$host_win32 = xyes; then
5759   if test "x$cross_compiling" = "xno"; then
5760     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5761     CSC=`cygpath -m -a $CSC`
5762     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5763   else
5764     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5765   fi
5766 else
5767   mono_cfg_dir=$mono_cfg_root/etc
5770 if test "x$platform_android" = "xyes"; then
5771   mono_cfg_dir=
5774 AC_SUBST(mono_cfg_dir)
5776 AC_SUBST(CSC)
5778 AC_CONFIG_FILES([po/mcs/Makefile.in])
5780 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5781 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5782 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5784 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5785 [   depth=../../../..
5786     case $srcdir in
5787     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5788     .) reldir=$depth ;;
5789     *) reldir=$depth/$srcdir ;;
5790     esac
5791     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5792     cd runtime/etc/mono/1.0
5793     rm -f machine.config
5794     $LN_S $reldir/data/net_1_1/machine.config machine.config
5795     cd $depth
5796 ],[LN_S='$LN_S'])
5798 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5799 [   depth=../../../..
5800     case $srcdir in
5801     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5802     .) reldir=$depth ;;
5803     *) reldir=$depth/$srcdir ;;
5804     esac
5805     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5806     cd runtime/etc/mono/2.0
5807     rm -f machine.config
5808     $LN_S $reldir/data/net_2_0/machine.config machine.config
5809     cd $depth
5810 ],[LN_S='$LN_S'])
5812 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5813 [   depth=../../../..
5814     case $srcdir in
5815     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5816     .) reldir=$depth ;;
5817     *) reldir=$depth/$srcdir ;;
5818     esac
5819     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5820     cd runtime/etc/mono/2.0
5821     rm -f web.config
5822     $LN_S $reldir/data/net_2_0/web.config web.config
5823     cd $depth
5824 ],[LN_S='$LN_S'])
5826 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5827 [   depth=../../..
5828     case $srcdir in
5829     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5830     .) reldir=$depth ;;
5831     *) reldir=$depth/$srcdir ;;
5832     esac
5833     $ac_aux_dir/install-sh -d runtime/etc/mono/
5834     cd runtime/etc/mono/
5835     rm -f browscap.ini
5836     $LN_S $reldir/data/browscap.ini browscap.ini
5837     cd $depth
5838 ],[LN_S='$LN_S'])
5840 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5841 [   depth=../../../../..
5842     case $srcdir in
5843     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5844     .) reldir=$depth ;;
5845     *) reldir=$depth/$srcdir ;;
5846     esac
5847     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5848     cd runtime/etc/mono/2.0/Browsers
5849     rm -f Compat.browser
5850     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5851     cd $depth
5852 ],[LN_S='$LN_S'])
5854 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5855 [   depth=../../../../..
5856     case $srcdir in
5857     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5858     .) reldir=$depth ;;
5859     *) reldir=$depth/$srcdir ;;
5860     esac
5861     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5862     cd runtime/etc/mono/4.0/Browsers
5863     rm -f Compat.browser
5864     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5865     cd $depth
5866 ],[LN_S='$LN_S'])
5868 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5869 [   depth=../../../../..
5870     case $srcdir in
5871     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5872     .) reldir=$depth ;;
5873     *) reldir=$depth/$srcdir ;;
5874     esac
5875     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5876     cd runtime/etc/mono/4.5/Browsers
5877     rm -f Compat.browser
5878     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5879     cd $depth
5880 ],[LN_S='$LN_S'])
5882 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5883 [   depth=../../../..
5884     case $srcdir in
5885     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5886     .) reldir=$depth ;;
5887     *) reldir=$depth/$srcdir ;;
5888     esac
5889     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5890     cd runtime/etc/mono/4.0
5891     rm -f machine.config
5892     $LN_S $reldir/data/net_4_0/machine.config machine.config
5893     cd $depth
5894 ],[LN_S='$LN_S'])
5896 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5897 [   depth=../../../..
5898     case $srcdir in
5899     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5900     .) reldir=$depth ;;
5901     *) reldir=$depth/$srcdir ;;
5902     esac
5903     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5904     cd runtime/etc/mono/4.0
5905     rm -f web.config
5906     $LN_S $reldir/data/net_4_0/web.config web.config
5907     cd $depth
5908 ],[LN_S='$LN_S'])
5910 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5911 [   depth=../../../..
5912     case $srcdir in
5913     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5914     .) reldir=$depth ;;
5915     *) reldir=$depth/$srcdir ;;
5916     esac
5917     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5918     cd runtime/etc/mono/4.5
5919     rm -f machine.config
5920     $LN_S $reldir/data/net_4_5/machine.config machine.config
5921     cd $depth
5922 ],[LN_S='$LN_S'])
5924 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5925 [   depth=../../../..
5926     case $srcdir in
5927     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5928     .) reldir=$depth ;;
5929     *) reldir=$depth/$srcdir ;;
5930     esac
5931     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5932     cd runtime/etc/mono/4.5
5933     rm -f web.config
5934     $LN_S $reldir/data/net_4_5/web.config web.config
5935     cd $depth
5936 ],[LN_S='$LN_S'])
5938 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])
5939 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])
5940 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5943 # Mono.Native Support
5944 # -------------------
5945 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5946 # It is built as a stand-alone shared library and not bundled with the runtime because we
5947 # may need to build two different versions of it.
5949 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5950 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5952 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5953 # implementation accordingly.  We build a single `libmono-native` shared library.
5955 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5957 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
5958 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5959 # depending on platform.
5961 # We build two versions of the shared library:
5962 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
5963 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5965 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5966 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5967 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
5969 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5970 # to verify that it's the correct version of it.
5973 AC_MSG_CHECKING([Mono.Native support])
5974 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5975 if test x$disable_mono_native = xyes; then
5976         mono_native=no
5977 elif test x$target_osx = xyes; then
5978         MONO_NATIVE_CC=$CC
5979         MONO_NATIVE_CXX=$CXX
5980         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
5981         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5982         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5983         MONO_NATIVE_CFLAGS=$CFLAGS
5984         MONO_NATIVE_LDFLAGS=$LDFLAGS
5986         mono_native=yes
5987         MONO_NATIVE_PLATFORM=macos
5988         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5990         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5991                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5993         if test x$mono_native_compat = xyes; then
5994                 mono_native_compat=yes
5995                 mono_native_text="Mac OSX (compat + unified v10.12)"
5996                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
5997                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
5998                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
5999                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6000                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6002                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6003                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6004                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6005                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6006                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6007                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6008         else
6009                 mono_native_compat=no
6010                 mono_native_text="Mac OSX"
6011         fi
6012 elif test x$mono_native_platform_ios = xyes; then
6013         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6015         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6016                 if test x$mono_native_ios_sim = xyes; then
6017                         mono_native_ios_target=ios-simulator
6018                         mono_native_text="iOS Simulator"
6019                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6020                 else
6021                         mono_native_ios_target=iphoneos
6022                         mono_native_text="iOS Device"
6023                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6024                 fi
6025                 mono_native_unified_version="10.0"
6026                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6027         ], [
6028                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6029                         if test x$mono_native_ios_sim = xyes; then
6030                                 mono_native_ios_target=tvos-simulator
6031                                 mono_native_text="AppleTV Simulator"
6032                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6033                         else
6034                                 mono_native_ios_target=tvos
6035                                 mono_native_text="AppleTV Device"
6036                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6037                         fi
6038                         mono_native_unified_version="10.0"
6039                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6040                 ], [
6041                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6042                                 if test x$mono_native_ios_sim = xyes; then
6043                                         mono_native_ios_target=watchos-simulator
6044                                         mono_native_text="Apple Watch Simulator"
6045                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6046                                 else
6047                                         mono_native_ios_target=watchos
6048                                         mono_native_text="Apple Watch Device"
6049                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6050                                 fi
6051                                 mono_native_unified_version="5.0"
6052                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6053                         ], [
6054                                 AC_MSG_ERROR([Unknown iOS Target])
6055                         ])
6056                 ])
6057         ])
6059         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6061         if test x$with_bitcode = xyes; then
6062                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6063                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6064         else
6065                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6066         fi
6068         if test x$enable_gss = xyes; then
6069                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6070         fi
6072         MONO_NATIVE_CC=$CC
6073         MONO_NATIVE_CXX=$CXX
6074         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6075         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6076         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6077         MONO_NATIVE_CFLAGS=$CFLAGS
6078         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6080         if test x$mono_native_compat = xyes; then
6081                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6082                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6083                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6084                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6085                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6086                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6088                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6089                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6090                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6091                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6092                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6093                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6094         fi
6096         mono_native=yes
6097         MONO_NATIVE_PLATFORM=ios
6098 elif test x$host_linux = xyes; then
6099         mono_native_text="Linux"
6100         MONO_NATIVE_CC=$CC
6101         MONO_NATIVE_CXX=$CXX
6102         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6103         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6104         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6105         MONO_NATIVE_CFLAGS=$CFLAGS
6106         MONO_NATIVE_LDFLAGS=$LDFLAGS
6108         mono_native=yes
6109         mono_native_compat=no
6110         MONO_NATIVE_PLATFORM=linux
6112         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6113 elif test x$target_wasm = xyes; then
6114         mono_native_text="wasm"
6115         MONO_NATIVE_CC=$CC
6116         MONO_NATIVE_CXX=$CXX
6117         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6118         # The system.native code uses _WASM_ to check for wasm
6119         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6120         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6121         MONO_NATIVE_CFLAGS=$CFLAGS
6122         MONO_NATIVE_LDFLAGS=$LDFLAGS
6124         mono_native=yes
6125         mono_native_compat=no
6126         MONO_NATIVE_PLATFORM=linux
6128         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6129 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6130         mono_native_text="AIX"
6131         MONO_NATIVE_CC=$CC
6132         MONO_NATIVE_CXX=$CXX
6133         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6134         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6135         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6136         MONO_NATIVE_CFLAGS=$CFLAGS
6137         MONO_NATIVE_LDFLAGS=$LDFLAGS
6139         mono_native=yes
6140         mono_native_compat=no
6141         MONO_NATIVE_PLATFORM=aix
6143         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6144 elif test x$platform_android = xyes; then
6145         mono_native_text="Android"
6146         MONO_NATIVE_CC=$CC
6147         MONO_NATIVE_CXX=$CXX
6148         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6149         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6150         MONO_NATIVE_CFLAGS=$CFLAGS
6151         MONO_NATIVE_LDFLAGS=$LDFLAGS
6152         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6154         mono_native=yes
6155         mono_native_compat=no
6156         MONO_NATIVE_PLATFORM=android
6158         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6159 else
6160         mono_native=no
6161         mono_native_text="no"
6164 AC_MSG_RESULT($mono_native_text)
6166 if test x$mono_native_compat = xyes; then
6167         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6168 else
6169         MONO_NATIVE_LIBRARY_NAME=libmono-native
6172 AC_SUBST(MONO_NATIVE_PLATFORM)
6173 AC_SUBST(MONO_NATIVE_CC)
6174 AC_SUBST(MONO_NATIVE_CXX)
6175 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6176 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6177 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6178 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6179 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6180 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6181 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6182 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6183 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6184 AC_SUBST(MONO_NATIVE_CFLAGS)
6185 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6186 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6187 AC_SUBST(MONO_NATIVE_LDFLAGS)
6188 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6189 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6190 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6191 AC_SUBST(MONO_NATIVE_LIBADD)
6193 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6194 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6195 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6196 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6197 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6198 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6199 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6201 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6202 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6203 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6204 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6205 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6207 ### C++ Linker selection
6209 # We have to lie to autotools, sometimes.
6211 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6212 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6213 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6214 # except if we're linking with LLVM which relies on it.
6216 # Explanation of the hack:
6218 # According to
6219 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6220 # automake chooses the linker that it used to compile a target based on the
6221 # _SOURCES for that target.  If the target is comprised of only C code, it
6222 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6223 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6224 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6226 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6227 # or libc++) linked in - even when Mono is written in C++, we take care not to
6228 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6229 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6230 # C++ linker - LLVM doesn't have the same restrictions.
6232 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6233 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6234 #  automake's autodetection and lets us use the linker that we want.
6236 if test "x$enable_llvm_runtime" = "xyes"; then
6237         AC_SUBST(MONO_CXXLD, [$CXX])
6238 else
6239         AC_SUBST(MONO_CXXLD, [$CC])
6242 ### Set -Werror options
6244 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6246 if test x"$GCC" = xyes; then
6248         if test "x$with_jemalloc" != "xyes"; then
6250                 # incompatible-pointer-types requires gcc circa 5.x
6252                 ORIG_CFLAGS=$CFLAGS
6253                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6254                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6255                 AC_TRY_COMPILE([],[
6256                 ], [
6257                         AC_MSG_RESULT(yes)
6258                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6259                 ], [
6260                         AC_MSG_RESULT(no)
6261                         CFLAGS=$ORIG_CFLAGS
6262                 ])
6264                 CFLAGS="$CFLAGS -Werror=return-type"
6265         fi
6267         # Implicit function declarations are not 64 bit safe
6268         # Do this late, since this causes lots of configure tests to fail
6269         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6270         # jay has a lot of implicit declarations
6271         JAY_CFLAGS="-Wno-implicit-function-declaration"
6274 AC_SUBST(CFLAGS)
6275 AC_SUBST(CPPFLAGS)
6276 AC_SUBST(LDFLAGS)
6278 # Update all submodules recursively to ensure everything is checked out
6279 (cd $srcdir && scripts/update_submodules.sh)
6281 AC_OUTPUT([
6282 Makefile
6283 mono-uninstalled.pc
6284 acceptance-tests/Makefile
6285 llvm/Makefile
6286 scripts/mono-find-provides
6287 scripts/mono-find-requires
6288 mk/Makefile
6289 mono/Makefile
6290 mono/btls/Makefile
6291 mono/native/Makefile
6292 mono/utils/Makefile
6293 mono/utils/jemalloc/Makefile
6294 mono/metadata/Makefile
6295 mono/dis/Makefile
6296 mono/cil/Makefile
6297 mono/arch/Makefile
6298 mono/arch/x86/Makefile
6299 mono/arch/amd64/Makefile
6300 mono/arch/ppc/Makefile
6301 mono/arch/sparc/Makefile
6302 mono/arch/s390x/Makefile
6303 mono/arch/arm/Makefile
6304 mono/arch/arm64/Makefile
6305 mono/arch/mips/Makefile
6306 mono/arch/riscv/Makefile
6307 mono/sgen/Makefile
6308 mono/native/platform-type.c
6309 mono/native/platform-type-compat.c
6310 mono/native/platform-type-unified.c
6311 mono/tests/Makefile
6312 mono/tests/assembly-load-reference/Makefile
6313 mono/tests/tests-config
6314 mono/tests/gc-descriptors/Makefile
6315 mono/tests/testing_gac/Makefile
6316 mono/tests/llvmonly-mixed/Makefile
6317 mono/unit-tests/Makefile
6318 mono/benchmark/Makefile
6319 mono/mini/Makefile
6320 mono/profiler/Makefile
6321 mono/eglib/Makefile
6322 mono/eglib/eglib-config.h
6323 mono/eglib/test/Makefile
6324 m4/Makefile
6325 ikvm-native/Makefile
6326 scripts/Makefile
6327 man/Makefile
6328 docs/Makefile
6329 data/Makefile
6330 data/net_2_0/Makefile
6331 data/net_4_0/Makefile
6332 data/net_4_5/Makefile
6333 data/net_2_0/Browsers/Makefile
6334 data/net_4_0/Browsers/Makefile
6335 data/net_4_5/Browsers/Makefile
6336 data/mint.pc
6337 data/mono-2.pc
6338 data/monosgen-2.pc
6339 data/mono.pc
6340 data/mono-cairo.pc
6341 data/mono-options.pc
6342 data/mono-lineeditor.pc
6343 data/monodoc.pc
6344 data/dotnet.pc
6345 data/dotnet35.pc
6346 data/wcf.pc
6347 data/cecil.pc
6348 data/system.web.extensions_1.0.pc
6349 data/system.web.extensions.design_1.0.pc
6350 data/system.web.mvc.pc
6351 data/system.web.mvc2.pc
6352 data/system.web.mvc3.pc
6353 data/aspnetwebstack.pc
6354 data/reactive.pc
6355 samples/Makefile
6356 support/Makefile
6357 data/config
6358 tools/Makefile
6359 tools/locale-builder/Makefile
6360 tools/sgen/Makefile
6361 tools/pedump/Makefile
6362 runtime/Makefile
6363 msvc/Makefile
6364 po/Makefile
6367 if test x$host_win32 = xyes; then
6368    # Get rid of 'cyg' prefixes in library names
6369    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6370    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6371    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6372    # executable doesn't work...
6373    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6376 if test x$host_darwin = xyes; then
6377    # This doesn't seem to be required and it slows down parallel builds
6378    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6382   case $prefix in
6383   NONE) prefix=$ac_default_prefix ;;
6384   esac
6385   case $exec_prefix in
6386   NONE) exec_prefix='${prefix}' ;;
6387   esac
6389   #
6390   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6391   # any existing config.make.  This allows people to share the same source tree
6392   # with different build directories, one native and one cross
6393   #
6394   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6396     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6398     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6399     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6400     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6401     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6402     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6403     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6404     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6405     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6406     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6408     case $INSTALL in
6409     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6410     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6411     esac
6413     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6415     export VERSION
6416     [myver=$($AWK 'BEGIN {
6417       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6418       if(length(vsplit [1]) > 4) {
6419         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6420       }
6421       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6422     }')]
6424     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6425     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6427     if test x$host_darwin = xyes; then
6428       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6429       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6430       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6431     elif test x$host_win32 = xyes; then
6432       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6433       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6434       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6435     elif test x$host_linux = xyes; then
6436       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6437       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6438       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6439     else
6440       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6441       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6442       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6443     fi
6445     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6446       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6447     fi
6449         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6450            enable_system_aot=yes
6451         fi
6453     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6454       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6455     fi
6457     if test x$DISABLE_MCS_DOCS = xyes; then
6458       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6459     fi
6461     if test x$has_extension_module != xno; then
6462         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6463     fi
6464     
6465     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6466     
6467     if test "x$test_bcl_opt" = "xyes"; then    
6468       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6469     fi
6471     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6472     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6473     echo "VBCS_LOCATION?=" >> $srcdir/$mcsdir/build/config.make
6475     if test $csc_compiler = mcs; then
6476       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6477     fi
6479     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6480       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6481       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6482       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6483     fi
6485     if test "x$AOT_MODE" != "x" ; then
6486       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6487     fi
6489     if test "x$enable_btls" = "xyes"; then
6490       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6491     fi
6493     if test "x$mono_native" = "xyes"; then
6494       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6495     else
6496       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6497     fi
6499     if test x$mono_native_compat = xyes; then
6500       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6501     else
6502       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6503     fi
6505     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6506     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6507     if test x$enable_compiler_server = xyes; then
6508       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6509     else
6510       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6511     fi
6512     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6514   fi
6518 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6520 btls_platform_string=
6521 if test x$enable_btls = xyes; then
6522         if test x$btls_android = xyes; then
6523                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6524         else
6525                 btls_platform_string=" ($BTLS_PLATFORM)"
6526         fi
6529 thread_suspend_msg=
6530 if test x$buildsgen = xyes; then
6531         if test x$enable_cooperative_suspend != xno; then
6532                 thread_suspend_msg="Suspend:       Cooperative"
6533         elif test x$enable_hybrid_suspend != xno; then
6534                 thread_suspend_msg="Suspend:       Hybrid"
6535         else
6536                 thread_suspend_msg="Suspend:       Preemptive"
6537         fi
6539         
6540 echo "
6541         mcs source:    $mcsdir
6542         C# Compiler:   $csc_compiler
6544    Engine:
6545         Host:          $host
6546         Target:        $target
6547         GC:            $gc_msg 
6548         $thread_suspend_msg
6549         TLS:           $with_tls
6550         SIGALTSTACK:   $with_sigaltstack
6551         Engine:        $jit_status
6552         BigArrays:     $enable_big_arrays
6553         DTrace:        $enable_dtrace
6554         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6555         Spectre:       $spectre_mitigation_status
6556         Mono.Native:   $mono_native_text
6558    Libraries:
6559         .NET 4.x:        $with_profile4_x
6560         Xamarin.Android: $with_monodroid
6561         Xamarin.iOS:     $with_monotouch
6562         Xamarin.WatchOS: $with_monotouch_watch
6563         Xamarin.TVOS:    $with_monotouch_tv
6564         Xamarin.Mac:     $with_xammac
6565         Windows AOT:     $with_winaot
6566         Orbis:           $with_orbis
6567         Unreal:          $with_unreal
6568         WebAssembly:     $with_wasm
6569         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6570         JNI support:     $jdk_headers_found
6571         libgdiplus:      $libgdiplus_msg
6572         zlib:            $zlib_msg
6573         BTLS:            $enable_btls$btls_platform_string
6574         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6575         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6576         .NET Core:       $with_core
6577         $disabled
6579 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6580    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)