[interp] Add support for break on method entry (#12651)
[mono-project.git] / configure.ac
blob38b8cc03ed324860c66f6e2a3d77ba915d64605a
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.23.0],
5         [https://github.com/mono/mono/issues/new])
7 AC_CONFIG_SRCDIR([README.md])
8 AC_CONFIG_MACRO_DIR([m4])
9 AC_CANONICAL_SYSTEM
10 AC_CANONICAL_HOST
12 # Gross hack to enable 'make dist' on automake 1.9+tar 1.14.
13 # The extra brackets are to foil regex-based scans.
14 m4_ifdef([_A][M_PROG_TAR],[_A][M_SET_OPTION([tar-ustar])])
16 AM_INIT_AUTOMAKE([1.9 dist-bzip2 tar-ustar no-dist-gzip foreign subdir-objects]
17                  m4_esyscmd([case `automake --version | head -n 1` in    # parallel-tests is default in automake 1.13+, we need to explicitly enable it
18                              *1.11*|*1.12*) echo parallel-tests;;        # for 1.11 and 1.12 but not below as those versions don't recognize the flag
19                              esac]))                                     # TODO: remove this hack once we require automake 1.11+
21 AC_CONFIG_HEADERS([config.h])
22 AM_MAINTAINER_MODE
23 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test]))
24 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test-bundle]))
26 API_VER=2.0
27 AC_SUBST(API_VER)
29 AC_PROG_LN_S
31 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
33 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
34 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
35 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
38 # This is the version of the corlib-runtime interface. When
39 # making changes to this interface (by changing the layout
40 # of classes the runtime knows about, changing icall signature or
41 # semantics etc), change this variable.
43 # This must be unique relative to corlib interface/semantics.
45 # Generate it with uuidgen. For example:
46 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
48 # There is no ordering of corlib versions, no old or new,
49 # the runtime expects an exact match.
51 MONO_CORLIB_VERSION=07423dee-1eb8-11e9-a2ee-43262508f9cf
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,bitcode,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 elif test x$with_runtime_preset = xnet_4_x; then
1199    with_profile4_x_default=yes
1200    TEST_PROFILE=net_4_x
1201 elif test x$with_runtime_preset = xall; then
1202    with_profile4_x_default=yes
1203    with_monodroid_default=yes
1204    with_monotouch_default=yes
1205    with_monotouch_watch_default=yes
1206    with_monotouch_tv_default=yes
1207    with_xammac_default=yes
1208    with_winaot_default=yes
1209    with_orbis_default=yes
1210    with_unreal_default=yes
1211    with_wasm_default=yes
1212    with_testing_aot_full_interp_default=yes
1213    with_testing_aot_hybrid_default=yes
1214    with_testing_aot_full_default=yes
1215    TEST_PROFILE=net_4_x
1216 elif test x$with_runtime_preset = xbitcode; then
1217    DISABLE_MCS_DOCS_default=yes
1218    with_testing_aot_full_default=yes
1219    with_bitcode_default=yes
1220    enable_cooperative_suspend_default=yes
1221    TEST_PROFILE=testing_aot_full
1222    enable_llvm_default=yes
1224    mono_feature_disable_com='yes'
1225    mono_feature_disable_remoting='yes'
1226    mono_feature_disable_reflection_emit_save='yes'
1227    mono_feature_disable_reflection_emit='yes'
1228    mono_feature_disable_appdomains='yes'
1230    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1231    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1232    AOT_MODE="llvmonly"
1233 elif test x$with_runtime_preset = xfullaot; then
1234    DISABLE_MCS_DOCS_default=yes
1235    with_testing_aot_full_default=yes
1236    TEST_PROFILE=testing_aot_full
1238    mono_feature_disable_com='yes'
1239    mono_feature_disable_remoting='yes'
1240    mono_feature_disable_reflection_emit_save='yes'
1241    mono_feature_disable_reflection_emit='yes'
1242    mono_feature_disable_appdomains='yes'
1244    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1245    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1246    AOT_MODE="full"
1247 elif test x$with_runtime_preset = xfullaot_llvm; then
1248    DISABLE_MCS_DOCS_default=yes
1249    with_testing_aot_full_default=yes
1250    TEST_PROFILE=testing_aot_full
1252    mono_feature_disable_com='yes'
1253    mono_feature_disable_remoting='yes'
1254    mono_feature_disable_reflection_emit_save='yes'
1255    mono_feature_disable_reflection_emit='yes'
1256    mono_feature_disable_appdomains='yes'
1258    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1259    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1260    AOT_MODE="full"
1261 elif test x$with_runtime_preset = xhybridaot; then
1262    DISABLE_MCS_DOCS_default=yes
1263    with_testing_aot_hybrid_default=yes
1264    TEST_PROFILE=testing_aot_hybrid 
1266    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1267    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1268 elif test x$with_runtime_preset = xhybridaot_llvm; then
1269    DISABLE_MCS_DOCS_default=yes
1270    with_testing_aot_hybrid_default=yes
1271    TEST_PROFILE=testing_aot_hybrid
1273    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1274    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1275 elif test x$with_runtime_preset = xfullaotinterp; then
1276    with_testing_aot_full_interp_default=yes
1277    TEST_PROFILE=testing_aot_full_interp
1279    # mscorlib.dll aot compilation crashes
1280    mono_feature_disable_com='yes'
1282    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1283    AOT_RUN_FLAGS="--full-aot-interp"
1284 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1285    with_testing_aot_full_interp_default=yes
1286    TEST_PROFILE=testing_aot_full_interp_llvm
1288    # mscorlib.dll aot compilation crashes
1289    mono_feature_disable_com='yes'
1291    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1292    AOT_RUN_FLAGS="--full-aot-interp"
1293 elif test x$with_runtime_preset = xaot; then
1294    with_profile4_x_default=yes
1296    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1297    AOT_RUN_FLAGS=""
1299    DISABLE_MCS_DOCS_default=yes
1300 elif test x$with_runtime_preset = xaot_llvm; then
1301    with_profile4_x_default=yes
1303    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1304    AOT_RUN_FLAGS=""
1306    DISABLE_MCS_DOCS_default=yes
1307 elif test x$with_runtime_preset = xwinaot; then
1308    DISABLE_MCS_DOCS_default=yes
1309    with_winaot_default=yes
1310    TEST_PROFILE=winaot
1312    mono_feature_disable_com='yes'
1313    mono_feature_disable_remoting='yes'
1314    mono_feature_disable_reflection_emit_save='yes'
1315    mono_feature_disable_reflection_emit='yes'
1316    mono_feature_disable_appdomains='yes'
1318    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1319    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1320    AOT_MODE="llvmonly"
1321 elif test x$with_runtime_preset = xorbis; then
1322    DISABLE_MCS_DOCS_default=yes
1323    with_orbis_default=yes
1324    TEST_PROFILE=orbis
1326    mono_feature_disable_com='yes'
1327    mono_feature_disable_remoting='yes'
1328    mono_feature_disable_reflection_emit_save='yes'
1329    mono_feature_disable_reflection_emit='yes'
1330    mono_feature_disable_appdomains='yes'
1332    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1333    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1334    AOT_MODE="full"
1335 elif test x$with_runtime_preset = xunreal; then
1336    DISABLE_MCS_DOCS_default=yes
1337    with_unreal_default=yes
1338    TEST_PROFILE=unreal
1340    mono_feature_disable_com='yes'
1341    mono_feature_disable_remoting='yes'
1342    mono_feature_disable_appdomains='no'
1344    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1345    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1346 elif test x$with_runtime_preset = xwasm; then
1347    DISABLE_MCS_DOCS_default=yes
1348    with_wasm_default=yes
1349    TEST_PROFILE=wasm
1351    mono_feature_disable_com='yes'
1352    mono_feature_disable_remoting='yes'
1353    mono_feature_disable_reflection_emit_save='yes'
1354    mono_feature_disable_reflection_emit='yes'
1355    mono_feature_disable_appdomains='yes'
1357    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1358    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1359 else
1360    TEST_PROFILE=net_4_x
1361    with_profile4_x_default=yes
1364 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1365    AC_SUBST(AOT_BUILD_FLAGS)
1366    AC_SUBST(AOT_RUN_FLAGS)
1367    # For llvmonlycheck + fullaotcheck
1368    AC_SUBST(INVARIANT_AOT_OPTIONS)
1371 AC_SUBST(TEST_PROFILE)
1373 if test "x$with_profile4_x" = "xdefault"; then
1374    with_profile4_x=$with_profile4_x_default
1376 if test "x$with_monodroid" = "xdefault"; then
1377    with_monodroid=$with_monodroid_default
1379 if test "x$with_monotouch" = "xdefault"; then
1380    with_monotouch=$with_monotouch_default
1382 if test "x$with_monotouch_watch" = "xdefault"; then
1383    with_monotouch_watch=$with_monotouch_watch_default
1385 if test "x$with_monotouch_tv" = "xdefault"; then
1386    with_monotouch_tv=$with_monotouch_tv_default
1388 if test "x$with_bitcode" = "xdefault"; then
1389    with_bitcode=$with_bitcode_default
1391 if test "x$with_xammac" = "xdefault"; then
1392    with_xammac=$with_xammac_default
1394 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1395    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1397 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1398    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1400 if test "x$with_testing_aot_full" = "xdefault"; then
1401    with_testing_aot_full=$with_testing_aot_full_default
1403 if test "x$with_winaot" = "xdefault"; then
1404    with_winaot=$with_winaot_default
1406 if test "x$with_orbis" = "xdefault"; then
1407    with_orbis=$with_orbis_default
1409 if test "x$with_unreal" = "xdefault"; then
1410    with_unreal=$with_unreal_default
1412 if test "x$with_wasm" = "xdefault"; then
1413    with_wasm=$with_wasm_default
1417 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1418 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1419 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1420 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1421 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1422 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1423 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1424 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1425 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1426 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1427 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1428 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1429 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1430 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1431 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1432 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"])
1433 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1434 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1435 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1436 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1438 default_profile=net_4_x
1439 if test -z "$INSTALL_MONODROID_TRUE"; then :
1440    default_profile=monodroid
1442 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1443    default_profile=monotouch
1445 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1446    default_profile=xammac
1448 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1449    default_profile=testing_aot_full_interp
1451 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1452    default_profile=testing_aot_hybrid
1454 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1455    default_profile=testing_aot_full
1457 if test -z "$INSTALL_WINAOT_TRUE"; then :
1458    default_profile=winaot
1460 if test -z "$INSTALL_ORBIS_TRUE"; then :
1461    default_profile=orbis
1463 if test -z "$INSTALL_UNREAL_TRUE"; then :
1464    default_profile=unreal
1466 if test -z "$INSTALL_WASM_TRUE"; then :
1467    default_profile=wasm
1469 if test -z "$INSTALL_4_x_TRUE"; then :
1470    default_profile=net_4_x
1472 DEFAULT_PROFILE=$default_profile
1473 AC_SUBST(DEFAULT_PROFILE)
1476 # End build profile configuration
1479 if test x$USE_NLS = xprofile_default; then
1481         AC_MSG_CHECKING([NLS used])
1483         # We make the default value for USE_NLS
1484         # "no" on OSX because it isn't available on most
1485         # default OSX installs. The most common configurations will
1486         # all disable it, so this saves us typing.
1487         if test x$host_darwin = xyes; then
1488                 USE_NLS=no;
1489         else
1490                 USE_NLS=yes;
1491         fi
1493         AC_SUBST([USE_NLS])
1494         AC_MSG_RESULT([$USE_NLS])
1497 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1498      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1499      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1500          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1502         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1503                 eval "mono_feature_disable_$feature='yes'"
1504         done
1505         DISABLED_FEATURES=$enable_minimal
1506         disabled="Disabled:      $enable_minimal"
1507 ],[])
1509 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1511 if test "x$mono_feature_disable_aot" = "xyes"; then
1512         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1513         enable_system_aot=no
1514         AC_MSG_NOTICE([Disabled AOT compiler])
1517 if test "x$mono_feature_disable_profiler" = "xyes"; then
1518         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1519         AC_MSG_NOTICE([Disabled support for the profiler])
1521 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1523 if test "x$mono_feature_disable_decimal" = "xyes"; then
1524         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1525         AC_MSG_NOTICE([Disabled support for decimal])
1528 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1529         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1530         AC_MSG_NOTICE([Disabled support for P/Invoke])
1533 if test "x$mono_feature_disable_debug" = "xyes"; then
1534         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1535         AC_MSG_NOTICE([Disabled support for runtime debugging])
1538 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1539         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1540         mono_feature_disable_reflection_emit_save=yes
1541         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1544 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1545         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1546         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1549 if test "x$mono_feature_disable_large_code" = "xyes"; then
1550         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1551         AC_MSG_NOTICE([Disabled support for large assemblies])
1554 if test "x$mono_feature_disable_logging" = "xyes"; then
1555         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1556         AC_MSG_NOTICE([Disabled support for logging])
1559 if test "x$mono_feature_disable_com" = "xyes"; then
1560         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1561         AC_MSG_NOTICE([Disabled COM support])
1564 if test "x$mono_feature_disable_ssa" = "xyes"; then
1565         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1566         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1569 if test "x$mono_feature_disable_generics" = "xyes"; then
1570         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1571         AC_MSG_NOTICE([Disabled Generics Support])
1574 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1575         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1576         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1579 if test "x$mono_feature_disable_portability" = "xyes"; then
1580         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1581         AC_MSG_NOTICE([Disabled IO Portability layer])
1584 if test "x$mono_feature_disable_attach" = "xyes"; then
1585         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1586         AC_MSG_NOTICE([Disabled agent attach])
1589 if test "x$mono_feature_disable_verifier" = "xyes"; then
1590         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1591         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1594 if test "x$mono_feature_disable_jit" = "xyes"; then
1595         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1596         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1599 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1601 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1602         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1603         AC_MSG_NOTICE([Disabled the interpreter])
1606 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1608 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1609         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1612 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1614 if test "x$mono_feature_disable_simd" = "xyes"; then
1615         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1616         AC_MSG_NOTICE([Disabled SIMD support])
1619 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1620         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1621         AC_MSG_NOTICE([Disabled Soft Debugger.])
1624 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1626 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1627         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1628         AC_MSG_NOTICE([Disabled Performance Counters.])
1630 if test "x$mono_feature_disable_normalization" = "xyes"; then
1631         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1632         AC_MSG_NOTICE([Disabled String normalization support.])
1635 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1636 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1637         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1638         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1641 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1642         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1643         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1646 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1647         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1648         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1651 if test "x$mono_feature_disable_remoting" = "xyes"; then
1652         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1653         AC_MSG_NOTICE([Disabled remoting])
1656 if test "x$mono_feature_disable_security" = "xyes"; then
1657         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1658         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1661 if test "x$mono_feature_disable_lldb" = "xyes"; then
1662         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1663         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1666 if test "x$mono_feature_disable_mdb" = "xyes"; then
1667         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1668         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1671 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1672         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1673         AC_MSG_NOTICE([Disabled assertion messages.])
1676 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1677         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1678         AC_MSG_NOTICE([Disabled runtime cleanup.])
1681 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1682         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1683         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1687 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1688         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1689         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1692 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1693         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1694         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1697 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1698         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1699         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1702 if test "x$mono_feature_disable_sockets" = "xyes"; then
1703         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1704         AC_MSG_NOTICE([Disabled sockets])
1707 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1708 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1710 has_extension_module=no
1711 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1713         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1714                 if test x$extension = xdefault ; then
1715                         has_extension_module=yes;
1716                 fi
1717         done
1718         if test x$enable_extension_module = xyes; then
1719                 has_extension_module=yes;
1720         fi
1721 ], [])
1723 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1725 if test x$has_extension_module != xno ; then
1726         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1727         AC_MSG_NOTICE([Enabling mono extension module.])
1730 # Deprecated
1731 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1733 AC_MSG_CHECKING(for visibility __attribute__)
1734 AC_COMPILE_IFELSE([
1735         AC_LANG_SOURCE([[
1736                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1737                 int main () { doit (); return 0; }
1738         ]])
1739 ], [
1740    have_visibility_hidden=yes
1741    AC_MSG_RESULT(yes)
1742 ], [
1743    have_visibility_hidden=no
1744    AC_MSG_RESULT(no)
1748 dnl Boehm GC configuration
1751 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1753 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1754 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1756 if test "x$support_boehm" = "xyes"; then
1758         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1759         if test x$enable_parallel_mark = xyes; then
1760                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1761         fi
1763         gc_msg=""
1764         LIBGC_CPPFLAGS=
1765         LIBGC_LIBS=
1766         LIBGC_STATIC_LIBS=
1767         libgc_dir=
1768         case "x$libgc" in
1769                 xincluded)
1770                         if test "x$support_boehm" = "xyes"; then
1771                                 libgc_dir=libgc
1772                         fi
1774                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1775                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1776                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1778                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1780                         if test x$target_win32 = xyes; then
1781                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1782                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1783                         fi
1785                         gc_msg="Included Boehm GC with typed GC"
1786                         if test x$enable_parallel_mark = xyes; then
1787                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1788                                 gc_msg="$gc_msg and parallel mark"
1789                         else
1790                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1791                         fi
1792                         ;;
1794                 xboehm|xbohem|xyes)
1795                         AC_MSG_WARN("External Boehm is no longer supported")
1796                         ;;
1798                 xsgen)
1799                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1800                         ;;
1802                 xnone)
1803                         AC_MSG_WARN("Compiling mono without GC.")
1804                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1805                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1806                         gc_msg="none"
1807                         ;;
1808                 *)
1809                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1810                         ;;
1811         esac
1813         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])
1814         if test "x$large_heap" = "xyes"; then
1815            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1816         fi
1818         AC_SUBST(LIBGC_CPPFLAGS)
1819         AC_SUBST(LIBGC_LIBS)
1820         AC_SUBST(LIBGC_STATIC_LIBS)
1821         AC_SUBST(libgc_dir)
1822         AC_SUBST(BOEHM_DEFINES)
1825 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1828 dnl End of Boehm GC Configuration
1831 dnl *************************************
1832 dnl *** Checks for zero length arrays ***
1833 dnl *************************************
1834 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1835 AC_TRY_COMPILE([
1836         struct s {
1837                 int  length;
1838                 char data [0];
1839         };
1840 ], [], [
1841         AC_MSG_RESULT(yes)
1842         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1843 ], [
1844         AC_MSG_RESULT(no)
1845         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1848 dnl ***********************************
1849 dnl *** Checks for signals
1850 dnl ***********************************
1851 AC_CHECK_HEADERS(signal.h)
1852 AC_CHECK_FUNCS(sigaction)
1853 AC_CHECK_FUNCS(kill)
1854 AC_CHECK_FUNCS(signal)
1856 # signal() is declared inline in Android headers
1857 # so we need to workaround it by overriding the check.
1858 if test x$platform_android = xyes; then
1859         AC_DEFINE(HAVE_SIGNAL,1)
1862 dnl ***********************************
1863 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1864 dnl ***********************************
1865 enable_gss=no;
1866 AC_MSG_CHECKING(for GSS/GSS.h)
1867 AC_TRY_COMPILE([
1868     #include <GSS/GSS.h>
1869 ], [
1871     AC_MSG_RESULT(yes)
1872     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1873     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1874     enable_gss=yes
1875 ], [
1876     AC_MSG_RESULT(no)
1879 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1880 AC_TRY_COMPILE([
1881     #include <gssapi/gssapi_ext.h>
1882 ], [
1884     AC_MSG_RESULT(yes)
1885     enable_gss=yes
1886 ], [
1887     AC_MSG_RESULT(no)
1890 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1891 AC_TRY_COMPILE([
1892     #include <gssapi/gssapi_ext.h>
1893     #include <gssapi/gssapi_krb5.h>
1894     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1895 ], [
1897     AC_MSG_RESULT(yes)
1898     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1899 ], [
1900     AC_MSG_RESULT(no)
1903 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1905 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1906 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1908 if test x$host_win32 = xno; then
1909         dnl *************************************
1910         dnl *** Checks for time capabilities ***
1911         dnl *************************************
1913         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1914         AC_TRY_COMPILE([#include <time.h>], [
1915                 const int foo = CLOCK_MONOTONIC;
1916         ],[
1917                 AC_MSG_RESULT(yes)
1918                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1919         ], [
1920                 AC_MSG_RESULT(no)
1921         ])
1923         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1924         AC_TRY_COMPILE([#include <time.h>], [
1925                 const int foo = CLOCK_MONOTONIC_COARSE;
1926         ],[
1927                 AC_MSG_RESULT(yes)
1928                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1929         ], [
1930                 AC_MSG_RESULT(no)
1931         ])
1933         AC_MSG_CHECKING(for CLOCK_REALTIME)
1934         AC_TRY_COMPILE([#include <time.h>], [
1935                 const int foo = CLOCK_REALTIME;
1936         ],[
1937                 AC_MSG_RESULT(yes)
1938                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1939         ], [
1940                 AC_MSG_RESULT(no)
1941         ])
1943         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1944         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1945         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1946         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1947         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1948         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1950         dnl hires monotonic clock support
1951         AC_SEARCH_LIBS(clock_gettime, rt)
1952         AC_CHECK_FUNCS(clock_nanosleep)
1954         dnl dynamic loader support
1955         AC_CHECK_FUNC(dlopen, DL_LIB="",
1956                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1957         )
1958         if test x$dl_support = xno; then
1959                 AC_MSG_WARN([No dynamic loading support available])
1960         else
1961                 LIBS="$LIBS $DL_LIB"
1962                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1963                 dnl from glib's configure.ac
1964                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1965                         mono_cv_uscore,[
1966                         AC_TRY_RUN([#include <dlfcn.h>
1967                         int mono_underscore_test (void) { return 42; }
1968                         int main() {
1969                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1970                           handle = dlopen ((void*)0, 0);
1971                           if (handle) {
1972                             f1 = dlsym (handle, "mono_underscore_test");
1973                             f2 = dlsym (handle, "_mono_underscore_test");
1974                           } return (!f2 || f1);
1975                         }],
1976                                 [mono_cv_uscore=yes],
1977                                 [mono_cv_uscore=no],
1978                         [])
1979                 ])
1980                 if test "x$mono_cv_uscore" = "xyes"; then
1981                         MONO_DL_NEED_USCORE=1
1982                 else
1983                         MONO_DL_NEED_USCORE=0
1984                 fi
1985                 AC_SUBST(MONO_DL_NEED_USCORE)
1986                 AC_CHECK_FUNC(dlerror)
1987         fi
1989         dnl ******************************************************************
1990         dnl *** Checks for the IKVM JNI interface library                  ***
1991         dnl ******************************************************************
1992         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])
1994         ikvm_native_dir=
1995         if test x$with_ikvm_native = xyes; then
1996                 ikvm_native_dir=ikvm-native
1997                 jdk_headers_found="IKVM Native"
1998         fi
2000         AC_SUBST(ikvm_native_dir)
2002         AC_CHECK_HEADERS(execinfo.h)
2004         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2006         AC_CHECK_FUNCS(getgrgid_r)
2007         AC_CHECK_FUNCS(getgrnam_r)
2008         AC_CHECK_FUNCS(getresuid)
2009         AC_CHECK_FUNCS(setresuid)
2010         AC_CHECK_FUNCS(kqueue)
2011         AC_CHECK_FUNCS(backtrace_symbols)
2012         AC_CHECK_FUNCS(mkstemp)
2013         AC_CHECK_FUNCS(mmap)
2014         AC_CHECK_FUNCS(madvise)
2015         AC_CHECK_FUNCS(getrusage)
2016         AC_CHECK_FUNCS(getpriority)
2017         AC_CHECK_FUNCS(setpriority)
2018         AC_CHECK_FUNCS(dl_iterate_phdr)
2019         AC_CHECK_FUNCS(dladdr)
2020         AC_CHECK_FUNCS(sysconf)
2021         AC_CHECK_FUNCS(getrlimit)
2022         AC_CHECK_FUNCS(prctl)
2023         AC_CHECK_FUNCS(arc4random)
2024         AC_CHECK_FUNCS(nl_langinfo)
2026         AC_CHECK_FUNCS(sched_getaffinity)
2027         AC_CHECK_FUNCS(sched_setaffinity)
2028         AC_CHECK_FUNCS(sched_getcpu)
2030         if test x$platform_android != xyes; then
2031                 AC_CHECK_FUNCS(getpwnam_r)
2032                 AC_CHECK_FUNCS(getpwuid_r)
2033         fi
2035         AC_CHECK_FUNCS(readlink)
2036         AC_CHECK_FUNCS(chmod)
2037         AC_CHECK_FUNCS(lstat)
2038         AC_CHECK_FUNCS(getdtablesize)
2040         AC_CHECK_FUNCS(ftruncate)
2041         AC_CHECK_FUNCS(msync)
2043         AC_CHECK_FUNCS(gethostname getpeername)
2044         AC_CHECK_FUNCS(utime utimes)
2046         AC_CHECK_FUNCS(openlog closelog)
2047         AC_CHECK_FUNCS(atexit)
2049         AC_FUNC_STRERROR_R()
2051         dnl ****************************************************************
2052         dnl *** Check for sched_setaffinity from glibc versions before   ***
2053         dnl *** 2.3.4. The older versions of the function only take 2    ***
2054         dnl *** parameters, not 3.                                       ***
2055         dnl ***                                                          ***
2056         dnl *** Because the interface change was not made in a minor     ***
2057         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2058         dnl *** won't always indicate the interface sched_affinity has.  ***
2059         dnl ****************************************************************
2060         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2061         AC_TRY_COMPILE([#include <sched.h>], [
2062             int mask = 1; 
2063             sched_setaffinity(0, &mask);
2064         ], [
2065                 # Yes, we have it...
2066                 AC_MSG_RESULT(yes)
2067                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2068         ], [
2069                 # We have the new, three-parameter version
2070                 AC_MSG_RESULT(no)
2071         ])
2072         AC_TRY_COMPILE([#include <sched.h>], [
2073              CPU_COUNT((void *) 0);
2074         ], [
2075                 AC_MSG_RESULT(yes)
2076                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2077         ], [
2078                 # We have the new, three-parameter version
2079                 AC_MSG_RESULT(no)
2080         ])
2082         dnl ******************************************************************
2083         dnl *** Check for large file support                               ***
2084         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2085         dnl ******************************************************************
2086         
2087         # Check that off_t can represent 2**63 - 1 correctly, working around
2088         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2089         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2090         large_offt=no
2091         AC_DEFUN([LARGE_FILES], [
2092                 large_CPPFLAGS=$CPPFLAGS
2093                 CPPFLAGS="$CPPFLAGS $1"
2094                 AC_TRY_COMPILE([
2095                         #include <sys/types.h>
2096                         #include <limits.h>
2097                 ], [
2098                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2099                         #define COMPILE_TIME_ASSERT(pred) \
2100                                 switch(0){case 0:case pred:;}
2101                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2102                 ], [
2103                         AC_MSG_RESULT(ok)
2104                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2105                         large_CPPFLAGS="$large_CPPFLAGS $1"
2106                         large_offt=yes
2107                 ], [
2108                         AC_MSG_RESULT(no)
2109                 ])
2110                 CPPFLAGS=$large_CPPFLAGS
2111         ])
2113         AC_MSG_CHECKING(if off_t is 64 bits wide)
2114         LARGE_FILES("")
2115         if test $large_offt = no; then
2116                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2117                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2118         fi
2119         if test $large_offt = no; then
2120                 AC_MSG_WARN([No 64 bit file size support available])
2121         fi
2122         
2123         dnl *****************************
2124         dnl *** Checks for libsocket  ***
2125         dnl *****************************
2126         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2128         case "$host" in
2129                 *-*-*freebsd*)
2130                         dnl *****************************
2131                         dnl *** Checks for libinotify ***
2132                         dnl *****************************
2133                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2134         esac
2136         dnl *******************************
2137         dnl *** Checks for MSG_NOSIGNAL ***
2138         dnl *******************************
2139         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2140         AC_TRY_COMPILE([#include <sys/socket.h>], [
2141                 int f = MSG_NOSIGNAL;
2142         ], [
2143                 # Yes, we have it...
2144                 AC_MSG_RESULT(yes)
2145                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2146         ], [
2147                 # We'll have to use signals
2148                 AC_MSG_RESULT(no)
2149         ])
2151         dnl *****************************
2152         dnl *** Checks for IPPROTO_IP ***
2153         dnl *****************************
2154         AC_MSG_CHECKING(for IPPROTO_IP)
2155         AC_TRY_COMPILE([#include <netinet/in.h>], [
2156                 int level = IPPROTO_IP;
2157         ], [
2158                 # Yes, we have it...
2159                 AC_MSG_RESULT(yes)
2160                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2161         ], [
2162                 # We'll have to use getprotobyname
2163                 AC_MSG_RESULT(no)
2164         ])
2166         dnl *******************************
2167         dnl *** Checks for IPPROTO_IPV6 ***
2168         dnl *******************************
2169         AC_MSG_CHECKING(for IPPROTO_IPV6)
2170         AC_TRY_COMPILE([#include <netinet/in.h>], [
2171                 int level = IPPROTO_IPV6;
2172         ], [
2173                 # Yes, we have it...
2174                 AC_MSG_RESULT(yes)
2175                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2176         ], [
2177                 # We'll have to use getprotobyname
2178                 AC_MSG_RESULT(no)
2179         ])
2181         dnl ******************************
2182         dnl *** Checks for IPPROTO_TCP ***
2183         dnl ******************************
2184         AC_MSG_CHECKING(for IPPROTO_TCP)
2185         AC_TRY_COMPILE([#include <netinet/in.h>], [
2186                 int level = IPPROTO_TCP;
2187         ], [
2188                 # Yes, we have it...
2189                 AC_MSG_RESULT(yes)
2190                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2191         ], [
2192                 # We'll have to use getprotobyname
2193                 AC_MSG_RESULT(no)
2194         ])
2196         dnl *****************************
2197         dnl *** Checks for SOL_IP     ***
2198         dnl *****************************
2199         AC_MSG_CHECKING(for SOL_IP)
2200         AC_TRY_COMPILE([#include <netdb.h>], [
2201                 int level = SOL_IP;
2202         ], [
2203                 # Yes, we have it...
2204                 AC_MSG_RESULT(yes)
2205                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2206         ], [
2207                 # We'll have to use getprotobyname
2208                 AC_MSG_RESULT(no)
2209         ])
2211         dnl *****************************
2212         dnl *** Checks for SOL_IPV6     ***
2213         dnl *****************************
2214         AC_MSG_CHECKING(for SOL_IPV6)
2215         AC_TRY_COMPILE([#include <netdb.h>], [
2216                 int level = SOL_IPV6;
2217         ], [
2218                 # Yes, we have it...
2219                 AC_MSG_RESULT(yes)
2220                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2221         ], [
2222                 # We'll have to use getprotobyname
2223                 AC_MSG_RESULT(no)
2224         ])
2226         dnl *****************************
2227         dnl *** Checks for SOL_TCP    ***
2228         dnl *****************************
2229         AC_MSG_CHECKING(for SOL_TCP)
2230         AC_TRY_COMPILE([#include <netdb.h>], [
2231                 int level = SOL_TCP;
2232         ], [
2233                 # Yes, we have it...
2234                 AC_MSG_RESULT(yes)
2235                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2236         ], [
2237                 # We'll have to use getprotobyname
2238                 AC_MSG_RESULT(no)
2239         ])
2241         dnl *****************************
2242         dnl *** Checks for IP_PKTINFO ***
2243         dnl *****************************
2244         AC_MSG_CHECKING(for IP_PKTINFO)
2245         AC_TRY_COMPILE([#include <linux/in.h>], [
2246                 int level = IP_PKTINFO;
2247         ], [
2248                 # Yes, we have it...
2249                 AC_MSG_RESULT(yes)
2250                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2251         ], [
2252                 AC_MSG_RESULT(no)
2253         ])
2255         dnl *****************************
2256         dnl *** Checks for IPV6_PKTINFO ***
2257         dnl *****************************
2258         AC_MSG_CHECKING(for IPV6_PKTINFO)
2259         AC_TRY_COMPILE([#include <netdb.h>], [
2260                 int level = IPV6_PKTINFO;
2261         ], [
2262                 # Yes, we have it...
2263                 AC_MSG_RESULT(yes)
2264                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2265         ], [
2266                 AC_MSG_RESULT(no)
2267         ])
2269         dnl **********************************
2270         dnl *** Checks for IP_DONTFRAG     ***
2271         dnl **********************************
2272         AC_MSG_CHECKING(for IP_DONTFRAG)
2273         AC_TRY_COMPILE([#include <netinet/in.h>], [
2274                 int level = IP_DONTFRAG;
2275         ], [
2276                 # Yes, we have it...
2277                 AC_MSG_RESULT(yes)
2278                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2279         ], [
2280                 AC_MSG_RESULT(no)
2281         ])
2283         dnl **********************************
2284         dnl *** Checks for IP_DONTFRAGMENT ***
2285         dnl **********************************
2286         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2287         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2288                 int level = IP_DONTFRAGMENT;
2289         ], [
2290                 # Yes, we have it...
2291                 AC_MSG_RESULT(yes)
2292                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2293         ], [
2294                 AC_MSG_RESULT(no)
2295         ])
2297         dnl **********************************
2298         dnl *** Checks for IP_MTU_DISCOVER ***
2299         dnl **********************************
2300         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2301         AC_TRY_COMPILE([#include <linux/in.h>], [
2302                 int level = IP_MTU_DISCOVER;
2303         ], [
2304                 # Yes, we have it...
2305                 AC_MSG_RESULT(yes)
2306                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2307         ], [
2308                 AC_MSG_RESULT(no)
2309         ])
2311         dnl **********************************
2312         dnl *** Checks for  IP_PMTUDISC_DO ***
2313         dnl **********************************
2314         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2315         AC_TRY_COMPILE([#include <linux/in.h>], [
2316                 int level = IP_PMTUDISC_DO;
2317         ], [
2318                 # Yes, we have it...
2319                 AC_MSG_RESULT(yes)
2320                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2321         ], [
2322                 AC_MSG_RESULT(no)
2323         ])
2325         dnl *********************************
2326         dnl *** Check for struct ip_mreqn ***
2327         dnl *********************************
2328         AC_MSG_CHECKING(for struct ip_mreqn)
2329         AC_TRY_COMPILE([#include <netinet/in.h>], [
2330                 struct ip_mreqn mreq;
2331                 mreq.imr_address.s_addr = 0;
2332         ], [
2333                 # Yes, we have it...
2334                 AC_MSG_RESULT(yes)
2335                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2336         ], [
2337                 # We'll just have to try and use struct ip_mreq
2338                 AC_MSG_RESULT(no)
2339                 AC_MSG_CHECKING(for struct ip_mreq)
2340                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2341                         struct ip_mreq mreq;
2342                         mreq.imr_interface.s_addr = 0;
2343                 ], [
2344                         # Yes, we have it...
2345                         AC_MSG_RESULT(yes)
2346                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2347                 ], [
2348                         # No multicast support
2349                         AC_MSG_RESULT(no)
2350                 ])
2351         ])
2352         
2353         dnl **********************************
2354         dnl *** Check for getaddrinfo ***
2355         dnl **********************************
2356         AC_MSG_CHECKING(for getaddrinfo)
2357                 AC_TRY_LINK([
2358                 #include <stdio.h>
2359                 #include <netdb.h>
2360         ], [
2361                 getaddrinfo(NULL,NULL,NULL,NULL);
2362         ], [
2363                 # Yes, we have it...
2364                 AC_MSG_RESULT(yes)
2365                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2366         ], [
2367                 AC_MSG_RESULT(no)
2368         ])
2370         dnl **********************************
2371         dnl *** Check for gethostbyname2_r ***
2372         dnl **********************************
2373         AC_MSG_CHECKING(for gethostbyname2_r)
2374                 AC_TRY_LINK([
2375                 #include <stdio.h>
2376                 #include <netdb.h>
2377         ], [
2379                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2380         ], [
2381                 # Yes, we have it...
2382                 AC_MSG_RESULT(yes)
2383                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2384         ], [
2385                 AC_MSG_RESULT(no)
2386         ])
2388         dnl **********************************
2389         dnl *** Check for gethostbyname2 ***
2390         dnl **********************************
2391         AC_MSG_CHECKING(for gethostbyname2)
2392                 AC_TRY_LINK([
2393                 #include <stdio.h>
2394                 #include <netdb.h>
2395         ], [
2396                 gethostbyname2(NULL,0);
2397         ], [
2398                 # Yes, we have it...
2399                 AC_MSG_RESULT(yes)
2400                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2401         ], [
2402                 AC_MSG_RESULT(no)
2403         ])
2405         dnl **********************************
2406         dnl *** Check for gethostbyname ***
2407         dnl **********************************
2408         AC_MSG_CHECKING(for gethostbyname)
2409                 AC_TRY_LINK([
2410                 #include <stdio.h>
2411                 #include <netdb.h>
2412         ], [
2413                 gethostbyname(NULL);
2414         ], [
2415                 # Yes, we have it...
2416                 AC_MSG_RESULT(yes)
2417                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2418         ], [
2419                 AC_MSG_RESULT(no)
2420         ])
2422         dnl **********************************
2423         dnl *** Check for getprotobyname ***
2424         dnl **********************************
2425         AC_MSG_CHECKING(for getprotobyname)
2426                 AC_TRY_LINK([
2427                 #include <stdio.h>
2428                 #include <netdb.h>
2429         ], [
2430                 getprotobyname(NULL);
2431         ], [
2432                 # Yes, we have it...
2433                 AC_MSG_RESULT(yes)
2434                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2435         ], [
2436                 AC_MSG_RESULT(no)
2437         ])
2439         dnl **********************************
2440         dnl *** Check for getprotobyname_r ***
2441         dnl **********************************
2442         AC_MSG_CHECKING(for getprotobyname_r)
2443                 AC_TRY_LINK([
2444                 #include <stdio.h>
2445                 #include <netdb.h>
2446         ], [
2447                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2448         ], [
2449                 # Yes, we have it...
2450                 AC_MSG_RESULT(yes)
2451                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2452         ], [
2453                 AC_MSG_RESULT(no)
2454         ])
2456         dnl **********************************
2457         dnl *** Check for getnameinfo ***
2458         dnl **********************************
2459         AC_MSG_CHECKING(for getnameinfo)
2460                 AC_TRY_LINK([
2461                 #include <stdio.h>
2462                 #include <netdb.h>
2463         ], [
2464                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2465         ], [
2466                 # Yes, we have it...
2467                 AC_MSG_RESULT(yes)
2468                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2469         ], [
2470                 AC_MSG_RESULT(no)
2471         ])
2474         dnl **********************************
2475         dnl *** Check for inet_ntop ***
2476         dnl **********************************
2477         AC_MSG_CHECKING(for inet_ntop)
2478                 AC_TRY_LINK([
2479                 #include <stdio.h>
2480                 #include <arpa/inet.h>
2481         ], [
2482                 inet_ntop (0, NULL, NULL, 0);
2483         ], [
2484                 # Yes, we have it...
2485                 AC_MSG_RESULT(yes)
2486                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2487         ], [
2488                 AC_MSG_RESULT(no)
2489         ])
2491         dnl *****************************
2492         dnl *** Checks for libnsl     ***
2493         dnl *****************************
2494         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2496         AC_CHECK_FUNCS(inet_pton inet_aton)
2498         dnl *****************************
2499         dnl *** Checks for libxnet    ***
2500         dnl *****************************
2501         case "${host}" in
2502                 *solaris* )
2503                         AC_MSG_CHECKING(for Solaris XPG4 support)
2504                         if test -f /usr/lib/libxnet.so; then
2505                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2506                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2507                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2508                                 LIBS="$LIBS -lxnet"
2509                                 AC_MSG_RESULT(yes)
2510                         else
2511                                 AC_MSG_RESULT(no)
2512                         fi
2514                         if test "$GCC" = "yes"; then
2515                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2516                         fi
2517                 ;;
2518         esac
2520         dnl *****************************
2521         dnl *** Checks for libpthread ***
2522         dnl *****************************
2523 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2524 # and libpthread does not exist
2526         case "${host}" in
2527                 *-*-*haiku*)
2528                         dnl Haiku has pthread in libroot (libc equiv)
2529                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2530                 ;;
2531                 *-*-*freebsd*)
2532                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2533                 ;;
2534                 *-*-*openbsd*)
2535                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2536                 ;;
2537                 *)
2538                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2539                 ;;
2540         esac
2541         AC_CHECK_HEADERS(pthread.h)
2542         AC_CHECK_HEADERS(pthread_np.h)
2543         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2544         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2545         AC_CHECK_FUNCS(pthread_kill)
2546         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2547         AC_TRY_COMPILE([ #include <pthread.h>], [
2548                 pthread_mutexattr_t attr;
2549                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2550         ], [
2551                 AC_MSG_RESULT(ok)
2552         ], [
2553                 AC_MSG_RESULT(no)
2554                 AC_ERROR(Posix system lacks support for recursive mutexes)
2555         ])
2556         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2557         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2558         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2559         AC_CHECK_FUNCS(mincore mlock munlock)
2561         dnl ***********************************
2562         dnl *** Checks for working __thread ***
2563         dnl ***********************************
2564         AC_MSG_CHECKING(for working __thread)
2565         if test "x$with_tls" != "x__thread"; then
2566                 AC_MSG_RESULT(disabled)
2567         elif test "x$cross_compiling" = "xyes"; then
2568                 AC_MSG_RESULT(cross compiling, assuming yes)
2569         else
2570                 AC_TRY_RUN([
2571                         #if defined(__APPLE__) && defined(__clang__)
2572                         #error "__thread does not currently work with clang on Mac OS X"
2573                         #endif
2574                         
2575                         #include <pthread.h>
2576                         __thread int i;
2577                         static int res1, res2;
2579                         void thread_main (void *arg)
2580                         {
2581                                 i = arg;
2582                                 sleep (1);
2583                                 if (arg == 1)
2584                                         res1 = (i == arg);
2585                                 else
2586                                         res2 = (i == arg);
2587                         }
2589                         int main () {
2590                                 pthread_t t1, t2;
2592                                 i = 5;
2594                                 pthread_create (&t1, NULL, thread_main, 1);
2595                                 pthread_create (&t2, NULL, thread_main, 2);
2597                                 pthread_join (t1, NULL);
2598                                 pthread_join (t2, NULL);
2600                                 return !(res1 + res2 == 2);
2601                         }
2602                 ], [
2603                                 AC_MSG_RESULT(yes)
2604                 ], [
2605                                 AC_MSG_RESULT(no)
2606                                 with_tls=pthread
2607                 ])
2608         fi
2610         dnl **************************************
2611         dnl *** Checks for working sigaltstack ***
2612         dnl **************************************
2613         AC_MSG_CHECKING(for working sigaltstack)
2614         if test "x$with_sigaltstack" != "xyes"; then
2615                 AC_MSG_RESULT(disabled)
2616         elif test "x$cross_compiling" = "xyes"; then
2617                 AC_MSG_RESULT(cross compiling, assuming no)
2618                 with_sigaltstack=no
2619         else
2620                 AC_TRY_RUN([
2621                         #include <stdio.h>
2622                         #include <stdlib.h>
2623                         #include <unistd.h>
2624                         #include <signal.h>
2625                         #include <pthread.h>
2626                         #include <sys/wait.h>
2627                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2628                         #define SA_STACK SA_ONSTACK
2629                         #endif
2630                         static void
2631                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2632                         {
2633                                 exit (0);
2634                         }
2636                         volatile char*__ptr = NULL;
2637                         static void *
2638                         loop (void *ignored)
2639                         {
2640                                 *__ptr = 0;
2641                                 return NULL;
2642                         }
2644                         static void
2645                         child ()
2646                         {
2647                                 struct sigaction sa;
2648                                 stack_t sas;
2649                                 pthread_t id;
2650                                 pthread_attr_t attr;
2652                                 sa.sa_sigaction = sigsegv_signal_handler;
2653                                 sigemptyset (&sa.sa_mask);
2654                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2655                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2656                                         perror ("sigaction");
2657                                         return;
2658                                 }
2660                                 /* x86 darwin deliver segfaults using SIGBUS */
2661                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2662                                         perror ("sigaction");
2663                                         return;
2664                                 }
2665                                 sas.ss_sp = malloc (SIGSTKSZ);
2666                                 sas.ss_size = SIGSTKSZ;
2667                                 sas.ss_flags = 0;
2668                                 if (sigaltstack (&sas, NULL) == -1) {
2669                                         perror ("sigaltstack");
2670                                         return;
2671                                 }
2673                                 pthread_attr_init (&attr);
2674                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2675                                         printf ("pthread_create\n");
2676                                         return;
2677                                 }
2679                                 sleep (100);
2680                         }
2682                         int
2683                         main ()
2684                         {
2685                                 pid_t son;
2686                                 int status;
2687                                 int i;
2689                                 son = fork ();
2690                                 if (son == -1) {
2691                                         return 1;
2692                                 }
2694                                 if (son == 0) {
2695                                         child ();
2696                                         return 0;
2697                                 }
2699                                 for (i = 0; i < 300; ++i) {
2700                                         waitpid (son, &status, WNOHANG);
2701                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2702                                                 return 0;
2703                                         usleep (10000);
2704                                 }
2706                                 kill (son, SIGKILL);
2707                                 return 1;
2708                         }
2710                 ], [
2711                                 AC_MSG_RESULT(yes)
2712                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2713                 ], [
2714                                 with_sigaltstack=no
2715                                 AC_MSG_RESULT(no)
2716                 ])
2717         fi
2719         dnl ********************************
2720         dnl *** Checks for semaphore lib ***
2721         dnl ********************************
2722         # 'Real Time' functions on Solaris
2723         # posix4 on Solaris 2.6
2724         # pthread (first!) on Linux
2725         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2727         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2728         AC_CHECK_FUNCS(shm_open)
2730         dnl ********************************
2731         dnl *** Checks for timezone stuff **
2732         dnl ********************************
2733         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2734                 AC_TRY_COMPILE([
2735                         #include <time.h>
2736                         ], [
2737                         struct tm tm;
2738                         tm.tm_gmtoff = 1;
2739                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2740         if test $ac_cv_struct_tm_gmtoff = yes; then
2741                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2742         else
2743                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2744                         AC_TRY_COMPILE([
2745                                 #include <time.h>
2746                         ], [
2747                                 timezone = 1;
2748                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2749                 if test $ac_cv_var_timezone = yes; then
2750                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2751                 else
2752                         AC_ERROR(unable to find a way to determine timezone)
2753                 fi
2754         fi
2756         dnl *********************************
2757         dnl *** Checks for math functions ***
2758         dnl *********************************
2759         AC_SEARCH_LIBS(sqrtf, m)
2761         dnl ****************************************************************
2762         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2763         dnl *** have it in the library (duh))                            ***
2764         dnl ****************************************************************
2765         AC_CHECK_FUNCS(poll)
2767         dnl **********************************
2768         dnl *** epoll                      ***
2769         dnl **********************************
2770         AC_CHECK_HEADERS(sys/epoll.h)
2771         haveepoll=no
2772         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2773         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2774                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2775         fi
2777         havekqueue=no
2779         AC_CHECK_HEADERS(sys/event.h)
2780         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2782         dnl **************************************
2783         dnl * Darwin has a race that prevents us from using reliably:
2784         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2785         dnl * Since kqueue is mostly used for scaling large web servers, 
2786         dnl * and very few folks run Mono on large web servers on OSX, falling
2787         dnl * back 
2788         dnl **************************************
2789         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2790                 if test "x$host_darwin" = "xno"; then
2791                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2792                 fi
2793         fi
2795         dnl ******************************
2796         dnl *** Checks for SIOCGIFCONF ***
2797         dnl ******************************
2798         AC_CHECK_HEADERS(sys/ioctl.h)
2799         AC_CHECK_HEADERS(net/if.h, [], [],
2800            [
2801            #ifdef HAVE_SYS_TYPES_H
2802            # include <sys/types.h>
2803            #endif
2804            #ifdef HAVE_SYS_SOCKET_H
2805            # include <sys/socket.h>
2806            #endif
2807            ])
2808         AC_MSG_CHECKING(for ifreq)
2809         AC_TRY_COMPILE([
2810                 #include <stdio.h>
2811                 #include <sys/ioctl.h>
2812                 #include <net/if.h>
2813                 ], [
2814                 struct ifconf ifc;
2815                 struct ifreq *ifr;
2816                 void *x;
2817                 ifc.ifc_len = 0;
2818                 ifc.ifc_buf = NULL;
2819                 x = (void *) &ifr->ifr_addr;
2820                 ],[
2821                         AC_MSG_RESULT(yes)
2822                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2823                 ], [
2824                         AC_MSG_RESULT(no)
2825                 ])
2826         dnl **********************************
2827         dnl ***     Checks for sin_len     ***
2828         dnl **********************************
2829         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2830         AC_TRY_COMPILE([
2831                 #include <netinet/in.h>
2832                 ], [
2833                 struct sockaddr_in saddr;
2834                 saddr.sin_len = sizeof (saddr);
2835                 ],[
2836                         AC_MSG_RESULT(yes)
2837                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2838                 ], [
2839                         AC_MSG_RESULT(no)
2840                 ])      
2841         dnl **********************************
2842         dnl ***    Checks for sin6_len     ***
2843         dnl **********************************
2844         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2845         AC_TRY_COMPILE([
2846                 #include <netinet/in.h>
2847                 ], [
2848                 struct sockaddr_in6 saddr6;
2849                 saddr6.sin6_len = sizeof (saddr6);
2850                 ],[
2851                         AC_MSG_RESULT(yes)
2852                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2853                 ], [
2854                         AC_MSG_RESULT(no)
2855                 ])
2856         dnl **********************************
2857         dnl *** Check for getifaddrs       ***
2858         dnl **********************************
2859         AC_MSG_CHECKING(for getifaddrs)
2860                 AC_TRY_LINK([
2861                 #include <stdio.h>
2862                 #include <sys/types.h>
2863                 #include <sys/socket.h>
2864                 #include <ifaddrs.h>
2865         ], [
2866                 getifaddrs(NULL);
2867         ], [
2868                 # Yes, we have it...
2869                 AC_MSG_RESULT(yes)
2870                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2871         ], [
2872                 AC_MSG_RESULT(no)
2873         ])
2874         dnl **********************************
2875         dnl *** Check for if_nametoindex   ***
2876         dnl **********************************
2877         AC_MSG_CHECKING(for if_nametoindex)
2878                 AC_TRY_LINK([
2879                 #include <stdio.h>
2880                 #include <sys/types.h>
2881                 #include <sys/socket.h>
2882                 #include <net/if.h>
2883         ], [
2884                 if_nametoindex(NULL);
2885         ], [
2886                 # Yes, we have it...
2887                 AC_MSG_RESULT(yes)
2888                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2889         ], [
2890                 AC_MSG_RESULT(no)
2891         ])
2892         dnl **********************************
2893         dnl *** Check for access ***
2894         dnl **********************************
2895         AC_MSG_CHECKING(for access)
2896                 AC_TRY_LINK([
2897                 #include <unistd.h>
2898         ], [
2899                 access(NULL,0);
2900         ], [
2901                 # Yes, we have it...
2902                 AC_MSG_RESULT(yes)
2903                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2904         ], [
2905                 AC_MSG_RESULT(no)
2906         ])
2907                         
2908         dnl **********************************
2909         dnl *** Checks for proclib         ***
2910         dnl **********************************
2911         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.)])
2912         dnl **********************************
2913         dnl *** Checks for MonoPosixHelper ***
2914         dnl **********************************
2915         AC_CHECK_HEADERS(checklist.h)
2916         AC_CHECK_HEADERS(pathconf.h)
2917         AC_CHECK_HEADERS(fstab.h)
2918         AC_CHECK_HEADERS(attr/xattr.h)
2919         AC_CHECK_HEADERS(sys/extattr.h)
2920         AC_CHECK_HEADERS(sys/sendfile.h)
2921         AC_CHECK_HEADERS(sys/statvfs.h)
2922         AC_CHECK_HEADERS(sys/statfs.h)
2923         AC_CHECK_HEADERS(sys/vfstab.h)
2924         AC_CHECK_HEADERS(sys/xattr.h)
2925         AC_CHECK_HEADERS(sys/mman.h)
2926         AC_CHECK_HEADERS(sys/param.h)
2927         AC_CHECK_HEADERS(sys/mount.h, [], [],
2928                 [
2929                 #ifdef HAVE_SYS_PARAM_H
2930                 # include <sys/param.h>
2931                 #endif
2932                 ])
2933         AC_CHECK_HEADERS(sys/mount.h)
2934         AC_CHECK_FUNCS(confstr)
2935         AC_CHECK_FUNCS(seekdir telldir)
2936         AC_CHECK_FUNCS(getdomainname)
2937         AC_CHECK_FUNCS(setdomainname)
2938         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2939         AC_CHECK_FUNCS(setgroups)
2940         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2941         AC_CHECK_FUNCS(getfsstat)
2942         AC_CHECK_FUNCS(lutimes futimes)
2943         AC_CHECK_FUNCS(mremap)
2944         AC_CHECK_FUNCS(remap_file_pages)
2945         AC_CHECK_FUNCS(posix_fadvise)
2946         AC_CHECK_FUNCS(posix_fallocate)
2947         AC_CHECK_FUNCS(posix_madvise)
2948         AC_CHECK_FUNCS(vsnprintf)
2949         AC_CHECK_FUNCS(sendfile)
2950         AC_CHECK_FUNCS(gethostid sethostid)
2951         AC_CHECK_FUNCS(sethostname)
2952         AC_CHECK_FUNCS(statfs)
2953         AC_CHECK_FUNCS(fstatfs)
2954         AC_CHECK_FUNCS(statvfs)
2955         AC_CHECK_FUNCS(fstatvfs)
2956         AC_CHECK_FUNCS(stime)
2957         AC_CHECK_FUNCS(ttyname_r)
2958         AC_CHECK_FUNCS(psignal)
2959         AC_CHECK_FUNCS(getlogin_r)
2960         AC_CHECK_FUNCS(lockf)
2961         AC_CHECK_FUNCS(swab)
2962         AC_CHECK_FUNCS(setusershell endusershell)
2963         AC_CHECK_FUNCS(futimens utimensat)
2964         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2965         AC_CHECK_FUNCS(readv writev preadv pwritev)
2966         AC_CHECK_FUNCS(setpgid)
2967         AC_CHECK_FUNCS(system)
2968         AC_CHECK_FUNCS(fork execv execve)
2969         AC_CHECK_FUNCS(waitpid)
2970         AC_CHECK_FUNCS(accept4)
2971         AC_CHECK_FUNCS(localtime_r)
2972         AC_CHECK_FUNCS(mkdtemp)
2973         AC_CHECK_SIZEOF(size_t)
2974         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2975                 [#include <sys/types.h>
2976                  #include <sys/stat.h>
2977                  #include <unistd.h>])
2978         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2979                 [#include <sys/types.h>
2980                  #include <sys/stat.h>
2981                  #include <unistd.h>])
2982         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2983                 [#include <sys/time.h>])
2984         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2985                 [#include <sys/socket.h>])
2986         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2987                 [#include <unistd.h>
2988                  #include <fcntl.h>])
2989         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2990                 [#include <sys/uio.h>])
2991         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2992                 [#include <sys/socket.h>])
2993         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2994                 [#include <sys/poll.h>])
2995         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2996                 [#include <sys/socket.h>])
2997         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2998                 [#include <sys/socket.h>])
2999         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3000                 [#include <netinet/in.h>])
3001         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3002                 [#include <netinet/in.h>])
3003         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3004                 [#include <sys/un.h>])
3005         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3006                 [#include <sys/types.h>
3007                  #include <sys/stat.h>
3008                  #include <unistd.h>])
3009         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3010                 [#include <time.h>])
3011         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3012                 [#include <sys/time.h>
3013                  #include <sys/types.h>
3014                  #include <utime.h>])
3015         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3016                 [#include <sys/time.h>])
3017         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3018                 [#include <sys/types.h>
3019                  #include <utime.h>])
3020         AC_CHECK_MEMBERS(
3021                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3022                 [#include <sys/types.h>
3023                  #include <dirent.h>])
3024         AC_CHECK_MEMBERS(
3025                 [struct passwd.pw_gecos],,, 
3026                 [#include <sys/types.h>
3027                  #include <pwd.h>])
3028         AC_CHECK_MEMBERS(
3029                 [struct statfs.f_flags],,, 
3030                 [#include <sys/types.h>
3031                  #include <sys/vfs.h>])
3032         AC_CHECK_MEMBERS(
3033                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3034                 [#include <sys/types.h>
3035                  #include <sys/stat.h>
3036                  #include <unistd.h>])
3038         dnl Favour xattr through glibc, but use libattr if we have to
3039         AC_CHECK_FUNC(lsetxattr, ,
3040                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3041         )
3042         AC_SUBST(XATTR_LIB)
3044         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3045         AC_CHECK_MEMBERS(
3046                 [struct kinfo_proc.kp_proc],,, 
3047                 [#include <sys/types.h>
3048                  #include <sys/param.h>
3049                  #include <sys/sysctl.h>
3050                  #include <sys/proc.h>
3051                  ])
3053         dnl *********************************
3054         dnl *** Checks for Windows compilation ***
3055         dnl *********************************
3056         AC_CHECK_HEADERS(sys/time.h)
3057         AC_CHECK_HEADERS(sys/param.h)
3058         AC_CHECK_HEADERS(dirent.h)
3060         dnl ******************************************
3061         dnl *** Checks for OSX and iOS compilation ***
3062         dnl ******************************************
3063         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3065         dnl *********************************
3066         dnl *** Check for Console 2.0 I/O ***
3067         dnl *********************************
3068         AC_CHECK_HEADERS([curses.h])
3069         AC_CHECK_HEADERS([term.h], [], [],
3070         [#if HAVE_CURSES_H
3071          #include <curses.h>
3072          #endif
3073         ])
3074         AC_CHECK_HEADERS([termios.h])
3076         dnl *********************************
3077         dnl *** Checks for random         ***
3078         dnl *********************************
3079         if test x$host_darwin = xno; then
3080                 AC_CHECK_HEADERS(sys/random.h)
3081                 AC_CHECK_FUNCS(getrandom getentropy)
3082         fi
3084         dnl *********************************
3085         dnl *** Checks for Mono.Native  ***
3086         dnl *********************************
3088         AC_MSG_CHECKING(for linux/in.h)
3089         AC_TRY_COMPILE([
3090                 #include <sys/socket.h>
3091                 #include <linux/in.h>
3092         ], [
3093         ],[
3094                 AC_MSG_RESULT(yes)
3095                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3096         ], [
3097                 AC_MSG_RESULT(no)
3098         ])
3100         AC_CHECK_HEADERS([linux/if_packet.h])
3102         AC_MSG_CHECKING(for struct in_pktinfo)
3103         AC_TRY_COMPILE([
3104                 #ifdef HAVE_LINUX_IN_H
3105                 #include <sys/socket.h>
3106                 #include <linux/in.h>
3107                 #else
3108                 #include <netinet/in.h>
3109                 #endif
3110         ], [
3111                 struct in_pktinfo pktinfo;
3112         ],[
3113                 AC_MSG_RESULT(yes)
3114                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3115         ], [
3116                 AC_MSG_RESULT(no)
3117         ])
3119         AC_MSG_CHECKING(for struct ip_mreqn)
3120         AC_TRY_COMPILE([
3121                 #if HAVE_LINUX_IN_H
3122                 #include <sys/socket.h>
3123                 #include <linux/in.h>
3124                 #else
3125                 #include <netinet/in.h>
3126                 #endif
3127         ], [
3128                 struct ip_mreqn mreqn;
3129         ],[
3130                 AC_MSG_RESULT(yes)
3131                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3132         ], [
3133                 AC_MSG_RESULT(no)
3134         ])
3136         if test x$host_darwin = xno; then
3137                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3138         fi
3140         if test x$mono_native_platform_ios = xno; then
3141                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3142                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3143                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3144         fi
3146         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3147         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3148         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3149         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3150         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3151         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3152         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3153         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3154         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3155         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3156         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3157         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3158         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3159         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3160         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3161         AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3162         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3163         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3164         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3166         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3167         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3169         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>]])
3170         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>]])
3171         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>]])
3172         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>]])
3173         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3174         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3175         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3177         AC_MSG_CHECKING(for struct statfs)
3178         AC_TRY_COMPILE([
3179                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3180                 #include <sys/mount.h>
3181                 #else
3182                 #include <sys/statfs.h>
3183                 #endif
3184         ], [
3185                 struct statfs;
3186         ],[
3187                 AC_MSG_RESULT(yes)
3188                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3189         ], [
3190                 AC_MSG_RESULT(no)
3191         ])
3193         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3194                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3195         fi
3197         AC_MSG_CHECKING(for readdir_r)
3198         AC_TRY_COMPILE([
3199                 #include <dirent.h>
3200         ], [
3201                 DIR* dir;
3202                 struct dirent* entry;
3203                 struct dirent* result;
3204                 readdir_r(dir, entry, &result);
3205         ],[
3206                 AC_MSG_RESULT(yes)
3207                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3208         ], [
3209                 AC_MSG_RESULT(no)
3210         ])
3212         AC_MSG_CHECKING(for kevent with void *data)
3213         AC_TRY_COMPILE([
3214                 #include <sys/types.h>
3215                 #include <sys/event.h>
3216         ], [
3217                 struct kevent event;
3218                 void* data;
3219                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3220         ],[
3221                 AC_MSG_RESULT(yes)
3222                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3223         ], [
3224                 AC_MSG_RESULT(no)
3225         ])
3227         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3228         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3230         AC_MSG_CHECKING(for sendfile with 4 arguments)
3231         AC_TRY_COMPILE([
3232                 #include <sys/sendfile.h>
3233         ], [
3234                 int result = sendfile(0, 0, 0, 0);
3235         ],[
3236                 AC_MSG_RESULT(yes)
3237                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3238         ], [
3239                 AC_MSG_RESULT(no)
3240         ])
3242         AC_MSG_CHECKING(for sendfile with 6 arguments)
3243         AC_TRY_LINK([
3244                 #include <stdlib.h>
3245                 #include <sys/types.h>
3246                 #include <sys/socket.h>
3247                 #include <sys/uio.h>
3248         ], [
3249                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3250         ],[
3251                 AC_MSG_RESULT(yes)
3252                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3253         ], [
3254                 AC_MSG_RESULT(no)
3255         ])
3257         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3258         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3259         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3260         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3262         ORIG_CFLAGS="$CFLAGS"
3263         CFLAGS="-Werror -Wsign-conversion"
3265         AC_MSG_CHECKING(for getnameinfo with signed flags)
3266         AC_TRY_COMPILE([
3267                 #include <sys/types.h>
3268                 #include <netdb.h>
3269         ], [
3270                 const struct sockaddr *addr;
3271                 socklen_t addrlen;
3272                 char *host;
3273                 socklen_t hostlen;
3274                 char *serv;
3275                 socklen_t servlen;
3276                 int flags;
3277                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3278         ],[
3279                 AC_MSG_RESULT(yes)
3280                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3281         ], [
3282                 AC_MSG_RESULT(no)
3283         ])
3285         CFLAGS="$ORIG_CFLAGS"
3287         if test "x$host_linux" = "xyes"; then
3288                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3289         else
3290                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3291         fi
3293         ORIG_CFLAGS="$CFLAGS"
3294         CFLAGS="-Werror -Wsign-conversion"
3296         AC_MSG_CHECKING(for bind with unsigned addrlen)
3297         AC_TRY_COMPILE([
3298                 #include <sys/socket.h>
3299         ], [
3300                 int fd;
3301                 struct sockaddr* addr;
3302                 socklen_t addrLen;
3303                 bind(fd, addr, addrLen);
3304         ],[
3305                 AC_MSG_RESULT(yes)
3306                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3307         ], [
3308                 AC_MSG_RESULT(no)
3309         ])
3311         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3312         AC_TRY_COMPILE([
3313                 #include <netinet/in.h>
3314                 #include <netinet/tcp.h>
3315         ], [
3316                 struct ipv6_mreq opt;
3317                 unsigned int index = 0;
3318                 opt.ipv6mr_interface = index;
3319         ],[
3320                 AC_MSG_RESULT(yes)
3321                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3322         ], [
3323                 AC_MSG_RESULT(no)
3324         ])
3326         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3327         AC_TRY_COMPILE([
3328                 #include <sys/inotify.h>
3329         ], [
3330                 intptr_t fd;
3331                 uint32_t wd;
3332                 int result = inotify_rm_watch(fd, wd);
3333         ],[
3334                 AC_MSG_RESULT(yes)
3335                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3336         ], [
3337                 AC_MSG_RESULT(no)
3338         ])
3340         CFLAGS="$ORIG_CFLAGS"
3342         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3343         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3344                 AC_MSG_RESULT(no)
3345         elif test "x$cross_compiling" = "xyes"; then
3346                 AC_MSG_RESULT(cross compiling, assuming yes)
3347                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3348         else
3349                 AC_TRY_RUN([
3350                         #include <sys/mman.h>
3351                         #include <fcntl.h>
3352                         #include <unistd.h>
3354                         int main ()
3355                         {
3356                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3357                                 if (fd == -1)
3358                                         return -1;
3360                                 shm_unlink("/mono_configure_shm_open");
3362                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3363                                 //       on at least the current version of Mac OS X
3365                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3366                                         return -1;
3368                                 return 0;
3369                         }
3370                 ],[
3371                         AC_MSG_RESULT(yes)
3372                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3373                 ], [
3374                         AC_MSG_RESULT(no)
3375                 ])
3376         fi
3378         AC_MSG_CHECKING(for getpriority with int who)
3379         AC_TRY_COMPILE([
3380                 #include <sys/resource.h>
3381         ], [
3382                 int which;
3383                 int who;
3384                 int result = getpriority(which, who);
3385         ],[
3386                 AC_MSG_RESULT(yes)
3387                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3388         ], [
3389                 AC_MSG_RESULT(no)
3390         ])
3392         AC_MSG_CHECKING(for kevent with int parameters)
3393         AC_TRY_COMPILE([
3394                 #include <sys/types.h>
3395                 #include <sys/event.h>
3396         ], [
3397                 int kg;
3398                 const struct kevent* chagelist;
3399                 int nchanges;
3400                 struct kevent* eventlist;
3401                 int nevents;
3402                 const struct timespec* timeout;
3403                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3404         ],[
3405                 AC_MSG_RESULT(yes)
3406                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3407         ], [
3408                 AC_MSG_RESULT(no)
3409         ])
3411         ORIG_CFLAGS="$CFLAGS"
3412         CFLAGS="-Werror -Wimplicit-function-declaration"
3414         AC_MSG_CHECKING(for mkstemps)
3415         AC_TRY_COMPILE([
3416                 #include <stdlib.h>
3417                 #include <unistd.h>
3418                 #include <string.h>
3419         ], [
3420                 char *template;
3421                 int suffixlen;
3422                 int result = mkstemps(template, suffixlen);
3423         ],[
3424                 AC_MSG_RESULT(yes)
3425                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3426                 have_mkstemps=yes
3427         ], [
3428                 AC_MSG_RESULT(no)
3429         ])
3431         CFLAGS="$ORIG_CFLAGS"
3433         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3434                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3435         fi
3437         AC_MSG_CHECKING(for tcp/var.h)
3438         AC_TRY_COMPILE([
3439                 #include <sys/types.h>
3440                 #include <sys/socketvar.h>
3441                 #include <netinet/ip.h>
3442                 #include <netinet/tcp.h>
3443                 #include <netinet/tcp_var.h>
3444         ], [
3445         ],[
3446                 AC_MSG_RESULT(yes)
3447                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3448         ], [
3449                 AC_MSG_RESULT(no)
3450         ])
3452         AC_CHECK_HEADERS([sys/cdefs.h])
3454         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3455         AC_TRY_COMPILE([
3456                 #ifdef HAVE_SYS_CDEFS_H
3457                 #include <sys/cdefs.h>
3458                 #endif
3459                 #include <netinet/tcp.h>
3460         ], [
3461                 int result = TCP_ESTABLISHED;
3462         ],[
3463                 AC_MSG_RESULT(yes)
3464                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3465         ], [
3466                 AC_MSG_RESULT(no)
3467         ])
3469         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3471         AC_MSG_CHECKING(for struct rt_msghdr)
3472         AC_TRY_COMPILE([
3473                 #include <sys/types.h>
3474                 #include <net/route.h>
3475         ], [
3476                 struct rt_msghdr;
3477         ],[
3478                 AC_MSG_RESULT(yes)
3479                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3480         ], [
3481                 AC_MSG_RESULT(no)
3482         ])
3484         AC_CHECK_HEADERS([sys/sysctl.h])
3485         AC_CHECK_HEADERS([linux/rtnetlink.h])
3487         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3488         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3489         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3491         ORIG_CFLAGS="$CFLAGS"
3492         CFLAGS="-Werror -Weverything"
3494         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3495         AC_TRY_COMPILE([
3496                 #include <unistd.h>
3497         ], [
3498                 size_t namelen = 20;
3499                 char name[20];
3500                 int result = getdomainname(name, namelen);
3501         ],[
3502                 AC_MSG_RESULT(yes)
3503                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3504         ], [
3505                 AC_MSG_RESULT(no)
3506         ])
3508         CFLAGS="$ORIG_CFLAGS"
3510         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3511         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3512         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3514         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
3515                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3516         elif test "x$host_linux" = "xyes"; then
3517                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3518         fi
3520         AC_CHECK_HEADERS([crt_externs.h])
3522         AC_MSG_CHECKING(for _NSGetEnviron)
3523         AC_TRY_COMPILE([
3524                 #include <crt_externs.h>
3525         ], [
3526                 char **result = *(_NSGetEnviron());
3527         ],[
3528                 AC_MSG_RESULT(yes)
3529                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3530         ], [
3531                 AC_MSG_RESULT(no)
3532         ])
3534         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3536 else
3537         dnl *********************************
3538         dnl *** Checks for Windows compilation ***
3539         dnl *********************************
3540         AC_CHECK_HEADERS(winternl.h)
3542         jdk_headers_found=no
3543         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3544         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3545         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3546         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3547         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3548         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3549         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3551         dnl *********************************
3552         dnl *** Check for struct ip_mreqn ***
3553         dnl *********************************
3554         AC_MSG_CHECKING(for struct ip_mreqn)
3555         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3556                 struct ip_mreqn mreq;
3557                 mreq.imr_address.s_addr = 0;
3558         ], [
3559                 # Yes, we have it...
3560                 AC_MSG_RESULT(yes)
3561                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3562         ], [
3563                 # We'll just have to try and use struct ip_mreq
3564                 AC_MSG_RESULT(no)
3565                 AC_MSG_CHECKING(for struct ip_mreq)
3566                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3567                         struct ip_mreq mreq;
3568                         mreq.imr_interface.s_addr = 0;
3569                 ], [
3570                         # Yes, we have it...
3571                         AC_MSG_RESULT(yes)
3572                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3573                 ], [
3574                         # No multicast support
3575                         AC_MSG_RESULT(no)
3576                 ])
3577         ])
3579         dnl **********************************
3580         dnl *** Check for getaddrinfo ***
3581         dnl **********************************
3582         AC_MSG_CHECKING(for getaddrinfo)
3583                 AC_TRY_LINK([
3584                 #include <stdio.h>
3585                 #include <winsock2.h>
3586                 #include <ws2tcpip.h>
3587         ], [
3588                 getaddrinfo(NULL,NULL,NULL,NULL);
3589         ], [
3590                 # Yes, we have it...
3591                 AC_MSG_RESULT(yes)
3592                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3593         ], [
3594                 AC_MSG_RESULT(no)
3595         ])
3597         dnl **********************************
3598         dnl *** Check for gethostbyname ***
3599         dnl **********************************
3600         AC_MSG_CHECKING(for gethostbyname)
3601                 AC_TRY_LINK([
3602                 #include <stdio.h>
3603                 #include <winsock2.h>
3604                 #include <ws2tcpip.h>
3605         ], [
3606                 gethostbyname(NULL);
3607         ], [
3608                 # Yes, we have it...
3609                 AC_MSG_RESULT(yes)
3610                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3611         ], [
3612                 AC_MSG_RESULT(no)
3613         ])
3615         dnl **********************************
3616         dnl *** Check for getprotobyname ***
3617         dnl **********************************
3618         AC_MSG_CHECKING(for getprotobyname)
3619                 AC_TRY_LINK([
3620                 #include <stdio.h>
3621                 #include <winsock2.h>
3622                 #include <ws2tcpip.h>
3623         ], [
3624                 getprotobyname(NULL);
3625         ], [
3626                 # Yes, we have it...
3627                 AC_MSG_RESULT(yes)
3628                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3629         ], [
3630                 AC_MSG_RESULT(no)
3631         ])
3633         dnl **********************************
3634         dnl *** Check for getnameinfo ***
3635         dnl **********************************
3636         AC_MSG_CHECKING(for getnameinfo)
3637                 AC_TRY_LINK([
3638                 #include <stdio.h>
3639                 #include <winsock2.h>
3640                 #include <ws2tcpip.h>
3641         ], [
3642                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3643         ], [
3644                 # Yes, we have it...
3645                 AC_MSG_RESULT(yes)
3646                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3647         ], [
3648                 AC_MSG_RESULT(no)
3649         ])
3651         dnl **********************************
3652         dnl *** Check for inet_ntop ***
3653         dnl **********************************
3654         AC_MSG_CHECKING(for inet_ntop)
3655                 AC_TRY_LINK([
3656                 #include <stdio.h>
3657                 #include <winsock2.h>
3658                 #include <ws2tcpip.h>
3659         ], [
3660                 inet_ntop (0, NULL, NULL, 0);
3661         ], [
3662                 # Yes, we have it...
3663                 AC_MSG_RESULT(yes)
3664                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3665         ], [
3666                 AC_MSG_RESULT(no)
3667         ])
3669         dnl **********************************
3670         dnl *** Check for inet_pton ***
3671         dnl **********************************
3672         AC_MSG_CHECKING(for inet_pton)
3673                 AC_TRY_LINK([
3674                 #include <stdio.h>
3675                 #include <winsock2.h>
3676                 #include <ws2tcpip.h>
3677         ], [
3678                 #ifndef inet_pton
3679                 (void) inet_pton;
3680                 #endif
3681                 inet_pton (0, NULL, NULL);
3682         ], [
3683                 # Yes, we have it...
3684                 AC_MSG_RESULT(yes)
3685                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3686         ], [
3687                 AC_MSG_RESULT(no)
3688         ])
3690         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3691         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3692         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3693         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3694         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3695         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3696         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3699 dnl socklen_t check
3700 AC_MSG_CHECKING(for socklen_t)
3701 AC_TRY_COMPILE([
3702 #include <sys/types.h>
3703 #include <sys/socket.h>
3705   socklen_t foo;
3707 ac_cv_c_socklen_t=yes
3708         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3709         AC_MSG_RESULT(yes)
3711         AC_MSG_RESULT(no)
3714 AC_CHECK_FUNCS(execvp)
3716 dnl ****************************
3717 dnl *** Look for /dev/random ***
3718 dnl ****************************
3720 AC_MSG_CHECKING([if usage of random device is requested])
3721 AC_ARG_ENABLE(dev-random,
3722 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3723 try_dev_random=$enableval, try_dev_random=yes)
3725 AC_MSG_RESULT($try_dev_random)
3727 case "{$build}" in
3729 dnl IBM i does not have /dev/random, use unblocking only
3731     *-*-os400*)
3732     NAME_DEV_RANDOM="/dev/urandom"
3733     ;;
3735 dnl Win32 does not have /dev/random, they have their own method...
3737     *-mingw*|*-*-cygwin*)
3738     ac_cv_have_dev_random=no
3739     ;;
3741 dnl Everywhere else, it's /dev/random
3743     *)
3744     NAME_DEV_RANDOM="/dev/random"
3745     ;;
3746 esac
3748 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3750 dnl Now check if the device actually exists
3752 if test "x$try_dev_random" = "xyes"; then
3753     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3754     [if test -r "$NAME_DEV_RANDOM" ; then
3755         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3756     if test "x$ac_cv_have_dev_random" = "xyes"; then
3757         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3758     fi
3759 else
3760     AC_MSG_CHECKING(for random device)
3761     ac_cv_have_dev_random=no
3762     AC_MSG_RESULT(has been disabled)
3765 if test "x$host_win32" = "xyes"; then
3766     AC_DEFINE(HAVE_CRYPT_RNG)
3769 if test "x$ac_cv_have_dev_random" = "xno" \
3770     && test "x$host_win32" = "xno"; then
3771     AC_MSG_WARN([[
3773 *** A system-provided entropy source was not found on this system.
3774 *** Because of this, the System.Security.Cryptography random number generator
3775 *** will throw a NotImplemented exception.
3777 *** If you are seeing this message, and you know your system DOES have an
3778 *** entropy collection in place, please report an issue on GitHub and
3779 *** provide information about the system and how to access the random device.
3781 *** Otherwise you can install either egd or prngd and set the environment
3782 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3783 ***]])
3786 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)
3788 AC_MSG_CHECKING([if big-arrays are to be enabled])
3789 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)
3790 if test "x$enable_big_arrays" = "xyes" ; then
3791     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3792         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3793     else
3794         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3795     fi
3797 AC_MSG_RESULT($enable_big_arrays)
3799 dnl **************
3800 dnl *** DTRACE ***
3801 dnl **************
3803 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3805 if test "x$enable_dtrace" = "xyes"; then
3806    if test "x$has_dtrace" = "xno"; then
3807           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3808    fi
3809    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3810    if test "x$DTRACE" = "xno"; then
3811           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3812           enable_dtrace=no
3813    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3814           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3815           enable_dtrace=no
3816    fi
3819 dtrace_g=no
3820 if test "x$enable_dtrace" = "xyes"; then
3821         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3822         DTRACEFLAGS=
3823         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3824                 case "$host" in
3825                         powerpc-*-darwin*)
3826                         DTRACEFLAGS="-arch ppc64"
3827                         ;;
3828                         i*86-*-darwin*)
3829                         DTRACEFLAGS="-arch x86_64"
3830                         ;;
3831                         *)
3832                         DTRACEFLAGS=-64
3833                         ;;
3834                 esac
3835         else
3836                 case "$host" in
3837                         powerpc-*-darwin*)
3838                         DTRACEFLAGS="-arch ppc"
3839                         ;;
3840                         i*86-*-darwin*)
3841                         DTRACEFLAGS="-arch i386"
3842                         ;;
3843                         *)
3844                         DTRACEFLAGS=-32
3845                         ;;
3846                 esac
3847         fi
3848         AC_SUBST(DTRACEFLAGS)
3849         case "$host" in
3850                 *-*-solaris*)
3851                 dtrace_g=yes
3852                 ;;
3853         esac
3854         AC_CHECK_HEADERS([sys/sdt.h])
3856 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3857 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3859 dnl **************************
3860 dnl *** AOT cross offsets  ***
3861 dnl **************************
3863 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3864     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3866 dnl **************
3867 dnl ***  LLVM  ***
3868 dnl **************
3870 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3871 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3872 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)
3873 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3874 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3876 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3878 if test "x$enable_llvm" = "xdefault"; then
3879    enable_llvm=$enable_llvm_default
3882 enable_llvm_msvc_only="no"
3883 if test "x$enable_llvm" = "xyes"; then
3884         if test "x$host_win32" = "xyes"; then
3885                 if test "x$cross_compiling" = "xno"; then
3886                         case "$target" in
3887                         x86_64*)
3888                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3889                                 enable_llvm_msvc_only="yes"
3890                                 ;;
3891                         i686*)
3892                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3893                                 ;;
3894                         esac
3895                 fi
3896                 if test "x$enable_loadedllvm" = "xyes"; then
3897                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3898                         enable_loadedllvm=no
3899                 fi
3900         fi
3903 internal_llvm="no"
3904 if test "x$enable_llvm" = "xyes"; then
3905         if test "x$with_llvm" != "x"; then
3906                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3907                 if test x$host_win32 = xyes; then
3908                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3909                 fi
3910                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3911                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3912                 fi
3913         else
3914                 if test x$host_win32 = xyes; then
3915                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3916                 else
3917                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3918                 fi
3919                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3920                         internal_llvm=yes
3921                 fi
3922         fi
3924         LLVM_CODEGEN_LIBS="x86codegen"
3925         case "$target" in
3926         arm*)
3927                 LLVM_CODEGEN_LIBS="armcodegen"
3928                 ;;
3929         aarch64*)
3930                 LLVM_CODEGEN_LIBS="aarch64codegen"
3931                 ;;
3932         powerpc*)
3933                 LLVM_CODEGEN_LIBS="powerpccodegen"
3934                 ;;
3935         esac
3936         if test "x$host" != "x$target"; then
3937                 # No need for jit libs
3938                 LLVM_CODEGEN_LIBS=
3939         fi
3941         AC_SUBST(LLVM_CODEGEN_LIBS)
3942         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3944         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3945                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3946                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3947         fi
3948         if test "x$enable_llvm_msvc_only" != "xyes"; then
3949                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3950         else
3951                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
3952         fi
3953 fi # ENABLE_LLVM
3955 # AC_DEFINE necessary for correct restore behavior on Linux
3956 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3957 if test "x$internal_llvm" != "xno"; then
3958         if test "x$enable_llvm_msvc_only" != "xyes"; then
3959                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3960         else
3961                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
3962         fi
3965 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3966 if test "x$enable_llvm_asserts" != "xno"; then
3967         if test "x$enable_llvm_msvc_only" != "xyes"; then
3968                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3969         else
3970                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
3971         fi
3974 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
3976 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
3977 if test "x$enable_loadedllvm" = "xyes"; then
3978         if test "x$enable_llvm_msvc_only" != "xyes"; then
3979                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3980         fi
3983 if test "x$enable_llvm" = "xyes"; then
3984         enable_llvm_runtime=yes
3987 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
3988 if test "x$enable_llvm_runtime" = "xyes"; then
3989         if test "x$enable_llvm_msvc_only" != "xyes"; then
3990                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3991         else
3992                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
3993         fi
3996 TARGET="unknown"
3997 ACCESS_UNALIGNED="yes"
3999 LIBC="libc.so.6"
4000 INTL="libc.so.6"
4001 SQLITE="libsqlite.so.0"
4002 SQLITE3="libsqlite3.so.0"
4003 X11="libX11.so"
4004 GDKX11="libgdk-x11-2.0.so.0"
4005 GTKX11="libgtk-x11-2.0.so.0"
4006 XINERAMA="libXinerama.so.1"
4008 sizeof_register="SIZEOF_VOID_P"
4010 jit_wanted=true
4011 boehm_supported=true
4012 BTLS_SUPPORTED=no
4013 BTLS_PLATFORM=
4015 case "$host" in
4016         wasm32*)
4017                 TARGET=WASM
4018                 arch_target=wasm
4019                 BTLS_SUPPORTED=no
4020                 ACCESS_UNALIGNED="no"
4021                 with_tls=pthread
4022                 target_wasm=yes
4023                 ;;
4024         mips*)
4025                 TARGET=MIPS;
4026                 arch_target=mips;
4027                 with_tls=pthread;
4028                 ACCESS_UNALIGNED="no"
4030                 AC_MSG_CHECKING(for mips n32)
4031                 AC_TRY_COMPILE([],[
4032                 #if _MIPS_SIM != _ABIN32
4033                 #error Not mips n32
4034                 #endif
4035                 ],[
4036                 AC_MSG_RESULT(yes)
4037                 sizeof_register=8
4038                 ],[
4039                 AC_MSG_RESULT(no)
4040                 ])
4041                 ;;
4042         i*86-*-*)
4043                 TARGET=X86;
4044                 arch_target=x86;
4045                 case $host_os in
4046                   solaris*)
4047                         LIBC="libc.so"
4048                         INTL="libintl.so"
4049                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4050                                 TARGET=AMD64
4051                                 arch_target=amd64
4052                         fi
4054                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4055                         # int astruct __attribute__ ((visibility ("hidden")));
4056                         # void foo ()
4057                         # {
4058                         #       void *p = &astruct;
4059                         # }
4060                         # gcc -fPIC --shared -o libfoo.so foo.c
4061                         # yields:
4062                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4063                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4064                         have_visibility_hidden=no
4065                         ;;
4066                   mingw*|cygwin*)
4067                         have_visibility_hidden=no
4068                         BTLS_SUPPORTED=no
4069                         BTLS_PLATFORM=i386
4070                         ;;
4071                   haiku*)
4072                         LIBC=libroot.so
4073                         ;;
4074                   linux*)
4075                         AOT_SUPPORTED="yes"
4076                         BTLS_SUPPORTED=yes
4077                         BTLS_PLATFORM=i386
4078                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4079                         ;;
4080                   darwin*)
4081                         AOT_SUPPORTED="yes"
4082                         BTLS_SUPPORTED=yes
4083                         BTLS_PLATFORM=i386
4084                         ;;
4085                   openbsd*|freebsd*|kfreebsd-gnu*)
4086                         AOT_SUPPORTED="yes"
4087                         BTLS_SUPPORTED=yes
4088                         BTLS_PLATFORM=i386
4089                         ;;
4090                 esac
4091                 ;;
4092         x86_64-*-* | amd64-*-*)
4093                 TARGET=AMD64;
4094                 arch_target=amd64;
4095                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4096                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4097                         sizeof_register=8
4098                 fi
4099                 case $host_os in
4100                   linux*)
4101                         AOT_SUPPORTED="yes"
4102                         BTLS_SUPPORTED=yes
4103                         BTLS_PLATFORM=x86_64
4104                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4105                         ;;
4106                   darwin*)
4107                         AOT_SUPPORTED="yes"
4108                         BTLS_SUPPORTED=yes
4109                         BTLS_PLATFORM=x86_64
4110                         boehm_supported=false
4111                         ;;
4112                   openbsd*|freebsd*|kfreebsd-gnu*)
4113                         AOT_SUPPORTED="yes"
4114                         BTLS_SUPPORTED=yes
4115                         BTLS_PLATFORM=x86_64
4116                         ;;
4117                   mingw*|cygwin*)
4118                         BTLS_SUPPORTED=no
4119                         BTLS_PLATFORM=x86_64
4120                         ;;
4121                 esac
4122                 ;;
4123         sparc*-*-*)
4124                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4125                    TARGET=SPARC64
4126                 else
4127                         TARGET=SPARC
4128                 fi
4129                 arch_target=sparc;
4130                 ACCESS_UNALIGNED="no"
4131                 case $host_os in
4132                   linux*) ;;
4133                   *)
4134                         LIBC="libc.so"
4135                         INTL="libintl.so"
4136                 esac
4137                 if test x"$GCC" = xyes; then
4138                         # We don't support v8 cpus
4139                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4140                 fi
4141                 if test x"$AR" = xfalse; then
4142                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4143                 fi
4144                 ;;
4145         *-mingw*|*-*-cygwin*)
4146                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4147                 have_visibility_hidden=no
4148                 INTL="intl"
4149                 case "$host" in
4150                         x86_64*mingw*)
4151                                 # Old Boehm fails to compile for x86_64-mingw.
4152                                 # It is trivial to fix, but just silently drop it.
4153                                 boehm_supported=false
4154                                 ;;
4155                 esac
4156                 ;;
4157         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4158         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4159         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4160                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4161                         TARGET=POWERPC64;
4162                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4163                         if ! (echo $CC | grep -q -- 'clang'); then
4164                                 CFLAGS="$CFLAGS -mminimal-toc"
4165                         fi
4166                 else
4167                         TARGET=POWERPC;
4168                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4169                 fi
4170                 arch_target=ppc;
4171                 case $host_os in
4172                   aix*|os400*)
4173                         BTLS_SUPPORTED=yes
4174                         BTLS_PLATFORM=powerpc
4175                         dnl on AIX/PASE, shared libraries can be inside archives
4176                         dnl if they are, we specify them by lib.a(lib.so)
4177                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4178                         LIBC="libc.a(shr_64.o)"
4179                         INTL="libintl.a(libintl.so.8)"
4180                         ;;
4181                   linux*)
4182                         BTLS_SUPPORTED=yes
4183                         BTLS_PLATFORM=powerpc
4184                         ;;
4185                 esac
4186                 ;;
4187         armv7k-*-darwin*)
4188                 TARGET=ARM;
4189                 TARGET_SYS=WATCHOS
4190                 arch_target=arm;
4191                 arm_fpu=VFP_HARD
4192                 ACCESS_UNALIGNED="no"
4193                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4194                 ;;
4196         arm*-darwin*)
4197                 TARGET=ARM;
4198                 arch_target=arm;
4199                 ACCESS_UNALIGNED="no"
4200                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4201                 ;;
4202         arm*-linux*)
4203                 TARGET=ARM;
4204                 arch_target=arm;
4205                 ACCESS_UNALIGNED="no"
4206                 AOT_SUPPORTED="yes"
4207                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4208                 BTLS_SUPPORTED=yes
4209                 BTLS_PLATFORM=arm
4210                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4211                 case "$target" in
4212                 arm*-linux*-gnueabi)
4213                         BTLS_PLATFORM=armsoft
4214                         ;;
4215                 esac
4216                 ;;
4217         arm*-netbsd*-eabi*)
4218                 TARGET=ARM;
4219                 arch_target=arm;
4220                 ACCESS_UNALIGNED="no"
4221                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4222                 ;;
4223         aarch64-*darwin*ilp32)
4224                 TARGET=ARM64;
4225                 arch_target=arm64
4226                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4227                 sizeof_register=8
4228                 # assuming no other target other than watchOS is using aarch64*darwin triple
4229                 TARGET_SYS=WATCHOS
4230                 ;;
4231         aarch64-*)
4232                 # https://lkml.org/lkml/2012/7/15/133
4233                 TARGET=ARM64
4234                 arch_target=arm64
4235                 boehm_supported=false
4236                 AOT_SUPPORTED="yes"
4237                 BTLS_SUPPORTED=yes
4238                 BTLS_PLATFORM=aarch64
4239                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4240                 ;;
4241         s390x-*-linux*)
4242                 TARGET=S390X;
4243                 arch_target=s390x;
4244                 ACCESS_UNALIGNED="yes"
4245                 BTLS_SUPPORTED=yes
4246                 BTLS_PLATFORM=s390x
4247                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4248                 ;;
4249         riscv32-*)
4250                 TARGET=RISCV32
4251                 ACCESS_UNALIGNED=no
4252                 AOT_SUPPORTED=no
4253                 BTLS_SUPPORTED=yes
4254                 BTLS_PLATFORM=riscv32
4255                 arch_target=riscv32
4256                 boehm_supported=false
4257                 ;;
4258         riscv64*)
4259                 TARGET=RISCV64
4260                 ACCESS_UNALIGNED=no
4261                 AOT_SUPPORTED=no
4262                 BTLS_SUPPORTED=yes
4263                 BTLS_PLATFORM=riscv64
4264                 arch_target=riscv64
4265                 boehm_supported=false
4266                 ;;
4267 esac
4269 HOST=$TARGET
4271 if test "x$host" != "x$target"; then
4272    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4273    enable_mcs_build=no
4274    enable_support_build=no
4275    BTLS_SUPPORTED=no
4276    # Can't use tls, since it depends on the runtime detection of tls offsets
4277    # in mono-compiler.h
4278    with_tls=pthread
4279    target_mach=no
4280    case "$target" in
4281    wasm32*)
4282                 TARGET=WASM
4283                 arch_target=wasm
4284                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4285                 ;;
4286    arm*-darwin*)
4287                 TARGET=ARM;
4288                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4289                 case "$target" in
4290                 armv7k-*)
4291                         arm_fpu=VFP_HARD
4292                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4293                         ;;
4294                 esac            
4295                 ;;
4296    powerpc64-ps3-linux-gnu)
4297                 TARGET=POWERPC64
4298                 arch_target=powerpc64
4299                 AC_DEFINE(TARGET_PS3, 1, [...])
4300                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4301                 # uses this define
4302                 AC_DEFINE(__mono_ppc64__, 1, [...])
4303                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4304                 sizeof_register=8
4305                 target_byte_order=G_BIG_ENDIAN
4306                 ;;
4307    powerpc64-xbox360-linux-gnu)
4308                 TARGET=POWERPC64
4309                 arch_target=powerpc64
4310                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4311                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4312                 # uses this define
4313                 sizeof_register=8
4314                 target_byte_order=G_BIG_ENDIAN
4315                 ;;
4316    arm*-linux-*)
4317                 TARGET=ARM;
4318                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4319                 ;;
4320    arm*-netbsd*-eabi*)
4321                 TARGET=ARM;
4322                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4323                 ;;
4324    i686*-linux-*)
4325                 TARGET=X86;
4326                 ;;
4327    i*86-apple-*)
4328                 TARGET=X86;
4329                 ;;
4330    x86_64*-linux-*)
4331                 TARGET=AMD64;
4332                 ;;
4333    x86_64-ps4-freebsd)
4334                 TARGET=AMD64;
4335                 AC_DEFINE(TARGET_PS4, 1, [...])
4336                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4337                 CPPFLAGS="$CPPFLAGS"
4338                 target_win32=no
4339                 ;;
4340    aarch64*-linux-*)
4341                 TARGET=ARM64;
4342                 ;;
4343         aarch64-*)
4344                 TARGET=ARM64
4345                 ;;
4346         riscv32*)
4347                 TARGET=RISCV32
4348                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4349                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4350                 arch_target=riscv32
4351                 target_mach=no
4352                 with_tls=pthread
4353                 ;;
4354         riscv64*)
4355                 TARGET=RISCV64
4356                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4357                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4358                 arch_target=riscv64
4359                 target_mach=no
4360                 with_tls=pthread
4361                 ;;
4362         *)
4363                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4364         esac
4366         case "$target" in
4367         *-darwin*)
4368                 target_mach=yes
4369                 ;;
4370         *-linux-android*)
4371                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4372                 ;;
4373         esac
4376 case "$TARGET" in
4377 WASM)
4378         AC_DEFINE(TARGET_WASM, 1, [...])
4379         arch_target=wasm
4380         ;;
4381 X86)
4382         AC_DEFINE(TARGET_X86, 1, [...])
4383         arch_target=x86
4384         ;;
4385 AMD64)
4386         AC_DEFINE(TARGET_AMD64, 1, [...])
4387         arch_target=amd64
4388         ;;
4389 ARM)
4390         AC_DEFINE(TARGET_ARM, 1, [...])
4391         arch_target=arm
4392         ACCESS_UNALIGNED="no"
4393         ;;
4394 ARM64)
4395         AC_DEFINE(TARGET_ARM64, 1, [...])
4396         arch_target=arm64
4397         ;;
4398 POWERPC)
4399         AC_DEFINE(TARGET_POWERPC, 1, [...])
4400         ;;
4401 POWERPC64)
4402         AC_DEFINE(TARGET_POWERPC, 1, [...])
4403         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4404         ;;
4405 S390X)
4406         AC_DEFINE(TARGET_S390X, 1, [...])
4407         ;;
4408 MIPS)
4409         AC_DEFINE(TARGET_MIPS, 1, [...])
4410         ;;
4411 SPARC)
4412         AC_DEFINE(TARGET_SPARC, 1, [...])
4413         ;;
4414 SPARC64)
4415         AC_DEFINE(TARGET_SPARC64, 1, [...])
4416         ;;
4417 RISCV32)
4418         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4419         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4420         ;;
4421 RISCV64)
4422         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4423         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4424         ;;
4425 esac
4427 case "$TARGET" in
4428 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4429     target_sizeof_void_p=4
4430     ;;
4431 *64* | S390X)
4432     target_sizeof_void_p=8
4433     ;;
4435     AC_MSG_ERROR([unknown target])
4436     ;;
4437 esac
4439 case "$HOST" in
4440 WASM)
4441         AC_DEFINE(HOST_WASM, 1, [...])
4442         ;;
4443 X86)
4444         AC_DEFINE(HOST_X86, 1, [...])
4445         ;;
4446 AMD64)
4447         AC_DEFINE(HOST_AMD64, 1, [...])
4448         ;;
4449 ARM)
4450         AC_DEFINE(HOST_ARM, 1, [...])
4451         ;;
4452 ARM64)
4453         AC_DEFINE(HOST_ARM64, 1, [...])
4454         ;;
4455 POWERPC)
4456         AC_DEFINE(HOST_POWERPC, 1, [...])
4457         ;;
4458 POWERPC64)
4459         AC_DEFINE(HOST_POWERPC, 1, [...])
4460         AC_DEFINE(HOST_POWERPC64, 1, [...])
4461         ;;
4462 S390X)
4463         AC_DEFINE(HOST_S390X, 1, [...])
4464         ;;
4465 MIPS)
4466         AC_DEFINE(HOST_MIPS, 1, [...])
4467         ;;
4468 SPARC)
4469         AC_DEFINE(HOST_SPARC, 1, [...])
4470         ;;
4471 SPARC64)
4472         AC_DEFINE(HOST_SPARC64, 1, [...])
4473         ;;
4474 RISCV32)
4475         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4476         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4477         ;;
4478 RISCV64)
4479         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4480         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4481         ;;
4482 esac
4484 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4485 case "$HOST" in
4486 X86 | AMD64 | ARM | ARM64)
4487         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4488         ;;
4489 esac
4491 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4492 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4494 dnl *************
4495 dnl *** VTUNE ***
4496 dnl *************
4498 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4499 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4501 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4503 if test "x$enable_vtune" = "xyes"; then
4504         if test "x$with_vtune" = "x"; then
4505                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4506         else
4507                 VTUNE_PATH=$with_vtune
4508         fi
4509         VTUNE_INCLUDE=$VTUNE_PATH/include
4510         case "$TARGET" in
4511         X86)
4512                 VTUNE_LIB=$VTUNE_PATH/lib32
4513                 ;;
4514         AMD64)
4515                 VTUNE_LIB=$VTUNE_PATH/lib64
4516                 ;;
4517         *)
4518                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4519                 ;;
4520         esac
4521         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4522                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4523         fi
4524         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4525                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4526         fi
4528         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4529         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4531         AC_SUBST(VTUNE_LIBS)
4532         AC_SUBST(VTUNE_CFLAGS)
4534 dnl Use GCC atomic ops if they work on the target.
4535 if test x$GCC = "xyes"; then
4536         case $TARGET in
4537         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4538                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4539                 ;;
4540         esac
4543 if test "x$target_mach" = "xyes"; then
4545    if test "x$TARGET_SYS" = "xWATCHOS"; then
4546           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4547           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4548           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4549           BTLS_SUPPORTED=no
4550    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4551           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4552           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4553           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4554           BTLS_SUPPORTED=no
4555           target_ios=yes
4556    else
4557        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4558        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4559        #error fail this for ios
4560        #endif
4561        ], [
4562                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4563           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4564           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4565           target_osx=yes
4566        ], [
4567           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4568           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4569           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4570           BTLS_SUPPORTED=no
4571                   target_ios=yes
4572        ])
4573         fi
4574    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4577 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4579 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4581 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4582    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4583 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4584    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4585 else
4586    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4589 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4591 if test "x$sizeof_register" = "x4"; then
4592   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4593 elif test "x$sizeof_register" = "x8"; then
4594   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4595 else
4596   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4599 if test "x$have_visibility_hidden" = "xyes"; then
4600    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4603 if test "x$have_deprecated" = "xyes"; then
4604    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4607 dnl 
4608 dnl Simple Generational checks (sgen)
4610 SGEN_DEFINES=
4611 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4612 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4613 if test x$buildsgen = xyes; then
4614    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4615    SGEN_DEFINES="-DHAVE_SGEN_GC"
4617         conc_gc_msg=""
4618    if test x$with_sgen_default_concurrent != xno; then
4619        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4620            conc_gc_msg=" (concurrent by default)"
4621    fi
4623    if test "x$gc_msg" = "x"; then
4624       gc_msg="sgen$conc_gc_msg"
4625    else
4626       gc_msg="sgen$conc_gc_msg and $gc_msg"
4627    fi
4629 AC_SUBST(SGEN_DEFINES)
4630 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4632 jit_status="Building and using the JIT"
4634 libsuffix=".so"
4636 case "$host" in
4637      *-*-darwin*)
4638         libsuffix=".dylib"
4639         LIBC="libc.dylib"
4640         INTL="libintl.dylib"
4641         SQLITE="libsqlite.0.dylib"
4642         SQLITE3="libsqlite3.0.dylib"
4643         X11="libX11.dylib"
4644         GDKX11="libgdk-x11-2.0.dylib"
4645         GTKX11="libgtk-x11-2.0.dylib"
4646         ;;
4647      *-*-*netbsd*)
4648         LIBC="libc.so"
4649         INTL="libintl.so"
4650         SQLITE="libsqlite.so"
4651         SQLITE3="libsqlite3.so"
4652         ;;
4653      *-*-kfreebsd*-gnu)
4654         LIBC="libc.so.0.1"
4655         INTL="libc.so.0.1"
4656         X11="libX11.so.6"
4657         ;;
4658     *-*-*freebsd*)
4659         LIBC="libc.so.7"
4660         INTL="libintl.so"
4661         SQLITE="libsqlite.so"
4662         SQLITE3="libsqlite3.so"
4663         ;;
4664     *-*-*openbsd*)
4665         LIBC="libc.so"
4666         INTL="libintl.so"
4667         SQLITE="libsqlite.so"
4668         SQLITE3="libsqlite3.so"
4669         ;;
4670     *-*-*linux*)
4671         AC_PATH_X
4672         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4673         AC_MSG_CHECKING(for the soname of libX11.so)
4674         for i in $x_libraries $dlsearch_path; do
4675                 for r in 4 5 6; do
4676                         if test -f $i/libX11.so.$r; then
4677                                 X11=libX11.so.$r
4678                                 AC_MSG_RESULT($X11)
4679                         fi
4680                 done
4681         done
4682         
4683         if test "x$X11" = "xlibX11.so"; then
4684                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4685                 X11=libX11.so.6
4686         fi
4687         ;;
4688 esac
4690 AC_SUBST(libsuffix)
4692 ######################################
4693 # EGLIB CHECKS
4694 ######################################
4696 GNUC_PRETTY=
4697 GNUC_UNUSED=
4698 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4699 if test x$GCC = xyes; then
4700    GNUC_UNUSED='__attribute__((__unused__))'
4701    GNUC_NORETURN='__attribute__((__noreturn__))'
4702    case $host_cpu in
4703      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4704    esac
4706 AC_SUBST(GNUC_PRETTY)
4707 AC_SUBST(GNUC_UNUSED)
4708 AC_SUBST(GNUC_NORETURN)
4709 AC_SUBST(BREAKPOINT)
4711 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4713 case $host in
4714 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4715     PATHSEP='\\'
4716     SEARCHSEP=';'
4717     OS="WIN32"
4718     PIDTYPE='void *'
4719     ;;
4721     PATHSEP='/'
4722     SEARCHSEP=':'
4723     OS="UNIX"
4724     PIDTYPE='int'
4725     ;;
4726 esac
4728 case $host in
4729         *-*-solaris*)
4730         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4731         ;;
4732 esac
4734 case $target in
4735 arm*-darwin*|aarch64*-*|riscv*)
4736     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4737     ;;
4738 i*86-*-darwin*)
4739     ORDER=G_LITTLE_ENDIAN
4740     ;;
4741 *-*-haiku*)
4742     LDFLAGS="$LDFLAGS -ltextencoding"
4743     ;;
4744 *-*-openbsd*)
4745     CFLAGS="$CFLAGS -pthread"
4746     LDFLAGS="$LDFLAGS -pthread"
4747     ;;
4748 esac
4750 AC_SUBST(ORDER)
4751 AC_SUBST(CFLAGS)
4752 AC_SUBST(PATHSEP)
4753 AC_SUBST(SEARCHSEP)
4754 AC_SUBST(OS)
4755 AC_SUBST(PIDTYPE)
4757 # Defined for all targets/platforms using classic Windows API support.
4758 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4759 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4761 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4762 AC_CHECK_FUNCS(getrlimit)
4763 AC_CHECK_FUNCS(fork execv execve)
4764 AC_CHECK_FUNCS(waitpid)
4766 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4768 if test x$with_overridable_allocators = xyes; then
4769         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4770   AC_MSG_NOTICE([Overridable allocator support enabled])
4771 else
4772   AC_MSG_NOTICE([Overridable allocator support disabled])
4776 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4777 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4778 # removed once support for 10.6 is dropped.
4780 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4782 if test x$target_osx = xyes; then
4783 AC_CHECK_FUNCS(getpwuid_r)
4784 elif test x$target_ios = xno; then
4785 AC_CHECK_FUNCS(strndup getpwuid_r)
4788 AC_SEARCH_LIBS(sqrtf, m)
4790 # nanosleep may not be part of libc, also search it in other libraries
4791 AC_SEARCH_LIBS(nanosleep, rt)
4793 AC_SEARCH_LIBS(dlopen, dl)
4794 old_ldflags="${LDFLAGS}"
4795 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4796 if test $lt_cv_prog_gnu_ld = yes; then
4797         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4798 else
4799         case $host in
4800         *-*-aix*|*-*-os400*)
4801                 ;;
4802         *)
4803                 dnl Try to use export-dynamic anyways
4804                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4805                 ;;
4806         esac
4808 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4809 if test $found_export_dynamic = no; then
4810         LDFLAGS="${old_ldflags}"
4813 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4814 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4815 AC_CHECK_LIB(iconv, iconv_open)
4816 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4817 AC_SUBST(HAVE_ALLOCA_H)
4819 # Get the exact type of size_t, not just its size.
4820 # This is so we can find an exact printf format among u, lu, llu, I64u.
4821 # To avoid warnings about slight mismatches.
4822 # C99 runtime "zu" dependency is being avoided here.
4824 # We have to compile as C++ because C is too lenient
4825 # and lets the wrong thing compile, with warnings.
4827 # Note: "zu" or ifdef <something> have the advantage
4828 # of producing installable "biarch" headers. i.e. one Mac header
4829 # for Mac/x86 and Mac/amd64.
4831 AC_LANG_PUSH(C++)
4833 # Check long before int because it is the overwhelming Unix answer,
4834 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4836 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4838 AC_MSG_CHECKING(if size_t is unsigned long)
4839 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4840         #include <stddef.h>
4841         unsigned long *a = (size_t*)0;
4842 ])], [
4843         AC_MSG_RESULT(yes)
4844         AC_SUBST(GSIZE_FORMAT, '"lu"')
4845 ], [
4846         AC_MSG_RESULT(no)
4847         AC_MSG_CHECKING(if size_t is unsigned int)
4848         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4849                 #include <stddef.h>
4850                 unsigned *a = (size_t*)0;
4851         ])], [
4852                 AC_MSG_RESULT(yes)
4853                 AC_SUBST(GSIZE_FORMAT, '"u"')
4854         ], [
4855 # At this point the majority of systems have their answer,
4856 # and we descend into non-standard or new-standard territory.
4858 # Check __int64 first because I64 on some systems predates ll, enabling
4859 # new compiler/old runtime interop, and the types always have the same size.
4860                 AC_MSG_RESULT(no)
4861                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4862                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4863                         #include <stddef.h>
4864                         unsigned __int64 *a = (size_t*)0;
4865                 ])], [
4866                         AC_MSG_RESULT(yes)
4867                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4868                 ], [
4869                         AC_MSG_RESULT(no)
4870                         AC_MSG_CHECKING(if size_t is unsigned long long)
4871                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4872                                 #include <stddef.h>
4873                                 unsigned long long *a = (size_t*)0;
4874                         ])], [
4875                                 AC_MSG_RESULT(yes)
4876                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4877                         ], [
4878                                 AC_MSG_RESULT(no)
4879                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4880                         ] )
4881                 ] )
4882         ] )
4883 ] )
4885 AC_LANG_POP
4887 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4888 # This provides for an exact match with functions that
4889 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4890 # uintptr_t is not necessarily the same.
4892 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4893 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4895 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4896    GSIZE="size_t"
4897    GSSIZE="ptrdiff_t"
4898 else
4899    GSIZE="uintptr_t"
4900    GSSIZE="intptr_t"
4903 AC_SUBST(GSIZE)
4904 AC_SUBST(GSSIZE)
4905 AC_SUBST(GSIZE_FORMAT)
4908 # END OF EGLIB CHECKS
4911 AC_ARG_WITH([libgdiplus],
4912         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4913         [], [with_libgdiplus=installed])
4915 # default install location
4916 libgdiplus_install_loc=libgdiplus${libsuffix}
4917 case "$host" in
4918     *-*-*linux*)
4919     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4920     ;;
4921 esac
4923 case $with_libgdiplus in
4924     no)
4925     libgdiplus_loc=
4926     ;;
4928     installed)
4929     libgdiplus_loc=
4930     if test x$cross_compiling = xno; then
4931         if test x$host_darwin = xyes; then
4932             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4933             if test -x $a; then
4934               libgdiplus_install_loc=$a
4935               libgdiplus_loc=$a
4936             fi
4937         fi
4938     fi
4939     ;;
4941     yes|sibling)
4942     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4943     ;;
4945     /*) # absolute path, assume it is an install location
4946     libgdiplus_loc=$with_libgdiplus
4947     libgdiplus_install_loc=$with_libgdiplus
4948     ;;
4950     *)
4951     libgdiplus_loc=`pwd`/$with_libgdiplus
4952     ;;
4953 esac
4954 AC_SUBST(libgdiplus_loc)
4955 AC_SUBST(libgdiplus_install_loc)
4957 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)
4958 if test "x$icall_symbol_map" = "xyes"; then
4959    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4962 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4963 if test "x$icall_export" = "xyes"; then
4964    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4967 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4968 if test "x$icall_tables" = "xno"; then
4969    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4972 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4974 if test "x$with_tls" = "x__thread"; then
4975         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4976         # Pass the information to libgc
4977         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4978         AC_MSG_CHECKING(if the tls_model attribute is supported)
4979         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4980                 ], [
4981                         AC_MSG_RESULT(yes)
4982                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4983                 ], [
4984                         AC_MSG_RESULT(no)
4985         ])
4988 if test ${TARGET} = ARM; then
4989         dnl ******************************************
4990         dnl *** Check to see what FPU is available ***
4991         dnl ******************************************
4992         AC_MSG_CHECKING(which FPU to use)
4994         #
4995         # This is a bit tricky:
4996         #
4997         # if (__ARM_PCS_VFP) {
4998         #       /* mfloat-abi=hard == VFP with hard ABI */
4999         # } elif (!__SOFTFP__) {
5000         #       /* mfloat-abi=softfp == VFP with soft ABI */
5001         # } else {
5002         #       /* mfloat-abi=soft == no VFP */
5003         # }
5004         #
5005         # The exception is iOS (w/ GCC) where none of the above
5006         # are defined (but iOS always uses the 'softfp' ABI).
5007         #
5008         # No support for FPA.
5009         #
5011         fpu=NONE
5013         # iOS GCC always uses the 'softfp' ABI.
5014         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5015                 fpu=VFP
5016         fi
5018         # Are we using the 'hard' ABI?
5019         if test x$fpu = xNONE; then
5020                 AC_TRY_COMPILE([], [
5021                         #ifndef __ARM_PCS_VFP
5022                         #error "Float ABI is not 'hard'"
5023                         #endif
5024                 ], [
5025                         fpu=VFP_HARD
5026                 ], [
5027                         fpu=NONE
5028                 ])
5029         fi
5031         # No 'hard' ABI. 'soft' or 'softfp'?
5032         if test x$fpu = xNONE; then
5033                 AC_TRY_COMPILE([], [
5034                         #ifdef __SOFTFP__
5035                         #error "Float ABI is not 'softfp'"
5036                         #endif
5037                 ], [
5038                         fpu=VFP
5039                 ], [
5040                         fpu=NONE
5041                 ])
5042         fi
5044         if test x$arm_fpu != x; then
5045            fpu=$arm_fpu
5046         fi
5048         AC_MSG_RESULT($fpu)
5049         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5050         unset fpu
5052         dnl *********************************************
5053         dnl *** Check which ARM version(s) we can use ***
5054         dnl *********************************************
5055         AC_MSG_CHECKING(which ARM version to use)
5057         AC_TRY_COMPILE([], [
5058                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5059                 #error Not on ARM v5.
5060                 #endif
5061         ], [
5062                 arm_v5=yes
5064                 arm_ver=ARMv5
5065         ], [])
5067         AC_TRY_COMPILE([], [
5068                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5069                 #error Not on ARM v6.
5070                 #endif
5071         ], [
5072                 arm_v5=yes
5073                 arm_v6=yes
5075                 arm_ver=ARMv6
5076         ], [])
5078         AC_TRY_COMPILE([], [
5079                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5080                 #error Not on ARM v7.
5081                 #endif
5082         ], [
5083                 arm_v5=yes
5084                 arm_v6=yes
5085                 arm_v7=yes
5087                 arm_ver=ARMv7
5088         ], [])
5090         AC_MSG_RESULT($arm_ver)
5092         if test x$arm_v5 = xyes; then
5093                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5094                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5095         fi
5097         if test x$arm_v6 = xyes; then
5098                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5099                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5100         fi
5102         if test x$arm_v7 = xyes; then
5103                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5104                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5105         fi
5108 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5109         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5111         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5113         if test x$fpabi = xauto; then
5114                 AC_TRY_COMPILE([], [
5115                         #ifdef __riscv_float_abi_double
5116                         #error "double"
5117                         #endif
5118                 ], [
5119                         fpabi=auto
5120                 ], [
5121                         fpabi=double
5122                 ])
5123         fi
5125         if test x$fpabi = xauto; then
5126                 AC_TRY_COMPILE([], [
5127                         #ifdef __riscv_float_abi_single
5128                         #error "single"
5129                         #endif
5130                 ], [
5131                         fpabi=auto
5132                 ], [
5133                         fpabi=single
5134                 ])
5135         fi
5137         if test x$fpabi = xauto; then
5138                 AC_TRY_COMPILE([], [
5139                         #ifdef __riscv_float_abi_soft
5140                         #error "soft"
5141                         #endif
5142                 ], [
5143                         fpabi=auto
5144                 ], [
5145                         fpabi=soft
5146                 ])
5147         fi
5149         case $fpabi in
5150         double)
5151                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5152                 AC_MSG_RESULT([double-precision])
5153                 ;;
5154         single)
5155                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5156                 AC_MSG_ERROR([single-precision, not supported])
5157                 ;;
5158         soft)
5159                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5160                 AC_MSG_RESULT([soft float])
5161                 ;;
5162         auto)
5163                 AC_MSG_ERROR([unknown])
5164                 ;;
5165         *)
5166                 AC_MSG_ERROR([invalid option: $fpabi])
5167                 ;;
5168         esac
5171 if test ${TARGET} = unknown; then
5172         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5173         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5176 if test "x$platform_android" = "xyes"; then
5177         case "x${TARGET}" in
5178         xARM)
5179                 case "x$arm_ver" in
5180                 xARMv5)
5181                         BTLS_SUPPORTED=yes
5182                         BTLS_PLATFORM=android-armv5
5183                         ;;
5184                 xARMv6)
5185                         BTLS_SUPPORTED=yes
5186                         BTLS_PLATFORM=android-armv6
5187                         ;;
5188                 xARMv7)
5189                         BTLS_SUPPORTED=yes
5190                         BTLS_PLATFORM=android-armv7
5191                         ;;
5192                 *)
5193                         BTLS_SUPPORTED=no
5194                         ;;
5195                 esac
5196                 ;;
5197         xARM64)
5198                 BTLS_SUPPORTED=yes
5199                 BTLS_PLATFORM=android-v8a
5200                 ;;
5201         xX86)
5202                 BTLS_SUPPORTED=yes
5203                 BTLS_PLATFORM=android-x86
5204                 ;;
5205         xAMD64)
5206                 BTLS_SUPPORTED=yes
5207                 BTLS_PLATFORM=android-x64
5208                 ;;
5209         *)
5210                 BTLS_SUPPORTED=no
5211                 ;;
5212         esac
5215 if test ${ACCESS_UNALIGNED} = no; then
5216         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5219 if test x$host_darwin = xyes; then
5220         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5221         AS_IF(
5222                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5223                 [AC_MSG_RESULT([no])],
5224                 [
5225                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5226                         AR_FLAGS="Scru"
5227                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5228                         AC_MSG_RESULT([yes])
5229                 ]
5230         )
5233 case "x$libgc" in
5234         xincluded)
5235                 # Pass CPPFLAGS to libgc configure
5236                 # We should use a separate variable for this to avoid passing useless and
5237                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5238                 # This should be executed late so we pick up the final version of CPPFLAGS
5239                 # The problem with this approach, is that during a reconfigure, the main
5240                 # configure scripts gets invoked with these arguments, so we use separate
5241                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5242                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5243                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5244                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5245                 fi
5246                 # Don't pass -finstrument-for-thread-suspension in, 
5247                 # if these are instrumented it will be very bad news 
5248                 # (infinite recursion, undefined parking behavior, etc)
5249                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5250                 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\""
5251                 if test "x$support_boehm" = "xyes"; then
5252                         AC_CONFIG_SUBDIRS(libgc)
5253                 fi
5254                 ;;
5255 esac
5257 MALLOC_MEMPOOLS=no
5258 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5259         if test x$with_malloc_mempools = xyes; then
5260                 MALLOC_MEMPOOLS=yes
5261                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5262         fi
5266 DISABLE_MCS_DOCS=default
5267 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5268         if test x$with_mcs_docs != xyes; then
5269                 DISABLE_MCS_DOCS=yes
5270         fi
5272 if test -n "$INSTALL_4_x_TRUE"; then :
5273         DISABLE_MCS_DOCS=yes
5275 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5276    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5279 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)],[
5280         if test x$with_lazy_gc_thread_creation != xno ; then
5281                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5282         fi
5283 ], [with_lazy_gc_thread_creation=no])
5285 dnl *****************************
5286 dnl *** Thread suspend policy ***
5287 dnl *****************************
5289 dnl Set a default hybrid or cooperative suspend on some platforms
5291 dnl Coop default is set by the bitcode preset.
5293 dnl If coop isn't on by default, maybe hybrid should be?
5294 if test x$enable_cooperative_suspend_default != xyes; then
5295         case $HOST in
5296         X86 | AMD64)
5297                 dnl Some host/target confusion, there's no host_osx (and
5298                 dnl host_darwin would be true on iOS not just macOS).
5299                 if test x$target_osx = xyes; then
5300                         enable_hybrid_suspend_default=yes
5301                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5302                         enable_hybrid_suspend_default=yes
5303                 fi
5304                 ;;
5305         esac
5308 dnl Now check if there were flags overriding the defaults
5310 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])
5311 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5313 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5314         enable_cooperative_suspend=$with_cooperative_gc
5317 if test x$enable_cooperative_suspend = xdefault; then
5318         enable_cooperative_suspend=$enable_cooperative_suspend_default
5321 if test x$enable_cooperative_suspend != xno; then
5322         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5325 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5327 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])
5329 if test x$enable_hybrid_suspend = xdefault; then
5330    enable_hybrid_suspend=$enable_hybrid_suspend_default
5333 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5334         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5337 if test x$enable_hybrid_suspend != xno ; then
5338         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5341 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5343 dnl End of thread suspend policy
5345 dnl ***************************
5346 dnl *** feature experiments ***
5347 dnl ***************************
5349 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5350 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5352         if test x$enable_experiment != x ; then
5353                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5354         fi
5355         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5356                 eval "mono_experiment_test_enable_$feature='yes'"
5357         done
5359         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5360                 eval "mono_experiment_test_enable_null='yes'"
5361                 true
5362         fi
5364         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5365                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5366         fi
5367 ],[])
5369 dnl **********************
5370 dnl *** checked builds ***
5371 dnl **********************
5373 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],[
5375         if test x$enable_checked_build != x ; then
5376                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5377         fi
5378         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5379                 eval "mono_checked_build_test_enable_$feature='yes'"
5380         done
5382         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5383                 eval "mono_checked_build_test_enable_gc='yes'"
5384                 eval "mono_checked_build_test_enable_metadata='yes'"
5385                 eval "mono_checked_build_test_enable_thread='yes'"
5386                 eval "mono_checked_build_test_enable_private_types='yes'"
5387                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5388         fi
5390         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5391                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5392         fi
5394         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5395                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5396         fi
5398         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5399                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5400         fi
5402         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5403                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5404         fi
5406         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5407                 # Required
5408                 with_overridable_allocators=yes
5409                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5411                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5412         fi
5413 ], [])
5415 dnl End of checked builds
5417 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5419 AC_CHECK_HEADER([malloc.h], 
5420                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5421                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5423 if test x"$GCC" = xyes; then
5424         # Implicit function declarations are not 64 bit safe
5425         # Do this late, since this causes lots of configure tests to fail
5426         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5427         # jay has a lot of implicit declarations
5428         JAY_CFLAGS="-Wno-implicit-function-declaration"
5431 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5432 # instead of libmono-static.a
5433 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5434    LIBMONO_LA=libmini-static.la
5435 else
5436    if test x$buildsgen = xyes; then
5437       LIBMONO_LA=libmonosgen-$API_VER.la
5438    else
5439       LIBMONO_LA=libmonoboehm-$API_VER.la
5440    fi
5442 AC_SUBST(LIBMONO_LA)
5444 dnl **************
5445 dnl ***  Btls  ***
5446 dnl **************
5448 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5449 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5450 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5451 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5452 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5453 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])
5455 if test "x$with_btls_android_api" = "x" ; then
5456         case "$BTLS_PLATFORM" in
5457                 android-armv5)
5458                         with_btls_android_api=16" ;;
5459                 android-armv6)
5460                         with_btls_android_api=16" ;;
5461                 android-armv7)
5462                         with_btls_android_api=16 ;;
5463                 android-v8a)
5464                         with_btls_android_api=21 ;;
5465                 android-x86)
5466                         with_btls_android_api=16 ;;
5467                 android-x64)
5468                         with_btls_android_api=21 ;;
5469         esac
5472 if test "x$enable_btls" = "xno"; then
5473    enable_btls_lib=no
5476 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5478 btls_android=no
5479 if test "x$enable_btls" = "xyes"; then
5480         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5481         if test "x$CMAKE" = "xno"; then
5482                 AC_MSG_ERROR("cmake not found")
5483         fi
5485         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5486         AC_SUBST(BTLS_ROOT)
5488         btls_arch=
5489         btls_cflags=
5490         BTLS_CMAKE_ARGS=
5492         if test "x$host_win32" = "xyes"; then
5493                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5494         fi
5496         case "$BTLS_PLATFORM" in
5497         i386)
5498                 btls_arch=i386
5499                 btls_cflags="-m32"
5500                 case $host_os in
5501                         darwin*)
5502                                 btls_cflags="$btls_cflags -arch i386"
5503                                 ;;
5504                         mingw*|cygwin*)
5505                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5506                                 if test "x$HAVE_YASM" != "xyes"; then
5507                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5508                                 fi
5509                                 ;;
5510                 esac
5511                 ;;
5512         x86_64)
5513                 btls_arch=x86_64
5514                 case $host_os in
5515                         mingw*|cygwin*)
5516                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5517                                 if test "x$HAVE_YASM" != "xyes"; then
5518                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5519                                 fi
5520                                 ;;
5521                 esac
5522                 ;;
5523         arm)
5524                 btls_arch=arm
5525                 btls_cflags="-DOPENSSL_NO_ASM=1"
5526                 ;;
5527         armsoft)
5528                 btls_arch=arm
5529                 btls_cflags="-DOPENSSL_NO_ASM=1"
5530                 ;;
5531         aarch64)
5532                 btls_arch=aarch64
5533                 btls_cflags="-march=armv8-a+crypto"
5534                 ;;
5535         s390x)
5536                 btls_arch=s390x
5537                 ;;
5538         powerpc)
5539                 btls_arch=powerpc
5540                 case $host_os in
5541                         aix*|os400*)
5542                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5543                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5544                 esac
5545                 ;;
5546         android-armv5)
5547                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5548                 ;;
5549         android-armv6)
5550                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5551                 ;;
5552         android-armv7)
5553                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5554                 ;;
5555         android-v8a)
5556                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5557                 ;;
5558         android-x86)
5559                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5560                 ;;
5561         android-x64)
5562                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5563                 ;;
5564         riscv32)
5565                 btls_arch=riscv32
5566                 ;;
5567         riscv64)
5568                 btls_arch=riscv64
5569                 ;;
5570         *)
5571                 AC_MSG_ERROR(Invalid BTLS platform)
5572         esac
5574         if test "x$platform_android" = "xyes"; then
5575                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5576                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5577                 fi
5579                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5580                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5581                 fi
5583                 btls_android=yes
5584                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5585                 if test "x$with_btls_android_ndk" != "x"; then
5586                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5587                 else
5588                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5589                 fi
5590         fi
5592         if test "x$btls_arch" != "x"; then
5593                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5594         fi
5596         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5597         AC_SUBST(BTLS_ARCH)
5598         AC_SUBST(BTLS_CFLAGS)
5599         AC_SUBST(BTLS_PLATFORM)
5600         AC_SUBST(BTLS_CMAKE_ARGS)
5602         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5603 else
5604         enable_btls=no
5607 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5609 if test x$DISABLE_MCS_DOCS = xyes; then
5610    docs_dir=""
5611 else
5612    docs_dir=docs
5614 AC_SUBST(docs_dir)
5616 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5617 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5618 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5620 libmono_ldflags="$libmono_ldflags $LIBS"
5622 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5623 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5624 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5625 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5626 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5627 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5628 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5629 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5630 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5631 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5632 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5633 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5634 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5635 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5636 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5637 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5638 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5639 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5640 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5641 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5642 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5643 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5644 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5645 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5647 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5649 AC_SUBST(LIBC)
5650 AC_SUBST(INTL)
5651 AC_SUBST(SQLITE)
5652 AC_SUBST(SQLITE3)
5653 AC_SUBST(X11)
5654 AC_SUBST(GDKX11)
5655 AC_SUBST(GTKX11)
5656 AC_SUBST(XINERAMA)
5657 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5658 AC_SUBST(arch_target)
5659 AC_SUBST(CFLAGS)
5660 AC_SUBST(CPPFLAGS)
5661 AC_SUBST(LDFLAGS)
5663 #This must always be defined when building the runtime
5664 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5666 mono_build_root=`pwd`
5667 AC_SUBST(mono_build_root)
5669 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5670 if test x$host_win32 = xno; then
5671         if test x$enable_msvc = xyes; then
5672                 echo "Error, --enable-msvc only supported for Windows builds."
5673                 exit 1
5674         fi
5676 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5678 if test "x$enable_msvc" = "xyes"; then
5679         if test "x$support_boehm" = "xyes"; then
5680                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5681                 exit 1
5682         fi
5683         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5684         if test "x$host_cpu" = "xi686"; then
5685                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5686                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5687                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5688         else
5689                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5690                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5691                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5692         fi
5693         AC_SUBST(mono_msvc_build_dir)
5694         AC_SUBST(mono_msvc_build_lib_dir)
5695         AC_SUBST(mono_msvc_build_bin_dir)
5696 else
5697         mono_runtime=mono/mini/mono
5700 AC_SUBST(mono_runtime)
5702 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5704 if test $csc_compiler = mcs; then
5705   CSC=$mcs_topdir/class/lib/build/mcs.exe
5706 else
5707   CSC=$CSC_LOCATION
5710 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5712 mono_cfg_root=$mono_build_root/runtime
5713 if test x$host_win32 = xyes; then
5714   if test "x$cross_compiling" = "xno"; then
5715     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5716     CSC=`cygpath -m -a $CSC`
5717     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5718   else
5719     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5720   fi
5721 else
5722   mono_cfg_dir=$mono_cfg_root/etc
5725 if test "x$platform_android" = "xyes"; then
5726   mono_cfg_dir=
5729 AC_SUBST(mono_cfg_dir)
5731 AC_SUBST(CSC)
5733 AC_CONFIG_FILES([po/mcs/Makefile.in])
5735 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5736 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5737 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5739 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5740 [   depth=../../../..
5741     case $srcdir in
5742     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5743     .) reldir=$depth ;;
5744     *) reldir=$depth/$srcdir ;;
5745     esac
5746     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5747     cd runtime/etc/mono/1.0
5748     rm -f machine.config
5749     $LN_S $reldir/data/net_1_1/machine.config machine.config
5750     cd $depth
5751 ],[LN_S='$LN_S'])
5753 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5754 [   depth=../../../..
5755     case $srcdir in
5756     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5757     .) reldir=$depth ;;
5758     *) reldir=$depth/$srcdir ;;
5759     esac
5760     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5761     cd runtime/etc/mono/2.0
5762     rm -f machine.config
5763     $LN_S $reldir/data/net_2_0/machine.config machine.config
5764     cd $depth
5765 ],[LN_S='$LN_S'])
5767 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5768 [   depth=../../../..
5769     case $srcdir in
5770     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5771     .) reldir=$depth ;;
5772     *) reldir=$depth/$srcdir ;;
5773     esac
5774     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5775     cd runtime/etc/mono/2.0
5776     rm -f web.config
5777     $LN_S $reldir/data/net_2_0/web.config web.config
5778     cd $depth
5779 ],[LN_S='$LN_S'])
5781 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5782 [   depth=../../..
5783     case $srcdir in
5784     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5785     .) reldir=$depth ;;
5786     *) reldir=$depth/$srcdir ;;
5787     esac
5788     $ac_aux_dir/install-sh -d runtime/etc/mono/
5789     cd runtime/etc/mono/
5790     rm -f browscap.ini
5791     $LN_S $reldir/data/browscap.ini browscap.ini
5792     cd $depth
5793 ],[LN_S='$LN_S'])
5795 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5796 [   depth=../../../../..
5797     case $srcdir in
5798     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5799     .) reldir=$depth ;;
5800     *) reldir=$depth/$srcdir ;;
5801     esac
5802     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5803     cd runtime/etc/mono/2.0/Browsers
5804     rm -f Compat.browser
5805     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5806     cd $depth
5807 ],[LN_S='$LN_S'])
5809 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5810 [   depth=../../../../..
5811     case $srcdir in
5812     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5813     .) reldir=$depth ;;
5814     *) reldir=$depth/$srcdir ;;
5815     esac
5816     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5817     cd runtime/etc/mono/4.0/Browsers
5818     rm -f Compat.browser
5819     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5820     cd $depth
5821 ],[LN_S='$LN_S'])
5823 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5824 [   depth=../../../../..
5825     case $srcdir in
5826     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5827     .) reldir=$depth ;;
5828     *) reldir=$depth/$srcdir ;;
5829     esac
5830     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5831     cd runtime/etc/mono/4.5/Browsers
5832     rm -f Compat.browser
5833     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5834     cd $depth
5835 ],[LN_S='$LN_S'])
5837 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5838 [   depth=../../../..
5839     case $srcdir in
5840     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5841     .) reldir=$depth ;;
5842     *) reldir=$depth/$srcdir ;;
5843     esac
5844     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5845     cd runtime/etc/mono/4.0
5846     rm -f machine.config
5847     $LN_S $reldir/data/net_4_0/machine.config machine.config
5848     cd $depth
5849 ],[LN_S='$LN_S'])
5851 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5852 [   depth=../../../..
5853     case $srcdir in
5854     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5855     .) reldir=$depth ;;
5856     *) reldir=$depth/$srcdir ;;
5857     esac
5858     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5859     cd runtime/etc/mono/4.0
5860     rm -f web.config
5861     $LN_S $reldir/data/net_4_0/web.config web.config
5862     cd $depth
5863 ],[LN_S='$LN_S'])
5865 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5866 [   depth=../../../..
5867     case $srcdir in
5868     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5869     .) reldir=$depth ;;
5870     *) reldir=$depth/$srcdir ;;
5871     esac
5872     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5873     cd runtime/etc/mono/4.5
5874     rm -f machine.config
5875     $LN_S $reldir/data/net_4_5/machine.config machine.config
5876     cd $depth
5877 ],[LN_S='$LN_S'])
5879 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5880 [   depth=../../../..
5881     case $srcdir in
5882     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5883     .) reldir=$depth ;;
5884     *) reldir=$depth/$srcdir ;;
5885     esac
5886     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5887     cd runtime/etc/mono/4.5
5888     rm -f web.config
5889     $LN_S $reldir/data/net_4_5/web.config web.config
5890     cd $depth
5891 ],[LN_S='$LN_S'])
5893 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])
5894 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])
5895 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5897 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5898 if test x"$GCC" = xyes -a "x$with_jemalloc" != "xyes"; then
5900         # incompatible-pointer-types requires gcc circa 5.x
5902         ORIG_CFLAGS=$CFLAGS
5903         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5904         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5905         AC_TRY_COMPILE([],[
5906         ], [
5907                 AC_MSG_RESULT(yes)
5908                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5909         ], [
5910                 AC_MSG_RESULT(no)
5911                 CFLAGS=$ORIG_CFLAGS
5912         ])
5914         CFLAGS="$CFLAGS -Werror=return-type"
5918 # Mono.Native Support
5919 # -------------------
5920 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5921 # It is built as a stand-alone shared library and not bundled with the runtime because we
5922 # may need to build two different versions of it.
5924 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5925 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5927 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5928 # implementation accordingly.  We build a single `libmono_native` shared library.
5930 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5932 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5933 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5934 # depending on platform.
5936 # We build two versions of the shared library:
5937 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5938 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5940 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5941 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5942 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5944 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5945 # to verify that it's the correct version of it.
5948 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5949 if test x$target_osx = xyes; then
5950         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5951         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5952         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5953         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5954         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5955         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5956         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5957         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5958         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5960         mono_native=yes
5961         MONO_NATIVE_PLATFORM=macos
5962         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5963         AC_MSG_CHECKING([Mono.Native support])
5964         AC_MSG_RESULT(macos)
5966         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5967                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5969         if test x$mono_native_compat = xyes; then
5970                 mono_native_compat=yes
5971                 mono_native_text="Mac OSX (compat+unified)"
5972                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5973                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5974                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5975                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5976         else
5977                 mono_native_compat=no
5978                 mono_native_text="Mac OSX"
5979         fi
5980 elif test x$mono_native_platform_ios = xyes; then
5981         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5983         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5984                 if test x$mono_native_ios_sim = xyes; then
5985                         mono_native_ios_target=ios-simulator
5986                         mono_native_text="iOS Simulator"
5987                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5988                 else
5989                         mono_native_ios_target=iphoneos
5990                         mono_native_text="iOS Device"
5991                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5992                 fi
5993                 mono_native_unified_version="10.0"
5994                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5995         ], [
5996                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5997                         if test x$mono_native_ios_sim = xyes; then
5998                                 mono_native_ios_target=tvos-simulator
5999                                 mono_native_text="AppleTV Simulator"
6000                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6001                         else
6002                                 mono_native_ios_target=tvos
6003                                 mono_native_text="AppleTV Device"
6004                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6005                         fi
6006                         mono_native_unified_version="10.0"
6007                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6008                 ], [
6009                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6010                                 if test x$mono_native_ios_sim = xyes; then
6011                                         mono_native_ios_target=watchos-simulator
6012                                         mono_native_text="Apple Watch Simulator"
6013                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6014                                 else
6015                                         mono_native_ios_target=watchos
6016                                         mono_native_text="Apple Watch Device"
6017                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6018                                 fi
6019                                 mono_native_unified_version="5.0"
6020                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6021                         ], [
6022                                 AC_MSG_ERROR([Unknown iOS Target])
6023                         ])
6024                 ])
6025         ])
6027         AC_MSG_CHECKING([Mono.Native support])
6028         AC_MSG_RESULT([$mono_native_ios_target])
6030         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6032         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6033         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
6035         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
6037         if test x$with_bitcode = xyes; then
6038                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6039                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6040         else
6041                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6042         fi
6044         if test x$enable_gss = xyes; then
6045                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6046         fi
6048         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
6049         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
6050         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
6051         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
6052         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
6053         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
6055         if test x$mono_native_compat = xyes; then
6056                 mono_native_text="$mono_native_text (compat+unified)"
6057                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
6058                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
6059                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6060                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6061         fi
6063         mono_native=yes
6064         MONO_NATIVE_PLATFORM=ios
6065 elif test x$host_linux = xyes; then
6066         mono_native_text="Linux"
6067         MONO_NATIVE_CC=$CC
6068         MONO_NATIVE_CXX=$CXX
6069         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6070         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6071         MONO_NATIVE_CFLAGS=$CFLAGS
6072         MONO_NATIVE_LDFLAGS=$LDFLAGS
6074         mono_native=yes
6075         mono_native_compat=no
6076         MONO_NATIVE_PLATFORM=linux
6077         AC_MSG_CHECKING([Mono.Native support])
6078         AC_MSG_RESULT(linux)
6080         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6081 elif test x$target_wasm = xyes; then
6082         mono_native_text="wasm"
6083         MONO_NATIVE_CC=$CC
6084         MONO_NATIVE_CXX=$CXX
6085         # The system.native code uses _WASM_ to check for wasm
6086         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6087         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6088         MONO_NATIVE_CFLAGS=$CFLAGS
6089         MONO_NATIVE_LDFLAGS=$LDFLAGS
6091         mono_native=yes
6092         mono_native_compat=no
6093         MONO_NATIVE_PLATFORM=linux
6094         AC_MSG_CHECKING([Mono.Native support])
6095         AC_MSG_RESULT(wasm)
6097         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6098 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6099         mono_native_text="AIX"
6100         MONO_NATIVE_CC=$CC
6101         MONO_NATIVE_CXX=$CXX
6102         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6103         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6104         MONO_NATIVE_CFLAGS=$CFLAGS
6105         MONO_NATIVE_LDFLAGS=$LDFLAGS
6107         mono_native=yes
6108         mono_native_compat=no
6109         MONO_NATIVE_PLATFORM=aix
6110         AC_MSG_CHECKING([Mono.Native support])
6111         AC_MSG_RESULT(aix)
6113         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6114 elif test x$platform_android = xyes; then
6115         mono_native_text="Android"
6116         MONO_NATIVE_CC=$CC
6117         MONO_NATIVE_CXX=$CXX
6118         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6119         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6120         MONO_NATIVE_CFLAGS=$CFLAGS
6121         MONO_NATIVE_LDFLAGS=$LDFLAGS
6123         mono_native=yes
6124         mono_native_compat=no
6125         MONO_NATIVE_PLATFORM=android
6126         AC_MSG_CHECKING([Mono.Native support])
6127         AC_MSG_RESULT(Android)
6129         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6130 else
6131         mono_native=no
6132         mono_native_text="no"
6133         AC_MSG_CHECKING([Mono.Native support])
6134         AC_MSG_RESULT(no)
6137 if test x$mono_native_compat = xyes; then
6138         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6139 else
6140         MONO_NATIVE_LIBRARY_NAME=libmono-native
6143 AC_SUBST(MONO_NATIVE_PLATFORM)
6144 AC_SUBST(MONO_NATIVE_CC)
6145 AC_SUBST(MONO_NATIVE_CXX)
6146 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6147 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6148 AC_SUBST(MONO_NATIVE_CFLAGS)
6149 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6150 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6151 AC_SUBST(MONO_NATIVE_LDFLAGS)
6152 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6153 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6154 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6155 AC_SUBST(MONO_NATIVE_LIBADD)
6157 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6158 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6159 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6160 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6161 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6162 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6163 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6165 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6166 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6167 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6168 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6169 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6171 ### C++ Linker selection
6173 # We have to lie to autotools, sometimes.
6175 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6176 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6177 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6178 # except if we're linking with LLVM which relies on it.
6180 # Explanation of the hack:
6182 # According to
6183 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6184 # automake chooses the linker that it used to compile a target based on the
6185 # _SOURCES for that target.  If the target is comprised of only C code, it
6186 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6187 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6188 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6190 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6191 # or libc++) linked in - even when Mono is written in C++, we take care not to
6192 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6193 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6194 # C++ linker - LLVM doesn't have the same restrictions.
6196 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6197 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6198 #  automake's autodetection and lets us use the linker that we want.
6200 if test "x$enable_llvm_runtime" = "xyes"; then
6201         AC_SUBST(MONO_CXXLD, [$CXX])
6202 else
6203         AC_SUBST(MONO_CXXLD, [$CC])
6206 # Update all submodules recursively to ensure everything is checked out
6207 (cd $srcdir && scripts/update_submodules.sh)
6209 AC_OUTPUT([
6210 Makefile
6211 mono-uninstalled.pc
6212 acceptance-tests/Makefile
6213 llvm/Makefile
6214 scripts/mono-find-provides
6215 scripts/mono-find-requires
6216 mk/Makefile
6217 mono/Makefile
6218 mono/btls/Makefile
6219 mono/native/Makefile
6220 mono/utils/Makefile
6221 mono/utils/jemalloc/Makefile
6222 mono/metadata/Makefile
6223 mono/dis/Makefile
6224 mono/cil/Makefile
6225 mono/arch/Makefile
6226 mono/arch/x86/Makefile
6227 mono/arch/amd64/Makefile
6228 mono/arch/ppc/Makefile
6229 mono/arch/sparc/Makefile
6230 mono/arch/s390x/Makefile
6231 mono/arch/arm/Makefile
6232 mono/arch/arm64/Makefile
6233 mono/arch/mips/Makefile
6234 mono/arch/riscv/Makefile
6235 mono/sgen/Makefile
6236 mono/native/platform-type.c
6237 mono/native/platform-type-compat.c
6238 mono/native/platform-type-unified.c
6239 mono/tests/Makefile
6240 mono/tests/assembly-load-reference/Makefile
6241 mono/tests/tests-config
6242 mono/tests/gc-descriptors/Makefile
6243 mono/tests/testing_gac/Makefile
6244 mono/tests/llvmonly-mixed/Makefile
6245 mono/unit-tests/Makefile
6246 mono/benchmark/Makefile
6247 mono/mini/Makefile
6248 mono/profiler/Makefile
6249 mono/eglib/Makefile
6250 mono/eglib/eglib-config.h
6251 mono/eglib/test/Makefile
6252 m4/Makefile
6253 ikvm-native/Makefile
6254 scripts/Makefile
6255 man/Makefile
6256 docs/Makefile
6257 data/Makefile
6258 data/net_2_0/Makefile
6259 data/net_4_0/Makefile
6260 data/net_4_5/Makefile
6261 data/net_2_0/Browsers/Makefile
6262 data/net_4_0/Browsers/Makefile
6263 data/net_4_5/Browsers/Makefile
6264 data/mint.pc
6265 data/mono-2.pc
6266 data/monosgen-2.pc
6267 data/mono.pc
6268 data/mono-cairo.pc
6269 data/mono-nunit.pc
6270 data/mono-options.pc
6271 data/mono-lineeditor.pc
6272 data/monodoc.pc
6273 data/dotnet.pc
6274 data/dotnet35.pc
6275 data/wcf.pc
6276 data/cecil.pc
6277 data/system.web.extensions_1.0.pc
6278 data/system.web.extensions.design_1.0.pc
6279 data/system.web.mvc.pc
6280 data/system.web.mvc2.pc
6281 data/system.web.mvc3.pc
6282 data/aspnetwebstack.pc
6283 data/reactive.pc
6284 samples/Makefile
6285 support/Makefile
6286 data/config
6287 tools/Makefile
6288 tools/locale-builder/Makefile
6289 tools/sgen/Makefile
6290 tools/monograph/Makefile
6291 tools/pedump/Makefile
6292 runtime/Makefile
6293 msvc/Makefile
6294 po/Makefile
6297 if test x$host_win32 = xyes; then
6298    # Get rid of 'cyg' prefixes in library names
6299    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6300    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6301    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6302    # executable doesn't work...
6303    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6306 if test x$host_darwin = xyes; then
6307    # This doesn't seem to be required and it slows down parallel builds
6308    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6312   case $prefix in
6313   NONE) prefix=$ac_default_prefix ;;
6314   esac
6315   case $exec_prefix in
6316   NONE) exec_prefix='${prefix}' ;;
6317   esac
6319   #
6320   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6321   # any existing config.make.  This allows people to share the same source tree
6322   # with different build directories, one native and one cross
6323   #
6324   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6326     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6328     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6329     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6330     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6331     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6332     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6333     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6334     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6335     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6336     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6338     case $INSTALL in
6339     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6340     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6341     esac
6343     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6345     export VERSION
6346     [myver=$($AWK 'BEGIN {
6347       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6348       if(length(vsplit [1]) > 4) {
6349         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6350       }
6351       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6352     }')]
6354     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6355     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6357     if test x$host_darwin = xyes; then
6358       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6359       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6360       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6361     elif test x$host_win32 = xyes; then
6362       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6363       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6364       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6365     elif test x$host_linux = xyes; then
6366       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6367       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6368       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6369     else
6370       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6371       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6372       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6373     fi
6375     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6376       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6377     fi
6379         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6380            enable_system_aot=yes
6381         fi
6383     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6384       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6385     fi
6387     if test x$DISABLE_MCS_DOCS = xyes; then
6388       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6389     fi
6391     if test x$has_extension_module != xno; then
6392         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6393     fi
6394     
6395     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6396     
6397     if test "x$test_bcl_opt" = "xyes"; then    
6398       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6399     fi
6401     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6402     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6403     echo "VBCS_LOCATION?=" >> $srcdir/$mcsdir/build/config.make
6405     if test $csc_compiler = mcs; then
6406       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6407     fi
6409     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6410       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6411       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6412       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6413     fi
6415     if test "x$AOT_MODE" != "x" ; then
6416       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6417     fi
6419     if test "x$enable_btls" = "xyes"; then
6420       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6421     fi
6423     if test "x$mono_native" = "xyes"; then
6424       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6425     else
6426       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6427     fi
6429     if test x$mono_native_compat = xyes; then
6430       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6431     else
6432       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6433     fi
6435     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6436     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6437     if test x$enable_compiler_server = xyes; then
6438       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6439     else
6440       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6441     fi
6442     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6444   fi
6448 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6450 btls_platform_string=
6451 if test x$enable_btls = xyes; then
6452         if test x$btls_android = xyes; then
6453                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6454         else
6455                 btls_platform_string=" ($BTLS_PLATFORM)"
6456         fi
6459 thread_suspend_msg=
6460 if test x$buildsgen = xyes; then
6461         if test x$enable_cooperative_suspend != xno; then
6462                 thread_suspend_msg="Suspend:       Cooperative"
6463         elif test x$enable_hybrid_suspend != xno; then
6464                 thread_suspend_msg="Suspend:       Hybrid"
6465         else
6466                 thread_suspend_msg="Suspend:       Preemptive"
6467         fi
6469         
6470 echo "
6471         mcs source:    $mcsdir
6472         C# Compiler:   $csc_compiler
6474    Engine:
6475         Host:          $host
6476         Target:        $target
6477         GC:            $gc_msg 
6478         $thread_suspend_msg
6479         TLS:           $with_tls
6480         SIGALTSTACK:   $with_sigaltstack
6481         Engine:        $jit_status
6482         BigArrays:     $enable_big_arrays
6483         DTrace:        $enable_dtrace
6484         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6485         Spectre:       $spectre_mitigation_status
6486         Mono.Native:   $mono_native_text
6488    Libraries:
6489         .NET 4.x:        $with_profile4_x
6490         Xamarin.Android: $with_monodroid
6491         Xamarin.iOS:     $with_monotouch
6492         Xamarin.WatchOS: $with_monotouch_watch
6493         Xamarin.TVOS:    $with_monotouch_tv
6494         Xamarin.Mac:     $with_xammac
6495         Windows AOT:     $with_winaot
6496         Orbis:           $with_orbis
6497         Unreal:          $with_unreal
6498         WebAssembly:     $with_wasm
6499         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6500         JNI support:     $jdk_headers_found
6501         libgdiplus:      $libgdiplus_msg
6502         zlib:            $zlib_msg
6503         BTLS:            $enable_btls$btls_platform_string
6504         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6505         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6506         .NET Core:       $with_core
6507         $disabled
6509 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6510    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)