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