Reduce default LLVM/BTLS Visual Studio build output.
[mono-project.git] / configure.ac
blobe9f9a3f83176e3af2b7a6bcd0d35e31444e4b514
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.21.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
24 API_VER=2.0
25 AC_SUBST(API_VER)
27 AC_PROG_LN_S
29 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
31 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
32 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
33 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
36 # This is the version of the corlib-runtime interface. When
37 # making changes to this interface (by changing the layout
38 # of classes the runtime knows about, changing icall signature or
39 # semantics etc), change this variable.
41 # This must be unique relative to corlib interface/semantics.
43 # Generate it with uuidgen. For example:
44 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
46 # There is no ordering of corlib versions, no old or new,
47 # the runtime expects an exact match.
49 MONO_CORLIB_VERSION=893F4575-474B-47A4-831E-E36181251FCB
52 # Put a quoted #define in config.h.
53 # Substitute @MONO_CORLIB_VERSION@ unquoted.
55 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,"$MONO_CORLIB_VERSION",[Version of the corlib-runtime interface])
56 AC_SUBST(MONO_CORLIB_VERSION)
58 case $host_os in
59 *cygwin* )
60                  echo "Run configure using ./configure --host=i686-w64-mingw32 or --host=x86_64-w64-mingw32"
61                  exit 1
62 esac
64 # In case of cygwin, override LN_S, irrespective of what it determines.
65 # The build uses cygwin, but the actual runtime doesn't.
66 case $host_os in
67 *cygwin* ) LN_S='cp -p';;
68 esac
71 # libgc defaults
73 libgc_configure_args=
75 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
76 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
77 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
78 CFLAGS_FOR_LIBGC=$CFLAGS
79 CPPFLAGS_FOR_BTLS=$CPPFLAGS
80 CFLAGS_FOR_BTLS=$CFLAGS
82 # libgc uses some deprecated APIs
83 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
86 # These are the flags that need to be stored in the mono.pc file for 
87 # compiling code that will embed Mono
89 libmono_cflags=""
90 libmono_ldflags=""
91 AC_SUBST(libmono_cflags)
92 AC_SUBST(libmono_ldflags)
94 # Variable to have relocatable .pc files (lib, or lib64)
95 # realpath isn't always available, and requires that all but the tip of the provided
96 # path exists. Fall back to the old behaviour, but realpath allows depth >1
97 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
98 # too deep for the old method to work
99 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
100 AC_SUBST(reloc_libdir)
102 # Set to yes if Unix sockets cannot be created in an anonymous namespace
103 need_link_unlink=no
105 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
106 extra_runtime_ldflags=""
108 # Thread configuration inspired by sleepycat's db
109 AC_MSG_CHECKING([host platform characteristics])
111 libgc_threads=no
112 has_dtrace=no
113 parallel_mark=yes
114 ikvm_native=yes
116 host_win32=no
117 target_win32=no
118 platform_android=no
119 platform_tizen=no
120 platform_ios=no
121 host_darwin=no
122 host_linux=no
124 case "$host" in
125         wasm32*)
126                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
127                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
128                 libdl="-ldl"
129                 libgc_threads=pthreads
130                 platform_wasm=yes
131                 ;;
132         *-mingw*|*-*-cygwin*)
133                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
134                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
135                 host_win32=yes
136                 mono_cv_clang=no
137                 if test "x$cross_compiling" = "xno"; then
138                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
139                                 target_win32=yes
140                         fi
141                 else
142                         if test "x$host" = "x$target"; then
143                                 target_win32=yes
144                         fi
145                 fi
146                 HOST_CC="gcc"
148                 # Windows 7 or later is required
149                 WIN32_CPPFLAGS="-DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
150                 CPPFLAGS="$CPPFLAGS $WIN32_CPPFLAGS"
151                 WIN32_LDFLAGS="-lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
152                 LDFLAGS="$LDFLAGS $WIN32_LDFLAGS"
153                 libmono_cflags="-mms-bitfields -mwindows"
154                 libmono_ldflags="-mms-bitfields -mwindows"
155                 libdl=
156                 libgc_threads=win32
157                 with_sigaltstack=no
158                 with_tls=pthread
159                 with_sgen_default_concurrent=yes
160                 LN_S=cp
161                 # This forces libgc to use the DllMain based thread registration code on win32
162                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
163                 ;;
164         *-*-*netbsd*)
165                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
166                 libmono_cflags="-D_REENTRANT"
167                 LDFLAGS="$LDFLAGS -pthread"
168                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
169                 libmono_ldflags="-pthread"
170                 need_link_unlink=yes
171                 libdl="-ldl"
172                 libgc_threads=pthreads
173                 with_sigaltstack=no
174                 use_sigposix=yes
175                 with_sgen_default_concurrent=yes
176                 ;;
177         *-*-kfreebsd*-gnu)
178                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
179                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
180                 libmono_ldflags="-lpthread -pthread"
181                 libdl="-ldl"
182                 libgc_threads=pthreads
183                 need_link_unlink=yes
184                 with_sigaltstack=no
185                 use_sigposix=yes
186                 with_sgen_default_concurrent=yes
187                 ;;
188         *-*-*freebsd*)
189                 dnl For close_my_fds
190                 LDFLAGS="$LDFLAGS -lutil"
191                 if test "x$PTHREAD_CFLAGS" = "x"; then
192                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
193                         libmono_cflags=
194                 else
195                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
196                         libmono_cflags="$PTHREAD_CFLAGS"
197                 fi
198                 if test "x$PTHREAD_LIBS" = "x"; then
199                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
200                         libmono_ldflags="-pthread"
201                 else
202                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
203                         libmono_ldflags="$PTHREAD_LIBS"
204                 fi
205                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
206                 need_link_unlink=yes
207                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
208                 libdl=
209                 libgc_threads=pthreads
210                 use_sigposix=yes
211                 has_dtrace=yes
212                 with_sgen_default_concurrent=yes
213                 ;;
214         *-*-*openbsd*)
215                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
216                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
217                 if test "x$disable_munmap" != "xyes"; then
218                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
219                 fi
220                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
221                 LDFLAGS="$LDFLAGS -pthread"
222                 need_link_unlink=yes
223                 AC_DEFINE(PTHREAD_POINTER_ID)
224                 libdl=
225                 libgc_threads=pthreads
226                 with_tls=pthread
227                 with_sigaltstack=no
228                 use_sigposix=yes
229                 with_sgen_default_concurrent=yes
230                 ;;
231         *-*-linux-android*)
232                 platform_android=yes
233                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
234                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
236                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
237                 if test "x$disable_munmap" != "xyes"; then
238                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
239                 fi
240                 libmono_cflags="-D_REENTRANT"
241                 libdl="-ldl"
242                 libgc_threads=pthreads
243                 use_sigposix=yes
245                 with_tls=pthread
246                 with_sigaltstack=no
247                 with_static_mono=no
249                 # Android doesn't support boehm, as it's missing <link.h>
250                 support_boehm=no
251                 with_gc=sgen
253                 # isinf(3) requires -lm
254                 LDFLAGS="$LDFLAGS -lm"
256                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
257                 # PAGE_SIZE; breaks mono/io-layer/collection.c
258                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
259                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
260                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
262                 # to bypass the underscore linker check, can't work when cross-compiling
263                 mono_cv_uscore=yes
264                 mono_cv_clang=no
265                 ;;
266         *-*-linux*)
267                 host_linux=yes
268                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
269                 if test "x$disable_munmap" != "xyes"; then
270                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
271                 fi
272                 libmono_cflags="-D_REENTRANT"
273                 libdl="-ldl"
274                 libgc_threads=pthreads
275                 use_sigposix=yes
276                 if test "x$cross_compiling" != "xno"; then
277                         # to bypass the underscore linker check, not
278                         # available during cross-compilation
279                         mono_cv_uscore=no
280                 fi
281                 case "$host" in
282                 *-tizen-linux-*)
283                         platform_tizen=yes
284                         ;;
285                 esac
286                 case "$host" in
287                 aarch64-*)
288                         support_boehm=no
289                         with_gc=sgen
290                         ;;
291                 powerpc*-*-linux*)
292                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
293                         disable_munmap=yes
294                         ;;
295                 esac
296                 with_sgen_default_concurrent=yes
297                 ;;
298         *-*-nacl*)
299                 echo "nacl no longer supported."
300                 exit 1
301                 ;;
302         *-*-hpux*)
303                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
304                 # +ESdbgasm only valid on bundled cc on RISC
305                 # silently ignored for ia64
306                 if test $GCC != "yes"; then
307                         CFLAGS="$CFLAGS +ESdbgasm"
308                         # Arrange for run-time dereferencing of null
309                         # pointers to produce a SIGSEGV signal.
310                         LDFLAGS="$LDFLAGS -z"
311                 fi
312                 CFLAGS="$CFLAGS +ESdbgasm"
313                 LDFLAGS="$LDFLAGS -z"
314                 libmono_cflags="-D_REENTRANT"
315                 libmono_ldflags="-lpthread"
316                 libgc_threads=pthreads
317                 need_link_unlink=yes
318                 use_sigposix=yes
319                 ;;
320         *-*-solaris*)
321                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
322                 need_link_unlink=yes
323                 libmono_cflags="-D_REENTRANT"
324                 libgc_threads=pthreads
325                 has_dtrace=yes
326                 use_sigposix=yes
327                 enable_solaris_tar_check=yes
328                 ;;
329         *-*-darwin*)
330                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
331                 host_darwin=yes
332                 target_mach=yes
333                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
334                 libmono_cflags="-D_THREAD_SAFE"
335                 need_link_unlink=yes
336                 AC_DEFINE(PTHREAD_POINTER_ID)
337                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
338                 libdl=
339                 libgc_threads=pthreads
340                 has_dtrace=yes
341                 if test "x$cross_compiling" = "xyes"; then
342                         has_broken_apple_cpp=yes
343                 fi
344                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
345                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
346                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
347                 case "$host" in
348                         dnl Snow Leopard and newer config.guess reports as this
349                         i*86-*-darwin*)
350                                 BROKEN_DARWIN_FLAGS="-arch i386"
351                                 BROKEN_DARWIN_CPPFLAGS=""
352                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
353                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
354                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
355                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
356                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
357                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
358                                 with_sgen_default_concurrent=yes
359                                 ;;
360                         x*64-*-darwin*)
361                                 with_sgen_default_concurrent=yes
362                                 ;;
363                         arm*-darwin*)
364                                 platform_ios=yes
365                                 has_dtrace=no
366                                 ;;
367                         aarch64*-darwin*)
368                                 platform_ios=yes
369                                 ;;
370                 esac
371                 ;;
372         *-*-haiku*)
373                 dnl BSD_SOURCE is for getifaddrs
374                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
375                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
376                 libdl=
377                 LIBS="$LIBS -lnetwork -ltextencoding"
378                 need_link_unlink=yes
379                 AC_DEFINE(PTHREAD_POINTER_ID)
380                 dnl Haiku does not support static TLS with __thread
381                 with_tls=pthread
382                 libgc_threads=pthreads
383                 use_sigposix=yes
384                 with_sigaltstack=no
385                 ;;
386         *-*-aix*|*-*-os400*)
387                 dnl Set up a 64-bit build
388                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
389                 LDFLAGS="-maix64"
390                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
391                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
392                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
393                 dnl specifiy 64-bit mode for tools.
394                 AR="/usr/bin/ar -X64"
395                 NM="/usr/bin/nm -X64"
396                 dnl SGen is the future (changes to Boehm support code would be
397                 dnl required if you wish to re-enable Boehm)
398                 support_boehm=no
399                 with_gc=sgen
400                 need_link_unlink=yes
401                 use_sigposix=yes
402                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
403                 with_sigaltstack=no
404                 dnl use pthread TLS, __thread has issues with the compiler flags we use
405                 with_tls=pthread
406                 dnl ppc Linux is the same? test further
407                 disable_munmap=yes
408                 ;;
409         *)
410                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
411                 libdl="-ldl"
412                 ;;
413 esac
415 AC_MSG_RESULT(ok)
417 if test x$need_link_unlink = xyes; then
418    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
421 if test x$host_win32 = xyes; then
422    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
425 if test x$target_win32 = xyes; then
426    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
429 if test x$host_darwin = xyes; then
430    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
433 # Defined for all targets/platforms using classic Windows API support.
434 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
435 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
437 AC_SUBST(extra_runtime_ldflags)
438 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
439 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
440 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
441 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
442 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
443 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
444 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
445 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
446 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
448 if test -z "$HOST_DARWIN_TRUE"; then :
449 PLATFORM_AOT_SUFFIX=.dylib
452 if test -z "$HOST_LINUX_TRUE"; then :
453 PLATFORM_AOT_SUFFIX=.so
456 if test -z "$HOST_WIN32_TRUE"; then :
457 PLATFORM_AOT_SUFFIX=.dll
460 AC_SUBST(PLATFORM_AOT_SUFFIX)
462 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
464 AC_CHECK_TOOL(CC, gcc, gcc)
465 AC_PROG_CC
466 AC_CHECK_TOOL(CXX, g++, g++)
467 AC_PROG_CXX
468 AM_PROG_AS
469 AC_PROG_INSTALL
470 AC_PROG_AWK
471 AM_PROG_CC_C_O
472 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
473 : ${CCAS='$(CC)'}
474 # Set ASFLAGS if not already set.
475 : ${CCASFLAGS='$(CFLAGS)'}
476 AC_SUBST(CCAS)
477 AC_SUBST(CCASFLAGS)
479 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
480 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
481 if test "x$CXX" = "xg++"; then
482         if test "x$GXX" != "xyes"; then
483                 # automake/libtool is so broken, it requires g++ even if the c++ sources
484                 # are inside automake conditionals
485                 AC_MSG_ERROR([You need to install g++])
486         fi
489 dnl may require a specific autoconf version
490 dnl AC_PROG_CC_FOR_BUILD
491 dnl CC_FOR_BUILD not automatically detected
492 CC_FOR_BUILD=$CC
493 CFLAGS_FOR_BUILD=$CFLAGS
494 BUILD_EXEEXT=
495 if test "x$cross_compiling" = "xyes"; then
496         CC_FOR_BUILD=cc
497         CFLAGS_FOR_BUILD=
498         BUILD_EXEEXT=""
500 AC_SUBST(CC_FOR_BUILD)
501 AC_SUBST(CFLAGS_FOR_BUILD)
502 AC_SUBST(HOST_CC)
503 AC_SUBST(BUILD_EXEEXT)
505 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
506 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
508 # Set STDC_HEADERS
509 AC_HEADER_STDC
510 AC_LIBTOOL_WIN32_DLL
511 # This causes monodis to not link correctly
512 #AC_DISABLE_FAST_INSTALL
514 #lookup makedev() header
515 AC_HEADER_MAJOR
517 AM_PROG_LIBTOOL
518 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
519 DOLT
521 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
522 AC_SUBST(export_ldflags)
524 # Test whenever ld supports -version-script
525 AC_PROG_LD
526 AC_PROG_LD_GNU
528 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)
529 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)
530 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
531                   [], [], [#include <stddef.h>
532                   #include <sys/socket.h>
533                   #include <linux/socket.h>])
535 AC_CHECK_HEADERS(sys/user.h, [], [],
537 #ifdef HAVE_SYS_PARAM_H
538 # include <sys/param.h>
539 #endif
542 AC_CHECK_HEADERS(linux/serial.h)
544 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
545 if test x$have_zlib = xyes; then
546    AC_TRY_COMPILE([#include <zlib.h>], [
547    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
548    #else
549    #error No good zlib found
550    #endif
551    ],[
552         AC_MSG_RESULT(Using system zlib)
553         zlib_msg="system zlib"
554         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
555    ],[
556         AC_MSG_RESULT(Using embedded zlib)
557         have_zlib=no
558         zlib_msg="bundled zlib"
559    ])
562 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
563 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
565 # for mono/metadata/debug-symfile.c
566 AC_CHECK_HEADERS(elf.h)
568 # for support
569 AC_CHECK_HEADERS(poll.h)
570 AC_CHECK_HEADERS(sys/poll.h)
571 AC_CHECK_HEADERS(sys/wait.h)
572 AC_CHECK_HEADERS(grp.h)
573 AC_CHECK_HEADERS(syslog.h)
574 AC_CHECK_FUNCS(vsyslog)
576 # for mono/dis
577 AC_CHECK_HEADERS(wchar.h)
579 # for Linux statfs support
580 AC_CHECK_HEADERS(linux/magic.h)
582 # For Android NDK unified headers
583 if test x$platform_android = xyes; then
584         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
585         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
587         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
588         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
589         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
590         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
591         # doesn't contain the required definitions (NDK 14)
592         if test x$have_android_signal_inlines = xyes; then
593                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
594                 AC_COMPILE_IFELSE([
595                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
596                                 int i;
597                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
598                                 }
599                         ])],[
600                                 AC_MSG_RESULT(yes)
601                                 android_sigrtminmax_work=yes
602                         ],[
603                                 AC_MSG_RESULT(no)
604                                 android_sigrtminmax_work=no
605                         ]
606                 )
608                 if test x$android_sigrtminmax_work = xno; then
609                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
610                 fi
611         fi
613         # Attempt to detect whether we're using Android NDK unified headers
614         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
615         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
617         android_unified_headers=no
618         if test x$have_android_api_level = xyes; then
619                 if test x$have_android_versioning = xyes; then
620                         AC_MSG_CHECKING([whether using Android NDK unified headers])
622                         # Both macros are defined only in the NDK unified headers
623                         AC_COMPILE_IFELSE([
624                                 AC_LANG_PROGRAM([
625                                         #include <android/api-level.h>
626                                         #include <android/versioning.h>
627                                 ],[
628                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
629                                         #else
630                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
631                                         #endif
632                                 ])],[
633                                         AC_MSG_RESULT(yes)
634                                         android_unified_headers=yes
635                                 ],[
636                                         AC_MSG_RESULT(no)
637                                         android_unified_headers=no
638                                 ]
639                         )
640                 fi
641         fi
643         if test x$android_unified_headers = xyes; then
644                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
645         fi
646 fi # Android
648 # not 64 bit clean in cross-compile
649 AC_CHECK_SIZEOF(void *)
650 AC_CHECK_SIZEOF(long)
652 AC_CHECK_SIZEOF(int)
653 AC_CHECK_SIZEOF(long long)
655 AC_CACHE_CHECK([for clang],
656         mono_cv_clang,[
657         AC_TRY_COMPILE([], [
658                 #ifdef __clang__
659                 #else
660                 #error "FAILED"
661                 #endif
662         ],
663         [mono_cv_clang=yes],
664         [mono_cv_clang=no],
665         [])
668 AC_ARG_ENABLE(visibility-hidden,
669 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
670    disable_visibility_hidden=yes, disable_visibility_hidden=no)
672 WARN=''
673 if test x"$GCC" = xyes; then
674                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
675                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
677                 # We require C99 with some GNU extensions, e.g. `linux` macro
678                 CFLAGS="$CFLAGS -std=gnu99"
680                 # The runtime code does not respect ANSI C strict aliasing rules
681                 CFLAGS="$CFLAGS -fno-strict-aliasing"
683                 # We rely on signed overflow to behave
684                 CFLAGS="$CFLAGS -fwrapv"
686                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
687                 if test x"$disable_visibility_hidden" = xno; then
688                    # Don't export any symbols by default
689                    SHARED_CFLAGS="-fvisibility=hidden"
690                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
691                 fi
693                 ORIG_CFLAGS=$CFLAGS
694                 # Check for the normal version, since gcc ignores unknown -Wno options
695                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
696                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
697                 AC_TRY_COMPILE([],[
698                 ], [
699                    AC_MSG_RESULT(yes)
700                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
701                 ], [
702                    AC_MSG_RESULT(no)
703                    CFLAGS=$ORIG_CFLAGS
704                 ])
706                 if test "x$mono_cv_clang" = "xyes"; then
707                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
708                    WARN="$WARN -Qunused-arguments"
709                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
710                    # We rely on zero length arrays in structs
711                    WARN="$WARN -Wno-zero-length-array"
712                 fi
713 else
714         # The Sun Forte compiler complains about inline functions that access static variables
715         # so disable all inlining.
716         case "$host" in
717         *-*-solaris*)
718                 CFLAGS="$CFLAGS -Dinline="
719                 ;;
720         esac
722 CFLAGS="$WARN $CFLAGS -g"
723 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
724 CPPFLAGS="$WARN $CPPFLAGS -g"
726 # Where's the 'mcs' source tree?
727 if test -d $srcdir/mcs; then
728   mcsdir=mcs
729 else
730   mcsdir=../mcs
733 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
734         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
735                 mcsdir=$with_mcs_path
736         fi
739 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
742 # A sanity check to catch cases where the package was unpacked
743 # with an ancient tar program (Solaris)
745 AC_ARG_ENABLE(solaris-tar-check,
746 [  --disable-solaris-tar-check    disable solaris tar check],
747    do_solaris_tar_check=no, do_solaris_tar_check=yes)
749 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
750         AC_MSG_CHECKING(integrity of package)
751         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
752         then
753                 AC_MSG_RESULT(ok)
754         else
755                 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"
756                 AC_MSG_ERROR([$errorm])
757         fi
760 if test "x$with_mcs_path" != "x"; then
761 mcs_topdir=$(cd "$mcsdir" && pwd)
762 mcs_topdir_from_srcdir=$mcs_topdir
763 else
764 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
765 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
768 # Convert mcs_topdir* paths to Windows syntax.
769 if test x$cross_compiling$host_win32 = xnoyes; then
770   mcs_topdir=$(cygpath -m $mcs_topdir)
771   case $mcs_topdir_from_srcdir in
772     /cygdrive/*)
773         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
774         ;;
775   esac
778 AC_SUBST([mcs_topdir])
779 AC_SUBST([mcs_topdir_from_srcdir])
781 # gettext: prepare the translation directories. 
782 # we do not configure the full gettext, as we consume it dynamically from C#
783 AM_PO_SUBDIRS
785 if test "x$USE_NLS" = "xyes"; then
786    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
788    if test "x$HAVE_MSGFMT" = "xno"; then
789           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
790    fi
793 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
795 pkg_config_path=
796 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
797         if test x$with_crosspkgdir = "x"; then
798                 if test -s $PKG_CONFIG_PATH; then
799                         pkg_config_path=$PKG_CONFIG_PATH
800                 fi
801         else
802                 pkg_config_path=$with_crosspkgdir
803                 PKG_CONFIG_PATH=$pkg_config_path
804                 export PKG_CONFIG_PATH
805         fi
808 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
809 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
810 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
812 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
813 if test x$werror_flag = xyes; then
814         WERROR_CFLAGS="-Werror"
816 AC_SUBST([WERROR_CFLAGS])
817 AC_SUBST([SHARED_CFLAGS])
819 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
820   
821 AC_SUBST(GLIB_CFLAGS)
823 # Enable support for fast thread-local storage
824 # Some systems have broken support, so we allow to disable it.
825 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
827 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
828 # This does not work on some platforms (bug #55253)
829 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
831 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
832 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
833 # Same as --with-shared_mono=no
834 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
836 if test "x$enable_static" = "xno"; then
837    with_static_mono=no
840 if test "x$enable_shared" = "xno"; then
841    with_shared_mono=no
844 if test "x$enable_libraries" = "xno"; then
845    with_shared_mono=no
848 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
850 if test "x$host_win32" = "xyes"; then
851    # Boehm GC requires the runtime to be in its own dll
852    with_static_mono=no
855 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
856 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
857 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
858 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
860 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
861 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
862         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
863         ORIG_CFLAGS=$CFLAGS
864         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
865         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
866         AC_TRY_COMPILE([], [
867         ], [
868            AC_MSG_RESULT(yes)
869            # Pass it to libgc as well
870            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
871         ], [
872            AC_MSG_RESULT(no)
873            CFLAGS=$ORIG_CFLAGS
874         ])
877 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
879 if test x$enable_small_config = xyes; then
880         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
881         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
884 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)
886 DISABLED_FEATURES=none
887 csc_compiler=default
888 endian=unknown
889 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
890 AC_MSG_CHECKING([CSharp compiler to use])
891 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
892    if test x$withval = xmcs; then
893        csc_compiler=mcs
894    elif test x$withval = xroslyn; then
895        csc_compiler=roslyn
896    elif test x$withval = xdefault; then
897        :
898    else
899        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
900    fi
901 ],[csc_compiler=default])
903 if test $csc_compiler = default; then
904    if test $endian = big; then
905       csc_compiler=mcs
906    elif test $endian = little; then
907       case "$host" in
908         powerpc*) csc_compiler=mcs ;;
909         *) csc_compiler=roslyn ;;
910       esac
911    else
912       csc_compiler=mcs
913    fi
915 AC_MSG_RESULT($csc_compiler)
917 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
918 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
919 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])
922 if test x$target_win32 = xyes; then
923 with_jemalloc=no
924 with_jemalloc_assert=no
925 with_jemalloc_always=no
928 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
929 if test "x$with_jemalloc_assert" = "xyes"; then
930 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
931 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
932 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
935 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
936 if test "x$with_jemalloc_always" = "xyes"; then
937 with_jemalloc=yes
938 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
939 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
940 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
943 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
944 if test "x$with_jemalloc" = "xyes"; then
945 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
946 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
947 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
949 if test "x$target_mach" = "xyes"; then
950         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
953 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
954 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
956 AC_SUBST(JEMALLOC_CFLAGS)
957 AC_SUBST(JEMALLOC_CPPFLAGS)
958 AC_SUBST(JEMALLOC_LDFLAGS)
959 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
962 # Terminology:
963 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
964 # MERP - The MS telemetry profile. Not for general use.
965 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
967 # 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.
969 #--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.
970 #--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.
971 #--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.
972 #--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.
974 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])
975 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])
976 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
978 if test "x$with_crash_privacy" = "xyes"; then
979 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
982 if test "x$with_structured_crashes" = "xno"; then
983 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
986 case "$host" in
987         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
988                 crash_reporting=no
989                 ;;
990 esac
992 if test "x$crash_reporting" != "xyes"; then
993 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
994 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
997 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
998 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1000 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1001 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1003 if test x$enable_monodroid = xyes; then
1004         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1007 if test x$enable_monotouch = xyes; then
1008         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1011 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1013 # mono/corefx/native has a lot of invalid C++98 in its headers
1014 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1015 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1016 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1017 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1019 AC_SUBST(CXXFLAGS_COMMON)
1021 if test "x$enable_cxx" = "xyes"; then
1023         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1025         # -std=gnu99 -xc++ is not allowed and errors.
1026         CXX_REMOVE_CFLAGS=-std=gnu99
1027         # These give warnings and should be removed. They are C-only.
1028         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1029         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1030         # Likewise with CentOS 6 gcc 4.4.
1031         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1033         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1034         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1035         # generates a warning every time we run gcc which is very unsightly.
1036         # The warning is for e.g. sprintf(foo, "") which can just be
1037         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1038         # and completely legal and valid.
1039         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1040         # Alternatively, just run $CXX -xc++ -c /dev/null.
1041         AC_LANG_PUSH(C++)
1042         ORIG_CXXFLAGS=$CXXFLAGS
1043         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1044         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1045         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1046                                  [ AC_MSG_RESULT(no)
1047                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1048         CXXFLAGS=$ORIG_CXXFLAGS
1049         AC_LANG_POP(C++)
1051 AC_SUBST(CXX_ADD_CFLAGS)
1052 AC_SUBST(CXX_REMOVE_CFLAGS)
1055 # Set the build profiles and options before things which use them
1058 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])
1059 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1060 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1061 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])
1062 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])
1063 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1064 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1065 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])
1066 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])
1067 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1068 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1069 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1070 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1073 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal   Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1074 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])
1075 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])
1076 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])
1079 dnl Spectre compiler mitigation flag checks
1081 if test "x$with_spectre_mitigation" = "xyes"; then
1082    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1083    SPECTRE_CFLAGS=
1084    SPECTRE_INDIRECT_BRANCH_KIND=
1085    case "x$with_spectre_indirect_branch_choice" in
1086        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1087        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1088        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1089        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1090        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1091    esac
1093    SPECTRE_FUNCTION_RETURN_KIND=""
1094    case "x$with_spectre_function_return_choice" in
1095        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1096        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1097        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1098        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1099        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1100    esac
1102    AX_CHECK_COMPILE_FLAG(
1103         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1104         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1105    )
1107    AX_CHECK_COMPILE_FLAG(
1108         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1109         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1110    )
1112    if test "x$SPECTRE_CFLAGS" != "x" ; then
1113         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1114         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1115         spectre_mitigation_status="mitigation enabled"
1116    fi
1117 else
1118         spectre_mitigation_status="no mitigation"
1122 dnl Profile defaults
1124 TEST_PROFILE=default
1125 enable_llvm_default=no
1127 with_profile4_x_default=no
1128 with_monodroid_default=no
1129 with_monotouch_default=no
1130 with_monotouch_watch_default=no
1131 with_monotouch_tv_default=no
1132 with_xammac_default=no
1133 with_testing_aot_hybrid_default=no
1134 with_testing_aot_full_default=no
1135 with_winaot_default=no
1136 with_orbis_default=no
1137 with_unreal_default=no
1138 with_wasm_default=no
1140 with_bitcode_default=no
1141 enable_cooperative_suspend_default=no
1142 enable_hybrid_suspend_default=no
1144 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1146 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1148 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1149    DISABLE_MCS_DOCS_default=yes
1150 elif test x$with_runtime_preset = xnet_4_x; then
1151    with_profile4_x_default=yes
1152 elif test x$with_runtime_preset = xall; then
1153    with_profile4_x_default=yes
1154    with_monodroid_default=yes
1155    with_monotouch_default=yes
1156    with_monotouch_watch_default=yes
1157    with_monotouch_tv_default=yes
1158    with_xammac_default=yes
1159    with_winaot_default=yes
1160    with_orbis_default=yes
1161    with_unreal_default=yes
1162    with_wasm_default=yes
1163    with_testing_aot_hybrid_default=yes
1164    with_testing_aot_full_default=yes
1165 elif test x$with_runtime_preset = xbitcode; then
1166    DISABLE_MCS_DOCS_default=yes
1167    with_testing_aot_full_default=yes
1168    with_bitcode_default=yes
1169    enable_cooperative_suspend_default=yes
1170    TEST_PROFILE=testing_aot_full
1171    enable_llvm_default=yes
1173    mono_feature_disable_com='yes'
1174    mono_feature_disable_remoting='yes'
1175    mono_feature_disable_reflection_emit_save='yes'
1176    mono_feature_disable_reflection_emit='yes'
1177    mono_feature_disable_appdomains='yes'
1179    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1180    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1181    AOT_MODE="llvmonly"
1182 elif test x$with_runtime_preset = xfullaot; then
1183    DISABLE_MCS_DOCS_default=yes
1184    with_testing_aot_full_default=yes
1185    TEST_PROFILE=testing_aot_full
1187    mono_feature_disable_com='yes'
1188    mono_feature_disable_remoting='yes'
1189    mono_feature_disable_reflection_emit_save='yes'
1190    mono_feature_disable_reflection_emit='yes'
1191    mono_feature_disable_appdomains='yes'
1193    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1194    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1195    AOT_MODE="full"
1196 elif test x$with_runtime_preset = xfullaot_llvm; then
1197    DISABLE_MCS_DOCS_default=yes
1198    with_testing_aot_full_default=yes
1199    TEST_PROFILE=testing_aot_full
1201    mono_feature_disable_com='yes'
1202    mono_feature_disable_remoting='yes'
1203    mono_feature_disable_reflection_emit_save='yes'
1204    mono_feature_disable_reflection_emit='yes'
1205    mono_feature_disable_appdomains='yes'
1207    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1208    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1209    AOT_MODE="full"
1210 elif test x$with_runtime_preset = xhybridaot; then
1211    DISABLE_MCS_DOCS_default=yes
1212    with_testing_aot_hybrid_default=yes
1213    TEST_PROFILE=testing_aot_hybrid 
1215    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1216    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1217 elif test x$with_runtime_preset = xhybridaot_llvm; then
1218    DISABLE_MCS_DOCS_default=yes
1219    with_testing_aot_hybrid_default=yes
1220    TEST_PROFILE=testing_aot_hybrid
1222    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1223    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1224 elif test x$with_runtime_preset = xaot; then
1225    with_profile4_x_default=yes
1227    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1228    AOT_RUN_FLAGS=""
1230    DISABLE_MCS_DOCS_default=yes
1231 elif test x$with_runtime_preset = xaot_llvm; then
1232    with_profile4_x_default=yes
1234    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1235    AOT_RUN_FLAGS=""
1237    DISABLE_MCS_DOCS_default=yes
1238 elif test x$with_runtime_preset = xwinaot; then
1239    DISABLE_MCS_DOCS_default=yes
1240    with_winaot_default=yes
1241    TEST_PROFILE=winaot
1243    mono_feature_disable_com='yes'
1244    mono_feature_disable_remoting='yes'
1245    mono_feature_disable_reflection_emit_save='yes'
1246    mono_feature_disable_reflection_emit='yes'
1247    mono_feature_disable_appdomains='yes'
1249    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1250    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1251    AOT_MODE="llvmonly"
1252 elif test x$with_runtime_preset = xorbis; then
1253    DISABLE_MCS_DOCS_default=yes
1254    with_orbis_default=yes
1255    TEST_PROFILE=orbis
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 --aot=full,$INVARIANT_AOT_OPTIONS"
1264    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1265    AOT_MODE="full"
1266 elif test x$with_runtime_preset = xunreal; then
1267    DISABLE_MCS_DOCS_default=yes
1268    with_unreal_default=yes
1269    TEST_PROFILE=unreal
1271    mono_feature_disable_com='yes'
1272    mono_feature_disable_remoting='yes'
1273    mono_feature_disable_appdomains='no'
1275    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1276    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1277 elif test x$with_runtime_preset = xwasm; then
1278    DISABLE_MCS_DOCS_default=yes
1279    with_wasm_default=yes
1280    TEST_PROFILE=wasm
1282    mono_feature_disable_com='yes'
1283    mono_feature_disable_remoting='yes'
1284    mono_feature_disable_reflection_emit_save='yes'
1285    mono_feature_disable_reflection_emit='yes'
1286    mono_feature_disable_appdomains='yes'
1288    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1289    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1290 else
1291    with_profile4_x_default=yes
1294 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1295    AC_SUBST(AOT_BUILD_FLAGS)
1296    AC_SUBST(AOT_RUN_FLAGS)
1297    # For llvmonlycheck + fullaotcheck
1298    AC_SUBST(INVARIANT_AOT_OPTIONS)
1301 AC_SUBST(TEST_PROFILE)
1303 if test "x$with_profile4_x" = "xdefault"; then
1304    with_profile4_x=$with_profile4_x_default
1306 if test "x$with_monodroid" = "xdefault"; then
1307    with_monodroid=$with_monodroid_default
1309 if test "x$with_monotouch" = "xdefault"; then
1310    with_monotouch=$with_monotouch_default
1312 if test "x$with_monotouch_watch" = "xdefault"; then
1313    with_monotouch_watch=$with_monotouch_watch_default
1315 if test "x$with_monotouch_tv" = "xdefault"; then
1316    with_monotouch_tv=$with_monotouch_tv_default
1318 if test "x$with_bitcode" = "xdefault"; then
1319    with_bitcode=$with_bitcode_default
1321 if test "x$with_xammac" = "xdefault"; then
1322    with_xammac=$with_xammac_default
1324 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1325    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1327 if test "x$with_testing_aot_full" = "xdefault"; then
1328    with_testing_aot_full=$with_testing_aot_full_default
1330 if test "x$with_winaot" = "xdefault"; then
1331    with_winaot=$with_winaot_default
1333 if test "x$with_orbis" = "xdefault"; then
1334    with_orbis=$with_orbis_default
1336 if test "x$with_unreal" = "xdefault"; then
1337    with_unreal=$with_unreal_default
1339 if test "x$with_wasm" = "xdefault"; then
1340    with_wasm=$with_wasm_default
1344 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1345 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1346 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1347 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1348 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1349 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1350 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1351 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1352 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1353 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1354 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1355 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1356 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1357 AM_CONDITIONAL(FULL_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full"] || [test "x$TEST_PROFILE" = "xwinaot"] || [test "x$TEST_PROFILE" = "xorbis"] || [test "x$TEST_PROFILE" = "xwasm"])
1358 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1360 default_profile=net_4_x
1361 if test -z "$INSTALL_MONODROID_TRUE"; then :
1362    default_profile=monodroid
1364 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1365    default_profile=monotouch
1367 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1368    default_profile=xammac
1370 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1371    default_profile=testing_aot_hybrid
1373 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1374    default_profile=testing_aot_full
1376 if test -z "$INSTALL_WINAOT_TRUE"; then :
1377    default_profile=winaot
1379 if test -z "$INSTALL_ORBIS_TRUE"; then :
1380    default_profile=orbis
1382 if test -z "$INSTALL_UNREAL_TRUE"; then :
1383    default_profile=unreal
1385 if test -z "$INSTALL_WASM_TRUE"; then :
1386    default_profile=wasm
1388 if test -z "$INSTALL_4_x_TRUE"; then :
1389    default_profile=net_4_x
1391 DEFAULT_PROFILE=$default_profile
1392 AC_SUBST(DEFAULT_PROFILE)
1395 # End build profile configuration
1398 if test x$USE_NLS = xprofile_default; then
1400         AC_MSG_CHECKING([NLS used])
1402         # We make the default value for USE_NLS
1403         # "no" on OSX because it isn't available on most
1404         # default OSX installs. The most common configurations will
1405         # all disable it, so this saves us typing.
1406         if test x$host_darwin = xyes; then
1407                 USE_NLS=no;
1408         else
1409                 USE_NLS=yes;
1410         fi
1412         AC_SUBST([USE_NLS])
1413         AC_MSG_RESULT([$USE_NLS])
1416 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1417      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1418      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1419          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1421         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1422                 eval "mono_feature_disable_$feature='yes'"
1423         done
1424         DISABLED_FEATURES=$enable_minimal
1425         disabled="Disabled:      $enable_minimal"
1426 ],[])
1428 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1430 if test "x$mono_feature_disable_aot" = "xyes"; then
1431         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1432         enable_system_aot=no
1433         AC_MSG_NOTICE([Disabled AOT compiler])
1436 if test "x$mono_feature_disable_profiler" = "xyes"; then
1437         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1438         AC_MSG_NOTICE([Disabled support for the profiler])
1440 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1442 if test "x$mono_feature_disable_decimal" = "xyes"; then
1443         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1444         AC_MSG_NOTICE([Disabled support for decimal])
1447 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1448         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1449         AC_MSG_NOTICE([Disabled support for P/Invoke])
1452 if test "x$mono_feature_disable_debug" = "xyes"; then
1453         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1454         AC_MSG_NOTICE([Disabled support for runtime debugging])
1457 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1458         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1459         mono_feature_disable_reflection_emit_save=yes
1460         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1463 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1464         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1465         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1468 if test "x$mono_feature_disable_large_code" = "xyes"; then
1469         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1470         AC_MSG_NOTICE([Disabled support for large assemblies])
1473 if test "x$mono_feature_disable_logging" = "xyes"; then
1474         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1475         AC_MSG_NOTICE([Disabled support for logging])
1478 if test "x$mono_feature_disable_com" = "xyes"; then
1479         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1480         AC_MSG_NOTICE([Disabled COM support])
1483 if test "x$mono_feature_disable_ssa" = "xyes"; then
1484         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1485         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1488 if test "x$mono_feature_disable_generics" = "xyes"; then
1489         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1490         AC_MSG_NOTICE([Disabled Generics Support])
1493 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1494         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1495         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1498 if test "x$mono_feature_disable_portability" = "xyes"; then
1499         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1500         AC_MSG_NOTICE([Disabled IO Portability layer])
1503 if test "x$mono_feature_disable_attach" = "xyes"; then
1504         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1505         AC_MSG_NOTICE([Disabled agent attach])
1508 if test "x$mono_feature_disable_verifier" = "xyes"; then
1509         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1510         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1513 if test "x$mono_feature_disable_jit" = "xyes"; then
1514         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1515         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1518 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1520 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1521         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1522         AC_MSG_NOTICE([Disabled the interpreter])
1525 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1527 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1528         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1531 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1533 if test "x$mono_feature_disable_simd" = "xyes"; then
1534         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1535         AC_MSG_NOTICE([Disabled SIMD support])
1538 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1539         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1540         AC_MSG_NOTICE([Disabled Soft Debugger.])
1543 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1545 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1546         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1547         AC_MSG_NOTICE([Disabled Performance Counters.])
1549 if test "x$mono_feature_disable_normalization" = "xyes"; then
1550         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1551         AC_MSG_NOTICE([Disabled String normalization support.])
1554 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1555 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1556         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1557         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1560 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1561         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1562         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1565 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1566         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1567         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1570 if test "x$mono_feature_disable_remoting" = "xyes"; then
1571         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1572         AC_MSG_NOTICE([Disabled remoting])
1575 if test "x$mono_feature_disable_security" = "xyes"; then
1576         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1577         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1580 if test "x$mono_feature_disable_lldb" = "xyes"; then
1581         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1582         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1585 if test "x$mono_feature_disable_mdb" = "xyes"; then
1586         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1587         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1590 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1591         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1592         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1596 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1597         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1598         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1601 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1602         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1603         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1606 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1607         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1608         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1611 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1612 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1614 has_extension_module=no
1615 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1617         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1618                 if test x$extension = xdefault ; then
1619                         has_extension_module=yes;
1620                 fi
1621         done
1622         if test x$enable_extension_module = xyes; then
1623                 has_extension_module=yes;
1624         fi
1625 ], [])
1627 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1629 if test x$has_extension_module != xno ; then
1630         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1631         AC_MSG_NOTICE([Enabling mono extension module.])
1634 # Deprecated
1635 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1637 AC_MSG_CHECKING(for visibility __attribute__)
1638 AC_COMPILE_IFELSE([
1639         AC_LANG_SOURCE([[
1640                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1641                 int main () { doit (); return 0; }
1642         ]])
1643 ], [
1644    have_visibility_hidden=yes
1645    AC_MSG_RESULT(yes)
1646 ], [
1647    have_visibility_hidden=no
1648    AC_MSG_RESULT(no)
1652 dnl Boehm GC configuration
1655 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1657 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1658 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1660 if test "x$support_boehm" = "xyes"; then
1662         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1663         if test x$enable_parallel_mark = xyes; then
1664                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1665         fi
1667         gc_msg=""
1668         LIBGC_CPPFLAGS=
1669         LIBGC_LIBS=
1670         LIBGC_STATIC_LIBS=
1671         libgc_dir=
1672         case "x$libgc" in
1673                 xincluded)
1674                         if test "x$support_boehm" = "xyes"; then
1675                                 libgc_dir=libgc
1676                         fi
1678                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1679                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1680                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1682                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1684                         if test x$target_win32 = xyes; then
1685                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1686                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1687                         fi
1689                         gc_msg="Included Boehm GC with typed GC"
1690                         if test x$enable_parallel_mark = xyes; then
1691                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1692                                 gc_msg="$gc_msg and parallel mark"
1693                         else
1694                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1695                         fi
1696                         ;;
1698                 xboehm|xbohem|xyes)
1699                         AC_MSG_WARN("External Boehm is no longer supported")
1700                         ;;
1702                 xsgen)
1703                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1704                         ;;
1706                 xnone)
1707                         AC_MSG_WARN("Compiling mono without GC.")
1708                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1709                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1710                         gc_msg="none"
1711                         ;;
1712                 *)
1713                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1714                         ;;
1715         esac
1717         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])
1718         if test "x$large_heap" = "xyes"; then
1719            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1720         fi
1722         AC_SUBST(LIBGC_CPPFLAGS)
1723         AC_SUBST(LIBGC_LIBS)
1724         AC_SUBST(LIBGC_STATIC_LIBS)
1725         AC_SUBST(libgc_dir)
1726         AC_SUBST(BOEHM_DEFINES)
1729 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1732 dnl End of Boehm GC Configuration
1735 dnl *************************************
1736 dnl *** Checks for zero length arrays ***
1737 dnl *************************************
1738 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1739 AC_TRY_COMPILE([
1740         struct s {
1741                 int  length;
1742                 char data [0];
1743         };
1744 ], [], [
1745         AC_MSG_RESULT(yes)
1746         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1747 ], [
1748         AC_MSG_RESULT(no)
1749         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1752 dnl ***********************************
1753 dnl *** Checks for signals
1754 dnl ***********************************
1755 AC_CHECK_HEADERS(signal.h)
1756 AC_CHECK_FUNCS(sigaction)
1757 AC_CHECK_FUNCS(kill)
1758 AC_CHECK_FUNCS(signal)
1760 # signal() is declared inline in Android headers
1761 # so we need to workaround it by overriding the check.
1762 if test x$platform_android = xyes; then
1763         AC_DEFINE(HAVE_SIGNAL,1)
1766 dnl ***********************************
1767 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1768 dnl ***********************************
1769 enable_gss=no;
1770 AC_MSG_CHECKING(for GSS/GSS.h)
1771 AC_TRY_COMPILE([
1772     #include <GSS/GSS.h>
1773 ], [
1775     AC_MSG_RESULT(yes)
1776     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1777     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1778     enable_gss=yes
1779 ], [
1780     AC_MSG_RESULT(no)
1783 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1784 AC_TRY_COMPILE([
1785     #include <gssapi/gssapi_ext.h>
1786 ], [
1788     AC_MSG_RESULT(yes)
1789     enable_gss=yes
1790 ], [
1791     AC_MSG_RESULT(no)
1794 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1795 AC_TRY_COMPILE([
1796     #include <gssapi/gssapi_ext.h>
1797     #include <gssapi/gssapi_krb5.h>
1798     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1799 ], [
1801     AC_MSG_RESULT(yes)
1802     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1803 ], [
1804     AC_MSG_RESULT(no)
1807 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1809 if test x$host_win32 = xno; then
1810         dnl *************************************
1811         dnl *** Checks for time capabilities ***
1812         dnl *************************************
1814         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1815         AC_TRY_COMPILE([#include <time.h>], [
1816                 const int foo = CLOCK_MONOTONIC;
1817         ],[
1818                 AC_MSG_RESULT(yes)
1819                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1820         ], [
1821                 AC_MSG_RESULT(no)
1822         ])
1824         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1825         AC_TRY_COMPILE([#include <time.h>], [
1826                 const int foo = CLOCK_MONOTONIC_COARSE;
1827         ],[
1828                 AC_MSG_RESULT(yes)
1829                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1830         ], [
1831                 AC_MSG_RESULT(no)
1832         ])
1834         AC_MSG_CHECKING(for CLOCK_REALTIME)
1835         AC_TRY_COMPILE([#include <time.h>], [
1836                 const int foo = CLOCK_REALTIME;
1837         ],[
1838                 AC_MSG_RESULT(yes)
1839                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1840         ], [
1841                 AC_MSG_RESULT(no)
1842         ])
1844         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1845         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1846         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1847         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1848         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1849         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1851         dnl hires monotonic clock support
1852         AC_SEARCH_LIBS(clock_gettime, rt)
1853         AC_CHECK_FUNCS(clock_nanosleep)
1855         dnl dynamic loader support
1856         AC_CHECK_FUNC(dlopen, DL_LIB="",
1857                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1858         )
1859         if test x$dl_support = xno; then
1860                 AC_MSG_WARN([No dynamic loading support available])
1861         else
1862                 LIBS="$LIBS $DL_LIB"
1863                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1864                 dnl from glib's configure.ac
1865                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1866                         mono_cv_uscore,[
1867                         AC_TRY_RUN([#include <dlfcn.h>
1868                         int mono_underscore_test (void) { return 42; }
1869                         int main() {
1870                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1871                           handle = dlopen ((void*)0, 0);
1872                           if (handle) {
1873                             f1 = dlsym (handle, "mono_underscore_test");
1874                             f2 = dlsym (handle, "_mono_underscore_test");
1875                           } return (!f2 || f1);
1876                         }],
1877                                 [mono_cv_uscore=yes],
1878                                 [mono_cv_uscore=no],
1879                         [])
1880                 ])
1881                 if test "x$mono_cv_uscore" = "xyes"; then
1882                         MONO_DL_NEED_USCORE=1
1883                 else
1884                         MONO_DL_NEED_USCORE=0
1885                 fi
1886                 AC_SUBST(MONO_DL_NEED_USCORE)
1887                 AC_CHECK_FUNC(dlerror)
1888         fi
1890         dnl ******************************************************************
1891         dnl *** Checks for the IKVM JNI interface library                  ***
1892         dnl ******************************************************************
1893         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])
1895         ikvm_native_dir=
1896         if test x$with_ikvm_native = xyes; then
1897                 ikvm_native_dir=ikvm-native
1898                 jdk_headers_found="IKVM Native"
1899         fi
1901         AC_SUBST(ikvm_native_dir)
1903         AC_CHECK_HEADERS(execinfo.h)
1905         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1907         AC_CHECK_FUNCS(getgrgid_r)
1908         AC_CHECK_FUNCS(getgrnam_r)
1909         AC_CHECK_FUNCS(getresuid)
1910         AC_CHECK_FUNCS(setresuid)
1911         AC_CHECK_FUNCS(kqueue)
1912         AC_CHECK_FUNCS(backtrace_symbols)
1913         AC_CHECK_FUNCS(mkstemp)
1914         AC_CHECK_FUNCS(mmap)
1915         AC_CHECK_FUNCS(madvise)
1916         AC_CHECK_FUNCS(getrusage)
1917         AC_CHECK_FUNCS(getpriority)
1918         AC_CHECK_FUNCS(setpriority)
1919         AC_CHECK_FUNCS(dl_iterate_phdr)
1920         AC_CHECK_FUNCS(dladdr)
1921         AC_CHECK_FUNCS(sysconf)
1922         AC_CHECK_FUNCS(getrlimit)
1923         AC_CHECK_FUNCS(prctl)
1924         AC_CHECK_FUNCS(arc4random)
1925         AC_CHECK_FUNCS(nl_langinfo)
1927         AC_CHECK_FUNCS(sched_getaffinity)
1928         AC_CHECK_FUNCS(sched_setaffinity)
1929         AC_CHECK_FUNCS(sched_getcpu)
1931         if test x$platform_android != xyes; then
1932                 AC_CHECK_FUNCS(getpwnam_r)
1933                 AC_CHECK_FUNCS(getpwuid_r)
1934         fi
1936         AC_FUNC_STRERROR_R()
1938         dnl ****************************************************************
1939         dnl *** Check for sched_setaffinity from glibc versions before   ***
1940         dnl *** 2.3.4. The older versions of the function only take 2    ***
1941         dnl *** parameters, not 3.                                       ***
1942         dnl ***                                                          ***
1943         dnl *** Because the interface change was not made in a minor     ***
1944         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1945         dnl *** won't always indicate the interface sched_affinity has.  ***
1946         dnl ****************************************************************
1947         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1948         AC_TRY_COMPILE([#include <sched.h>], [
1949             int mask = 1; 
1950             sched_setaffinity(0, &mask);
1951         ], [
1952                 # Yes, we have it...
1953                 AC_MSG_RESULT(yes)
1954                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1955         ], [
1956                 # We have the new, three-parameter version
1957                 AC_MSG_RESULT(no)
1958         ])
1959         AC_TRY_COMPILE([#include <sched.h>], [
1960              CPU_COUNT((void *) 0);
1961         ], [
1962                 AC_MSG_RESULT(yes)
1963                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1964         ], [
1965                 # We have the new, three-parameter version
1966                 AC_MSG_RESULT(no)
1967         ])
1969         dnl ******************************************************************
1970         dnl *** Check for large file support                               ***
1971         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1972         dnl ******************************************************************
1973         
1974         # Check that off_t can represent 2**63 - 1 correctly, working around
1975         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1976         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1977         large_offt=no
1978         AC_DEFUN([LARGE_FILES], [
1979                 large_CPPFLAGS=$CPPFLAGS
1980                 CPPFLAGS="$CPPFLAGS $1"
1981                 AC_TRY_COMPILE([
1982                         #include <sys/types.h>
1983                         #include <limits.h>
1984                 ], [
1985                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1986                         #define COMPILE_TIME_ASSERT(pred) \
1987                                 switch(0){case 0:case pred:;}
1988                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1989                 ], [
1990                         AC_MSG_RESULT(ok)
1991                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1992                         large_CPPFLAGS="$large_CPPFLAGS $1"
1993                         large_offt=yes
1994                 ], [
1995                         AC_MSG_RESULT(no)
1996                 ])
1997                 CPPFLAGS=$large_CPPFLAGS
1998         ])
2000         AC_MSG_CHECKING(if off_t is 64 bits wide)
2001         LARGE_FILES("")
2002         if test $large_offt = no; then
2003                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2004                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2005         fi
2006         if test $large_offt = no; then
2007                 AC_MSG_WARN([No 64 bit file size support available])
2008         fi
2009         
2010         dnl *****************************
2011         dnl *** Checks for libsocket  ***
2012         dnl *****************************
2013         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2015         case "$host" in
2016                 *-*-*freebsd*)
2017                         dnl *****************************
2018                         dnl *** Checks for libinotify ***
2019                         dnl *****************************
2020                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2021         esac
2023         dnl *******************************
2024         dnl *** Checks for MSG_NOSIGNAL ***
2025         dnl *******************************
2026         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2027         AC_TRY_COMPILE([#include <sys/socket.h>], [
2028                 int f = MSG_NOSIGNAL;
2029         ], [
2030                 # Yes, we have it...
2031                 AC_MSG_RESULT(yes)
2032                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2033         ], [
2034                 # We'll have to use signals
2035                 AC_MSG_RESULT(no)
2036         ])
2038         dnl *****************************
2039         dnl *** Checks for IPPROTO_IP ***
2040         dnl *****************************
2041         AC_MSG_CHECKING(for IPPROTO_IP)
2042         AC_TRY_COMPILE([#include <netinet/in.h>], [
2043                 int level = IPPROTO_IP;
2044         ], [
2045                 # Yes, we have it...
2046                 AC_MSG_RESULT(yes)
2047                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2048         ], [
2049                 # We'll have to use getprotobyname
2050                 AC_MSG_RESULT(no)
2051         ])
2053         dnl *******************************
2054         dnl *** Checks for IPPROTO_IPV6 ***
2055         dnl *******************************
2056         AC_MSG_CHECKING(for IPPROTO_IPV6)
2057         AC_TRY_COMPILE([#include <netinet/in.h>], [
2058                 int level = IPPROTO_IPV6;
2059         ], [
2060                 # Yes, we have it...
2061                 AC_MSG_RESULT(yes)
2062                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2063         ], [
2064                 # We'll have to use getprotobyname
2065                 AC_MSG_RESULT(no)
2066         ])
2068         dnl ******************************
2069         dnl *** Checks for IPPROTO_TCP ***
2070         dnl ******************************
2071         AC_MSG_CHECKING(for IPPROTO_TCP)
2072         AC_TRY_COMPILE([#include <netinet/in.h>], [
2073                 int level = IPPROTO_TCP;
2074         ], [
2075                 # Yes, we have it...
2076                 AC_MSG_RESULT(yes)
2077                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2078         ], [
2079                 # We'll have to use getprotobyname
2080                 AC_MSG_RESULT(no)
2081         ])
2083         dnl *****************************
2084         dnl *** Checks for SOL_IP     ***
2085         dnl *****************************
2086         AC_MSG_CHECKING(for SOL_IP)
2087         AC_TRY_COMPILE([#include <netdb.h>], [
2088                 int level = SOL_IP;
2089         ], [
2090                 # Yes, we have it...
2091                 AC_MSG_RESULT(yes)
2092                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2093         ], [
2094                 # We'll have to use getprotobyname
2095                 AC_MSG_RESULT(no)
2096         ])
2098         dnl *****************************
2099         dnl *** Checks for SOL_IPV6     ***
2100         dnl *****************************
2101         AC_MSG_CHECKING(for SOL_IPV6)
2102         AC_TRY_COMPILE([#include <netdb.h>], [
2103                 int level = SOL_IPV6;
2104         ], [
2105                 # Yes, we have it...
2106                 AC_MSG_RESULT(yes)
2107                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2108         ], [
2109                 # We'll have to use getprotobyname
2110                 AC_MSG_RESULT(no)
2111         ])
2113         dnl *****************************
2114         dnl *** Checks for SOL_TCP    ***
2115         dnl *****************************
2116         AC_MSG_CHECKING(for SOL_TCP)
2117         AC_TRY_COMPILE([#include <netdb.h>], [
2118                 int level = SOL_TCP;
2119         ], [
2120                 # Yes, we have it...
2121                 AC_MSG_RESULT(yes)
2122                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2123         ], [
2124                 # We'll have to use getprotobyname
2125                 AC_MSG_RESULT(no)
2126         ])
2128         dnl *****************************
2129         dnl *** Checks for IP_PKTINFO ***
2130         dnl *****************************
2131         AC_MSG_CHECKING(for IP_PKTINFO)
2132         AC_TRY_COMPILE([#include <linux/in.h>], [
2133                 int level = IP_PKTINFO;
2134         ], [
2135                 # Yes, we have it...
2136                 AC_MSG_RESULT(yes)
2137                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2138         ], [
2139                 AC_MSG_RESULT(no)
2140         ])
2142         dnl *****************************
2143         dnl *** Checks for IPV6_PKTINFO ***
2144         dnl *****************************
2145         AC_MSG_CHECKING(for IPV6_PKTINFO)
2146         AC_TRY_COMPILE([#include <netdb.h>], [
2147                 int level = IPV6_PKTINFO;
2148         ], [
2149                 # Yes, we have it...
2150                 AC_MSG_RESULT(yes)
2151                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2152         ], [
2153                 AC_MSG_RESULT(no)
2154         ])
2156         dnl **********************************
2157         dnl *** Checks for IP_DONTFRAG     ***
2158         dnl **********************************
2159         AC_MSG_CHECKING(for IP_DONTFRAG)
2160         AC_TRY_COMPILE([#include <netinet/in.h>], [
2161                 int level = IP_DONTFRAG;
2162         ], [
2163                 # Yes, we have it...
2164                 AC_MSG_RESULT(yes)
2165                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2166         ], [
2167                 AC_MSG_RESULT(no)
2168         ])
2170         dnl **********************************
2171         dnl *** Checks for IP_DONTFRAGMENT ***
2172         dnl **********************************
2173         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2174         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2175                 int level = IP_DONTFRAGMENT;
2176         ], [
2177                 # Yes, we have it...
2178                 AC_MSG_RESULT(yes)
2179                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2180         ], [
2181                 AC_MSG_RESULT(no)
2182         ])
2184         dnl **********************************
2185         dnl *** Checks for IP_MTU_DISCOVER ***
2186         dnl **********************************
2187         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2188         AC_TRY_COMPILE([#include <linux/in.h>], [
2189                 int level = IP_MTU_DISCOVER;
2190         ], [
2191                 # Yes, we have it...
2192                 AC_MSG_RESULT(yes)
2193                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2194         ], [
2195                 AC_MSG_RESULT(no)
2196         ])
2198         dnl **********************************
2199         dnl *** Checks for  IP_PMTUDISC_DO ***
2200         dnl **********************************
2201         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2202         AC_TRY_COMPILE([#include <linux/in.h>], [
2203                 int level = IP_PMTUDISC_DO;
2204         ], [
2205                 # Yes, we have it...
2206                 AC_MSG_RESULT(yes)
2207                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2208         ], [
2209                 AC_MSG_RESULT(no)
2210         ])
2212         dnl *********************************
2213         dnl *** Check for struct ip_mreqn ***
2214         dnl *********************************
2215         AC_MSG_CHECKING(for struct ip_mreqn)
2216         AC_TRY_COMPILE([#include <netinet/in.h>], [
2217                 struct ip_mreqn mreq;
2218                 mreq.imr_address.s_addr = 0;
2219         ], [
2220                 # Yes, we have it...
2221                 AC_MSG_RESULT(yes)
2222                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2223         ], [
2224                 # We'll just have to try and use struct ip_mreq
2225                 AC_MSG_RESULT(no)
2226                 AC_MSG_CHECKING(for struct ip_mreq)
2227                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2228                         struct ip_mreq mreq;
2229                         mreq.imr_interface.s_addr = 0;
2230                 ], [
2231                         # Yes, we have it...
2232                         AC_MSG_RESULT(yes)
2233                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2234                 ], [
2235                         # No multicast support
2236                         AC_MSG_RESULT(no)
2237                 ])
2238         ])
2239         
2240         dnl **********************************
2241         dnl *** Check for getaddrinfo ***
2242         dnl **********************************
2243         AC_MSG_CHECKING(for getaddrinfo)
2244                 AC_TRY_LINK([
2245                 #include <stdio.h>
2246                 #include <netdb.h>
2247         ], [
2248                 getaddrinfo(NULL,NULL,NULL,NULL);
2249         ], [
2250                 # Yes, we have it...
2251                 AC_MSG_RESULT(yes)
2252                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2253         ], [
2254                 AC_MSG_RESULT(no)
2255         ])
2257         dnl **********************************
2258         dnl *** Check for gethostbyname2_r ***
2259         dnl **********************************
2260         AC_MSG_CHECKING(for gethostbyname2_r)
2261                 AC_TRY_LINK([
2262                 #include <stdio.h>
2263                 #include <netdb.h>
2264         ], [
2266                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2267         ], [
2268                 # Yes, we have it...
2269                 AC_MSG_RESULT(yes)
2270                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2271         ], [
2272                 AC_MSG_RESULT(no)
2273         ])
2275         dnl **********************************
2276         dnl *** Check for gethostbyname2 ***
2277         dnl **********************************
2278         AC_MSG_CHECKING(for gethostbyname2)
2279                 AC_TRY_LINK([
2280                 #include <stdio.h>
2281                 #include <netdb.h>
2282         ], [
2283                 gethostbyname2(NULL,0);
2284         ], [
2285                 # Yes, we have it...
2286                 AC_MSG_RESULT(yes)
2287                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2288         ], [
2289                 AC_MSG_RESULT(no)
2290         ])
2292         dnl **********************************
2293         dnl *** Check for gethostbyname ***
2294         dnl **********************************
2295         AC_MSG_CHECKING(for gethostbyname)
2296                 AC_TRY_LINK([
2297                 #include <stdio.h>
2298                 #include <netdb.h>
2299         ], [
2300                 gethostbyname(NULL);
2301         ], [
2302                 # Yes, we have it...
2303                 AC_MSG_RESULT(yes)
2304                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2305         ], [
2306                 AC_MSG_RESULT(no)
2307         ])
2309         dnl **********************************
2310         dnl *** Check for getprotobyname ***
2311         dnl **********************************
2312         AC_MSG_CHECKING(for getprotobyname)
2313                 AC_TRY_LINK([
2314                 #include <stdio.h>
2315                 #include <netdb.h>
2316         ], [
2317                 getprotobyname(NULL);
2318         ], [
2319                 # Yes, we have it...
2320                 AC_MSG_RESULT(yes)
2321                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2322         ], [
2323                 AC_MSG_RESULT(no)
2324         ])
2326         dnl **********************************
2327         dnl *** Check for getprotobyname_r ***
2328         dnl **********************************
2329         AC_MSG_CHECKING(for getprotobyname_r)
2330                 AC_TRY_LINK([
2331                 #include <stdio.h>
2332                 #include <netdb.h>
2333         ], [
2334                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2335         ], [
2336                 # Yes, we have it...
2337                 AC_MSG_RESULT(yes)
2338                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2339         ], [
2340                 AC_MSG_RESULT(no)
2341         ])
2343         dnl **********************************
2344         dnl *** Check for getnameinfo ***
2345         dnl **********************************
2346         AC_MSG_CHECKING(for getnameinfo)
2347                 AC_TRY_LINK([
2348                 #include <stdio.h>
2349                 #include <netdb.h>
2350         ], [
2351                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2352         ], [
2353                 # Yes, we have it...
2354                 AC_MSG_RESULT(yes)
2355                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2356         ], [
2357                 AC_MSG_RESULT(no)
2358         ])
2361         dnl **********************************
2362         dnl *** Check for inet_ntop ***
2363         dnl **********************************
2364         AC_MSG_CHECKING(for inet_ntop)
2365                 AC_TRY_LINK([
2366                 #include <stdio.h>
2367                 #include <arpa/inet.h>
2368         ], [
2369                 inet_ntop (0, NULL, NULL, 0);
2370         ], [
2371                 # Yes, we have it...
2372                 AC_MSG_RESULT(yes)
2373                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2374         ], [
2375                 AC_MSG_RESULT(no)
2376         ])
2378         dnl *****************************
2379         dnl *** Checks for libnsl     ***
2380         dnl *****************************
2381         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2383         AC_CHECK_FUNCS(inet_pton inet_aton)
2385         dnl *****************************
2386         dnl *** Checks for libxnet    ***
2387         dnl *****************************
2388         case "${host}" in
2389                 *solaris* )
2390                         AC_MSG_CHECKING(for Solaris XPG4 support)
2391                         if test -f /usr/lib/libxnet.so; then
2392                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2393                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2394                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2395                                 LIBS="$LIBS -lxnet"
2396                                 AC_MSG_RESULT(yes)
2397                         else
2398                                 AC_MSG_RESULT(no)
2399                         fi
2401                         if test "$GCC" = "yes"; then
2402                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2403                         fi
2404                 ;;
2405         esac
2407         dnl *****************************
2408         dnl *** Checks for libpthread ***
2409         dnl *****************************
2410 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2411 # and libpthread does not exist
2413         case "${host}" in
2414                 *-*-*haiku*)
2415                         dnl Haiku has pthread in libroot (libc equiv)
2416                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2417                 ;;
2418                 *-*-*freebsd*)
2419                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2420                 ;;
2421                 *-*-*openbsd*)
2422                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2423                 ;;
2424                 *)
2425                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2426                 ;;
2427         esac
2428         AC_CHECK_HEADERS(pthread.h)
2429         AC_CHECK_HEADERS(pthread_np.h)
2430         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2431         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2432         AC_CHECK_FUNCS(pthread_kill)
2433         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2434         AC_TRY_COMPILE([ #include <pthread.h>], [
2435                 pthread_mutexattr_t attr;
2436                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2437         ], [
2438                 AC_MSG_RESULT(ok)
2439         ], [
2440                 AC_MSG_RESULT(no)
2441                 AC_ERROR(Posix system lacks support for recursive mutexes)
2442         ])
2443         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2444         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2445         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2446         AC_CHECK_FUNCS(mincore mlock munlock)
2448         dnl ***********************************
2449         dnl *** Checks for working __thread ***
2450         dnl ***********************************
2451         AC_MSG_CHECKING(for working __thread)
2452         if test "x$with_tls" != "x__thread"; then
2453                 AC_MSG_RESULT(disabled)
2454         elif test "x$cross_compiling" = "xyes"; then
2455                 AC_MSG_RESULT(cross compiling, assuming yes)
2456         else
2457                 AC_TRY_RUN([
2458                         #if defined(__APPLE__) && defined(__clang__)
2459                         #error "__thread does not currently work with clang on Mac OS X"
2460                         #endif
2461                         
2462                         #include <pthread.h>
2463                         __thread int i;
2464                         static int res1, res2;
2466                         void thread_main (void *arg)
2467                         {
2468                                 i = arg;
2469                                 sleep (1);
2470                                 if (arg == 1)
2471                                         res1 = (i == arg);
2472                                 else
2473                                         res2 = (i == arg);
2474                         }
2476                         int main () {
2477                                 pthread_t t1, t2;
2479                                 i = 5;
2481                                 pthread_create (&t1, NULL, thread_main, 1);
2482                                 pthread_create (&t2, NULL, thread_main, 2);
2484                                 pthread_join (t1, NULL);
2485                                 pthread_join (t2, NULL);
2487                                 return !(res1 + res2 == 2);
2488                         }
2489                 ], [
2490                                 AC_MSG_RESULT(yes)
2491                 ], [
2492                                 AC_MSG_RESULT(no)
2493                                 with_tls=pthread
2494                 ])
2495         fi
2497         dnl **************************************
2498         dnl *** Checks for working sigaltstack ***
2499         dnl **************************************
2500         AC_MSG_CHECKING(for working sigaltstack)
2501         if test "x$with_sigaltstack" != "xyes"; then
2502                 AC_MSG_RESULT(disabled)
2503         elif test "x$cross_compiling" = "xyes"; then
2504                 AC_MSG_RESULT(cross compiling, assuming yes)
2505         else
2506                 AC_TRY_RUN([
2507                         #include <stdio.h>
2508                         #include <stdlib.h>
2509                         #include <unistd.h>
2510                         #include <signal.h>
2511                         #include <pthread.h>
2512                         #include <sys/wait.h>
2513                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2514                         #define SA_STACK SA_ONSTACK
2515                         #endif
2516                         static void
2517                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2518                         {
2519                                 exit (0);
2520                         }
2522                         volatile char*__ptr = NULL;
2523                         static void *
2524                         loop (void *ignored)
2525                         {
2526                                 *__ptr = 0;
2527                                 return NULL;
2528                         }
2530                         static void
2531                         child ()
2532                         {
2533                                 struct sigaction sa;
2534                                 stack_t sas;
2535                                 pthread_t id;
2536                                 pthread_attr_t attr;
2538                                 sa.sa_sigaction = sigsegv_signal_handler;
2539                                 sigemptyset (&sa.sa_mask);
2540                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2541                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2542                                         perror ("sigaction");
2543                                         return;
2544                                 }
2546                                 /* x86 darwin deliver segfaults using SIGBUS */
2547                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2548                                         perror ("sigaction");
2549                                         return;
2550                                 }
2551                                 sas.ss_sp = malloc (SIGSTKSZ);
2552                                 sas.ss_size = SIGSTKSZ;
2553                                 sas.ss_flags = 0;
2554                                 if (sigaltstack (&sas, NULL) == -1) {
2555                                         perror ("sigaltstack");
2556                                         return;
2557                                 }
2559                                 pthread_attr_init (&attr);
2560                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2561                                         printf ("pthread_create\n");
2562                                         return;
2563                                 }
2565                                 sleep (100);
2566                         }
2568                         int
2569                         main ()
2570                         {
2571                                 pid_t son;
2572                                 int status;
2573                                 int i;
2575                                 son = fork ();
2576                                 if (son == -1) {
2577                                         return 1;
2578                                 }
2580                                 if (son == 0) {
2581                                         child ();
2582                                         return 0;
2583                                 }
2585                                 for (i = 0; i < 300; ++i) {
2586                                         waitpid (son, &status, WNOHANG);
2587                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2588                                                 return 0;
2589                                         usleep (10000);
2590                                 }
2592                                 kill (son, SIGKILL);
2593                                 return 1;
2594                         }
2596                 ], [
2597                                 AC_MSG_RESULT(yes)
2598                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2599                 ], [
2600                                 with_sigaltstack=no
2601                                 AC_MSG_RESULT(no)
2602                 ])
2603         fi
2605         dnl ********************************
2606         dnl *** Checks for semaphore lib ***
2607         dnl ********************************
2608         # 'Real Time' functions on Solaris
2609         # posix4 on Solaris 2.6
2610         # pthread (first!) on Linux
2611         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2613         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2614         AC_CHECK_FUNCS(shm_open)
2616         dnl ********************************
2617         dnl *** Checks for timezone stuff **
2618         dnl ********************************
2619         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2620                 AC_TRY_COMPILE([
2621                         #include <time.h>
2622                         ], [
2623                         struct tm tm;
2624                         tm.tm_gmtoff = 1;
2625                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2626         if test $ac_cv_struct_tm_gmtoff = yes; then
2627                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2628         else
2629                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2630                         AC_TRY_COMPILE([
2631                                 #include <time.h>
2632                         ], [
2633                                 timezone = 1;
2634                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2635                 if test $ac_cv_var_timezone = yes; then
2636                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2637                 else
2638                         AC_ERROR(unable to find a way to determine timezone)
2639                 fi
2640         fi
2642         dnl *********************************
2643         dnl *** Checks for math functions ***
2644         dnl *********************************
2645         AC_SEARCH_LIBS(sqrtf, m)
2647         dnl ****************************************************************
2648         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2649         dnl *** have it in the library (duh))                            ***
2650         dnl ****************************************************************
2651         AC_CHECK_FUNCS(poll)
2653         dnl **********************************
2654         dnl *** epoll                      ***
2655         dnl **********************************
2656         AC_CHECK_HEADERS(sys/epoll.h)
2657         haveepoll=no
2658         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2659         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2660                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2661         fi
2663         havekqueue=no
2665         AC_CHECK_HEADERS(sys/event.h)
2666         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2668         dnl **************************************
2669         dnl * Darwin has a race that prevents us from using reliably:
2670         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2671         dnl * Since kqueue is mostly used for scaling large web servers, 
2672         dnl * and very few folks run Mono on large web servers on OSX, falling
2673         dnl * back 
2674         dnl **************************************
2675         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2676                 if test "x$host_darwin" = "xno"; then
2677                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2678                 fi
2679         fi
2681         dnl ******************************
2682         dnl *** Checks for SIOCGIFCONF ***
2683         dnl ******************************
2684         AC_CHECK_HEADERS(sys/ioctl.h)
2685         AC_CHECK_HEADERS(net/if.h, [], [],
2686            [
2687            #ifdef HAVE_SYS_TYPES_H
2688            # include <sys/types.h>
2689            #endif
2690            #ifdef HAVE_SYS_SOCKET_H
2691            # include <sys/socket.h>
2692            #endif
2693            ])
2694         AC_MSG_CHECKING(for ifreq)
2695         AC_TRY_COMPILE([
2696                 #include <stdio.h>
2697                 #include <sys/ioctl.h>
2698                 #include <net/if.h>
2699                 ], [
2700                 struct ifconf ifc;
2701                 struct ifreq *ifr;
2702                 void *x;
2703                 ifc.ifc_len = 0;
2704                 ifc.ifc_buf = NULL;
2705                 x = (void *) &ifr->ifr_addr;
2706                 ],[
2707                         AC_MSG_RESULT(yes)
2708                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2709                 ], [
2710                         AC_MSG_RESULT(no)
2711                 ])
2712         dnl **********************************
2713         dnl ***     Checks for sin_len     ***
2714         dnl **********************************
2715         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2716         AC_TRY_COMPILE([
2717                 #include <netinet/in.h>
2718                 ], [
2719                 struct sockaddr_in saddr;
2720                 saddr.sin_len = sizeof (saddr);
2721                 ],[
2722                         AC_MSG_RESULT(yes)
2723                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2724                 ], [
2725                         AC_MSG_RESULT(no)
2726                 ])      
2727         dnl **********************************
2728         dnl ***    Checks for sin6_len     ***
2729         dnl **********************************
2730         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2731         AC_TRY_COMPILE([
2732                 #include <netinet/in.h>
2733                 ], [
2734                 struct sockaddr_in6 saddr6;
2735                 saddr6.sin6_len = sizeof (saddr6);
2736                 ],[
2737                         AC_MSG_RESULT(yes)
2738                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2739                 ], [
2740                         AC_MSG_RESULT(no)
2741                 ])
2742         dnl **********************************
2743         dnl *** Check for getifaddrs       ***
2744         dnl **********************************
2745         AC_MSG_CHECKING(for getifaddrs)
2746                 AC_TRY_LINK([
2747                 #include <stdio.h>
2748                 #include <sys/types.h>
2749                 #include <sys/socket.h>
2750                 #include <ifaddrs.h>
2751         ], [
2752                 getifaddrs(NULL);
2753         ], [
2754                 # Yes, we have it...
2755                 AC_MSG_RESULT(yes)
2756                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2757         ], [
2758                 AC_MSG_RESULT(no)
2759         ])
2760         dnl **********************************
2761         dnl *** Check for if_nametoindex   ***
2762         dnl **********************************
2763         AC_MSG_CHECKING(for if_nametoindex)
2764                 AC_TRY_LINK([
2765                 #include <stdio.h>
2766                 #include <sys/types.h>
2767                 #include <sys/socket.h>
2768                 #include <net/if.h>
2769         ], [
2770                 if_nametoindex(NULL);
2771         ], [
2772                 # Yes, we have it...
2773                 AC_MSG_RESULT(yes)
2774                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2775         ], [
2776                 AC_MSG_RESULT(no)
2777         ])
2778         dnl **********************************
2779         dnl *** Check for access ***
2780         dnl **********************************
2781         AC_MSG_CHECKING(for access)
2782                 AC_TRY_LINK([
2783                 #include <unistd.h>
2784         ], [
2785                 access(NULL,0);
2786         ], [
2787                 # Yes, we have it...
2788                 AC_MSG_RESULT(yes)
2789                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2790         ], [
2791                 AC_MSG_RESULT(no)
2792         ])
2793                         
2794         dnl **********************************
2795         dnl *** Checks for proclib         ***
2796         dnl **********************************
2797         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.)])
2798         dnl **********************************
2799         dnl *** Checks for MonoPosixHelper ***
2800         dnl **********************************
2801         AC_CHECK_HEADERS(checklist.h)
2802         AC_CHECK_HEADERS(pathconf.h)
2803         AC_CHECK_HEADERS(fstab.h)
2804         AC_CHECK_HEADERS(attr/xattr.h)
2805         AC_CHECK_HEADERS(sys/extattr.h)
2806         AC_CHECK_HEADERS(sys/sendfile.h)
2807         AC_CHECK_HEADERS(sys/statvfs.h)
2808         AC_CHECK_HEADERS(sys/statfs.h)
2809         AC_CHECK_HEADERS(sys/vfstab.h)
2810         AC_CHECK_HEADERS(sys/xattr.h)
2811         AC_CHECK_HEADERS(sys/mman.h)
2812         AC_CHECK_HEADERS(sys/param.h)
2813         AC_CHECK_HEADERS(sys/mount.h, [], [],
2814                 [
2815                 #ifdef HAVE_SYS_PARAM_H
2816                 # include <sys/param.h>
2817                 #endif
2818                 ])
2819         AC_CHECK_HEADERS(sys/mount.h)
2820         AC_CHECK_FUNCS(confstr)
2821         AC_CHECK_FUNCS(seekdir telldir)
2822         AC_CHECK_FUNCS(getdomainname)
2823         AC_CHECK_FUNCS(setdomainname)
2824         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2825         AC_CHECK_FUNCS(setgroups)
2826         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2827         AC_CHECK_FUNCS(getfsstat)
2828         AC_CHECK_FUNCS(lutimes futimes)
2829         AC_CHECK_FUNCS(mremap)
2830         AC_CHECK_FUNCS(remap_file_pages)
2831         AC_CHECK_FUNCS(posix_fadvise)
2832         AC_CHECK_FUNCS(posix_fallocate)
2833         AC_CHECK_FUNCS(posix_madvise)
2834         AC_CHECK_FUNCS(vsnprintf)
2835         AC_CHECK_FUNCS(sendfile)
2836         AC_CHECK_FUNCS(gethostid sethostid)
2837         AC_CHECK_FUNCS(sethostname)
2838         AC_CHECK_FUNCS(statfs)
2839         AC_CHECK_FUNCS(fstatfs)
2840         AC_CHECK_FUNCS(statvfs)
2841         AC_CHECK_FUNCS(fstatvfs)
2842         AC_CHECK_FUNCS(stime)
2843         AC_CHECK_FUNCS(ttyname_r)
2844         AC_CHECK_FUNCS(psignal)
2845         AC_CHECK_FUNCS(getlogin_r)
2846         AC_CHECK_FUNCS(lockf)
2847         AC_CHECK_FUNCS(swab)
2848         AC_CHECK_FUNCS(setusershell endusershell)
2849         AC_CHECK_FUNCS(futimens utimensat)
2850         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2851         AC_CHECK_FUNCS(readv writev preadv pwritev)
2852         AC_CHECK_FUNCS(setpgid)
2853         AC_CHECK_FUNCS(system)
2854         AC_CHECK_FUNCS(fork execv execve)
2855         AC_CHECK_FUNCS(accept4)
2856         AC_CHECK_FUNCS(localtime_r)
2857         AC_CHECK_FUNCS(mkdtemp)
2858         AC_CHECK_SIZEOF(size_t)
2859         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2860                 [#include <sys/types.h>
2861                  #include <sys/stat.h>
2862                  #include <unistd.h>])
2863         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2864                 [#include <sys/types.h>
2865                  #include <sys/stat.h>
2866                  #include <unistd.h>])
2867         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2868                 [#include <sys/time.h>])
2869         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2870                 [#include <sys/socket.h>])
2871         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2872                 [#include <unistd.h>
2873                  #include <fcntl.h>])
2874         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2875                 [#include <sys/uio.h>])
2876         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2877                 [#include <sys/socket.h>])
2878         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2879                 [#include <sys/poll.h>])
2880         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2881                 [#include <sys/socket.h>])
2882         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2883                 [#include <sys/socket.h>])
2884         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2885                 [#include <netinet/in.h>])
2886         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2887                 [#include <netinet/in.h>])
2888         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2889                 [#include <sys/un.h>])
2890         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2891                 [#include <sys/types.h>
2892                  #include <sys/stat.h>
2893                  #include <unistd.h>])
2894         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2895                 [#include <time.h>])
2896         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2897                 [#include <sys/time.h>
2898                  #include <sys/types.h>
2899                  #include <utime.h>])
2900         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2901                 [#include <sys/time.h>])
2902         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2903                 [#include <sys/types.h>
2904                  #include <utime.h>])
2905         AC_CHECK_MEMBERS(
2906                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2907                 [#include <sys/types.h>
2908                  #include <dirent.h>])
2909         AC_CHECK_MEMBERS(
2910                 [struct passwd.pw_gecos],,, 
2911                 [#include <sys/types.h>
2912                  #include <pwd.h>])
2913         AC_CHECK_MEMBERS(
2914                 [struct statfs.f_flags],,, 
2915                 [#include <sys/types.h>
2916                  #include <sys/vfs.h>])
2917         AC_CHECK_MEMBERS(
2918                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2919                 [#include <sys/types.h>
2920                  #include <sys/stat.h>
2921                  #include <unistd.h>])
2923         dnl Favour xattr through glibc, but use libattr if we have to
2924         AC_CHECK_FUNC(lsetxattr, ,
2925                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2926         )
2927         AC_SUBST(XATTR_LIB)
2929         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2930         AC_CHECK_MEMBERS(
2931                 [struct kinfo_proc.kp_proc],,, 
2932                 [#include <sys/types.h>
2933                  #include <sys/param.h>
2934                  #include <sys/sysctl.h>
2935                  #include <sys/proc.h>
2936                  ])
2938         dnl *********************************
2939         dnl *** Checks for Windows compilation ***
2940         dnl *********************************
2941         AC_CHECK_HEADERS(sys/time.h)
2942         AC_CHECK_HEADERS(sys/param.h)
2943         AC_CHECK_HEADERS(dirent.h)
2945         dnl ******************************************
2946         dnl *** Checks for OSX and iOS compilation ***
2947         dnl ******************************************
2948         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2950         dnl *********************************
2951         dnl *** Check for Console 2.0 I/O ***
2952         dnl *********************************
2953         AC_CHECK_HEADERS([curses.h])
2954         AC_CHECK_HEADERS([term.h], [], [],
2955         [#if HAVE_CURSES_H
2956          #include <curses.h>
2957          #endif
2958         ])
2959         AC_CHECK_HEADERS([termios.h])
2961         dnl *********************************
2962         dnl *** Checks for random         ***
2963         dnl *********************************
2964         if test x$host_darwin = xno; then
2965                 AC_CHECK_HEADERS(sys/random.h)
2966                 AC_CHECK_FUNCS(getrandom getentropy)
2967         fi
2969         dnl *********************************
2970         dnl *** Checks for Mono.Native  ***
2971         dnl *********************************
2973         AC_MSG_CHECKING(for linux/in.h)
2974         AC_TRY_COMPILE([
2975                 #include <sys/socket.h>
2976                 #include <linux/in.h>
2977         ], [
2978         ],[
2979                 AC_MSG_RESULT(yes)
2980                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
2981         ], [
2982                 AC_MSG_RESULT(no)
2983         ])
2985         AC_MSG_CHECKING(for struct in_pktinfo)
2986         AC_TRY_COMPILE([
2987                 #ifdef HAVE_LINUX_IN_H
2988                 #include <sys/socket.h>
2989                 #include <linux/in.h>
2990                 #else
2991                 #include <netinet/in.h>
2992                 #endif
2993         ], [
2994                 struct in_pktinfo pktinfo;
2995         ],[
2996                 AC_MSG_RESULT(yes)
2997                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
2998         ], [
2999                 AC_MSG_RESULT(no)
3000         ])
3002         AC_MSG_CHECKING(for struct ip_mreqn)
3003         AC_TRY_COMPILE([
3004                 #if HAVE_LINUX_IN_H
3005                 #include <sys/socket.h>
3006                 #include <linux/in.h>
3007                 #else
3008                 #include <netinet/in.h>
3009                 #endif
3010         ], [
3011                 struct ip_mreqn mreqn;
3012         ],[
3013                 AC_MSG_RESULT(yes)
3014                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3015         ], [
3016                 AC_MSG_RESULT(no)
3017         ])
3019         if test x$host_darwin = xno; then
3020                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3021         fi
3023         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3024         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3025         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3026         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3027         AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3028         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3029         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3030         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3031         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3032         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3033         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3034         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3035         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3036         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3037         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3038         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3039         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3040         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3041         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3042         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3044         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3045         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3047         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>]])
3048         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>]])
3049         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>]])
3050         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>]])
3051         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3052         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3053         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3055         AC_MSG_CHECKING(for struct statfs)
3056         AC_TRY_COMPILE([
3057                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3058                 #include <sys/mount.h>
3059                 #else
3060                 #include <sys/statfs.h>
3061                 #endif
3062         ], [
3063                 struct statfs;
3064         ],[
3065                 AC_MSG_RESULT(yes)
3066                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3067         ], [
3068                 AC_MSG_RESULT(no)
3069         ])
3071         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3072                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3073         fi
3075         AC_MSG_CHECKING(for readdir_r)
3076         AC_TRY_COMPILE([
3077                 #include <dirent.h>
3078         ], [
3079                 DIR* dir;
3080                 struct dirent* entry;
3081                 struct dirent* result;
3082                 readdir_r(dir, entry, &result);
3083         ],[
3084                 AC_MSG_RESULT(yes)
3085                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3086         ], [
3087                 AC_MSG_RESULT(no)
3088         ])
3090         AC_MSG_CHECKING(for kevent with void *data)
3091         AC_TRY_COMPILE([
3092                 #include <sys/types.h>
3093                 #include <sys/event.h>
3094         ], [
3095                 struct kevent event;
3096                 void* data;
3097                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3098         ],[
3099                 AC_MSG_RESULT(yes)
3100                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3101         ], [
3102                 AC_MSG_RESULT(no)
3103         ])
3105         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3106         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3108         AC_MSG_CHECKING(for sendfile with 4 arguments)
3109         AC_TRY_COMPILE([
3110                 #include <sys/sendfile.h>
3111         ], [
3112                 int result = sendfile(0, 0, 0, 0);
3113         ],[
3114                 AC_MSG_RESULT(yes)
3115                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3116         ], [
3117                 AC_MSG_RESULT(no)
3118         ])
3120         AC_MSG_CHECKING(for sendfile with 6 arguments)
3121         AC_TRY_LINK([
3122                 #include <stdlib.h>
3123                 #include <sys/types.h>
3124                 #include <sys/socket.h>
3125                 #include <sys/uio.h>
3126         ], [
3127                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3128         ],[
3129                 AC_MSG_RESULT(yes)
3130                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3131         ], [
3132                 AC_MSG_RESULT(no)
3133         ])
3135         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3136         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3137         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3138         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3140         ORIG_CFLAGS="$CFLAGS"
3141         CFLAGS="-Werror -Wsign-conversion"
3143         AC_MSG_CHECKING(for getnameinfo with signed flags)
3144         AC_TRY_COMPILE([
3145                 #include <sys/types.h>
3146                 #include <netdb.h>
3147         ], [
3148                 const struct sockaddr *addr;
3149                 socklen_t addrlen;
3150                 char *host;
3151                 socklen_t hostlen;
3152                 char *serv;
3153                 socklen_t servlen;
3154                 int flags;
3155                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3156         ],[
3157                 AC_MSG_RESULT(yes)
3158                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3159         ], [
3160                 AC_MSG_RESULT(no)
3161         ])
3163         CFLAGS="$ORIG_CFLAGS"
3165         if test "x$host_linux" = "xyes"; then
3166                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3167         else
3168                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3169         fi
3171         ORIG_CFLAGS="$CFLAGS"
3172         CFLAGS="-Werror -Wsign-conversion"
3174         AC_MSG_CHECKING(for bind with unsigned addrlen)
3175         AC_TRY_COMPILE([
3176                 #include <sys/socket.h>
3177         ], [
3178                 int fd;
3179                 struct sockaddr* addr;
3180                 socklen_t addrLen;
3181                 bind(fd, addr, addrLen);
3182         ],[
3183                 AC_MSG_RESULT(yes)
3184                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3185         ], [
3186                 AC_MSG_RESULT(no)
3187         ])
3189         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3190         AC_TRY_COMPILE([
3191                 #include <netinet/in.h>
3192                 #include <netinet/tcp.h>
3193         ], [
3194                 struct ipv6_mreq opt;
3195                 unsigned int index = 0;
3196                 opt.ipv6mr_interface = index;
3197         ],[
3198                 AC_MSG_RESULT(yes)
3199                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3200         ], [
3201                 AC_MSG_RESULT(no)
3202         ])
3204         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3205         AC_TRY_COMPILE([
3206                 #include <sys/inotify.h>
3207         ], [
3208                 intptr_t fd;
3209                 uint32_t wd;
3210                 int result = inotify_rm_watch(fd, wd);
3211         ],[
3212                 AC_MSG_RESULT(yes)
3213                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3214         ], [
3215                 AC_MSG_RESULT(no)
3216         ])
3218         CFLAGS="$ORIG_CFLAGS"
3220         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3221         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3222                 AC_MSG_RESULT(no)
3223         else
3224                 AC_TRY_RUN([
3225                         #include <sys/mman.h>
3226                         #include <fcntl.h>
3227                         #include <unistd.h>
3229                         int main ()
3230                         {
3231                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3232                                 if (fd == -1)
3233                                         return -1;
3235                                 shm_unlink("/mono_configure_shm_open");
3237                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3238                                 //       on at least the current version of Mac OS X
3240                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3241                                         return -1;
3243                                 return 0;
3244                         }
3245                 ],[
3246                         AC_MSG_RESULT(yes)
3247                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3248                 ], [
3249                         AC_MSG_RESULT(no)
3250                 ])
3251         fi
3253         AC_MSG_CHECKING(for getpriority with int who)
3254         AC_TRY_COMPILE([
3255                 #include <sys/resource.h>
3256         ], [
3257                 int which;
3258                 int who;
3259                 int result = getpriority(which, who);
3260         ],[
3261                 AC_MSG_RESULT(yes)
3262                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3263         ], [
3264                 AC_MSG_RESULT(no)
3265         ])
3267         AC_MSG_CHECKING(for kevent with int parameters)
3268         AC_TRY_COMPILE([
3269                 #include <sys/types.h>
3270                 #include <sys/event.h>
3271         ], [
3272                 int kg;
3273                 const struct kevent* chagelist;
3274                 int nchanges;
3275                 struct kevent* eventlist;
3276                 int nevents;
3277                 const struct timespec* timeout;
3278                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3279         ],[
3280                 AC_MSG_RESULT(yes)
3281                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3282         ], [
3283                 AC_MSG_RESULT(no)
3284         ])
3286         ORIG_CFLAGS="$CFLAGS"
3287         CFLAGS="-Werror -Wimplicit-function-declaration"
3289         AC_MSG_CHECKING(for mkstemps)
3290         AC_TRY_COMPILE([
3291                 #include <stdlib.h>
3292                 #include <unistd.h>
3293                 #include <string.h>
3294         ], [
3295                 char *template;
3296                 int suffixlen;
3297                 int result = mkstemps(template, suffixlen);
3298         ],[
3299                 AC_MSG_RESULT(yes)
3300                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3301                 have_mkstemps=yes
3302         ], [
3303                 AC_MSG_RESULT(no)
3304         ])
3306         CFLAGS="$ORIG_CFLAGS"
3308         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3309                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3310         fi
3312         AC_MSG_CHECKING(for tcp/var.h)
3313         AC_TRY_COMPILE([
3314                 #include <sys/types.h>
3315                 #include <sys/socketvar.h>
3316                 #include <netinet/ip.h>
3317                 #include <netinet/tcp.h>
3318                 #include <netinet/tcp_var.h>
3319         ], [
3320         ],[
3321                 AC_MSG_RESULT(yes)
3322                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3323         ], [
3324                 AC_MSG_RESULT(no)
3325         ])
3327         AC_CHECK_HEADERS([sys/cdefs.h])
3329         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3330         AC_TRY_COMPILE([
3331                 #ifdef HAVE_SYS_CDEFS_H
3332                 #include <sys/cdefs.h>
3333                 #endif
3334                 #include <netinet/tcp.h>
3335         ], [
3336                 int result = TCP_ESTABLISHED;
3337         ],[
3338                 AC_MSG_RESULT(yes)
3339                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3340         ], [
3341                 AC_MSG_RESULT(no)
3342         ])
3344         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3346         AC_MSG_CHECKING(for struct rt_msghdr)
3347         AC_TRY_COMPILE([
3348                 #include <sys/types.h>
3349                 #include <net/route.h>
3350         ], [
3351                 struct rt_msghdr;
3352         ],[
3353                 AC_MSG_RESULT(yes)
3354                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3355         ], [
3356                 AC_MSG_RESULT(no)
3357         ])
3359         AC_CHECK_HEADERS([sys/sysctl.h])
3360         AC_CHECK_HEADERS([linux/rtnetlink.h])
3362         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3363         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3364         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3366         ORIG_CFLAGS="$CFLAGS"
3367         CFLAGS="-Werror -Weverything"
3369         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3370         AC_TRY_COMPILE([
3371                 #include <unistd.h>
3372         ], [
3373                 size_t namelen = 20;
3374                 char name[20];
3375                 int result = getdomainname(name, namelen);
3376         ],[
3377                 AC_MSG_RESULT(yes)
3378                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3379         ], [
3380                 AC_MSG_RESULT(no)
3381         ])
3383         CFLAGS="$ORIG_CFLAGS"
3385         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3386         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3387         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3389         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
3390                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3391         elif test "x$host_linux" = "xyes"; then
3392                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3393         fi
3395         AC_CHECK_HEADERS([crt_externs.h])
3397         AC_MSG_CHECKING(for _NSGetEnviron)
3398         AC_TRY_COMPILE([
3399                 #include <crt_externs.h>
3400         ], [
3401                 char **result = *(_NSGetEnviron());
3402         ],[
3403                 AC_MSG_RESULT(yes)
3404                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3405         ], [
3406                 AC_MSG_RESULT(no)
3407         ])
3409         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3411 else
3412         dnl *********************************
3413         dnl *** Checks for Windows compilation ***
3414         dnl *********************************
3415         AC_CHECK_HEADERS(winternl.h)
3417         jdk_headers_found=no
3418         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3419         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3420         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3421         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3422         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3423         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3424         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3426         dnl *********************************
3427         dnl *** Check for struct ip_mreqn ***
3428         dnl *********************************
3429         AC_MSG_CHECKING(for struct ip_mreqn)
3430         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3431                 struct ip_mreqn mreq;
3432                 mreq.imr_address.s_addr = 0;
3433         ], [
3434                 # Yes, we have it...
3435                 AC_MSG_RESULT(yes)
3436                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3437         ], [
3438                 # We'll just have to try and use struct ip_mreq
3439                 AC_MSG_RESULT(no)
3440                 AC_MSG_CHECKING(for struct ip_mreq)
3441                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3442                         struct ip_mreq mreq;
3443                         mreq.imr_interface.s_addr = 0;
3444                 ], [
3445                         # Yes, we have it...
3446                         AC_MSG_RESULT(yes)
3447                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3448                 ], [
3449                         # No multicast support
3450                         AC_MSG_RESULT(no)
3451                 ])
3452         ])
3454         dnl **********************************
3455         dnl *** Check for getaddrinfo ***
3456         dnl **********************************
3457         AC_MSG_CHECKING(for getaddrinfo)
3458                 AC_TRY_LINK([
3459                 #include <stdio.h>
3460                 #include <winsock2.h>
3461                 #include <ws2tcpip.h>
3462         ], [
3463                 getaddrinfo(NULL,NULL,NULL,NULL);
3464         ], [
3465                 # Yes, we have it...
3466                 AC_MSG_RESULT(yes)
3467                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3468         ], [
3469                 AC_MSG_RESULT(no)
3470         ])
3472         dnl **********************************
3473         dnl *** Check for gethostbyname ***
3474         dnl **********************************
3475         AC_MSG_CHECKING(for gethostbyname)
3476                 AC_TRY_LINK([
3477                 #include <stdio.h>
3478                 #include <winsock2.h>
3479                 #include <ws2tcpip.h>
3480         ], [
3481                 gethostbyname(NULL);
3482         ], [
3483                 # Yes, we have it...
3484                 AC_MSG_RESULT(yes)
3485                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3486         ], [
3487                 AC_MSG_RESULT(no)
3488         ])
3490         dnl **********************************
3491         dnl *** Check for getprotobyname ***
3492         dnl **********************************
3493         AC_MSG_CHECKING(for getprotobyname)
3494                 AC_TRY_LINK([
3495                 #include <stdio.h>
3496                 #include <winsock2.h>
3497                 #include <ws2tcpip.h>
3498         ], [
3499                 getprotobyname(NULL);
3500         ], [
3501                 # Yes, we have it...
3502                 AC_MSG_RESULT(yes)
3503                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3504         ], [
3505                 AC_MSG_RESULT(no)
3506         ])
3508         dnl **********************************
3509         dnl *** Check for getnameinfo ***
3510         dnl **********************************
3511         AC_MSG_CHECKING(for getnameinfo)
3512                 AC_TRY_LINK([
3513                 #include <stdio.h>
3514                 #include <winsock2.h>
3515                 #include <ws2tcpip.h>
3516         ], [
3517                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3518         ], [
3519                 # Yes, we have it...
3520                 AC_MSG_RESULT(yes)
3521                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3522         ], [
3523                 AC_MSG_RESULT(no)
3524         ])
3526         dnl **********************************
3527         dnl *** Check for inet_ntop ***
3528         dnl **********************************
3529         AC_MSG_CHECKING(for inet_ntop)
3530                 AC_TRY_LINK([
3531                 #include <stdio.h>
3532                 #include <winsock2.h>
3533                 #include <ws2tcpip.h>
3534         ], [
3535                 inet_ntop (0, NULL, NULL, 0);
3536         ], [
3537                 # Yes, we have it...
3538                 AC_MSG_RESULT(yes)
3539                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3540         ], [
3541                 AC_MSG_RESULT(no)
3542         ])
3544         dnl **********************************
3545         dnl *** Check for inet_pton ***
3546         dnl **********************************
3547         AC_MSG_CHECKING(for inet_pton)
3548                 AC_TRY_LINK([
3549                 #include <stdio.h>
3550                 #include <winsock2.h>
3551                 #include <ws2tcpip.h>
3552         ], [
3553                 #ifndef inet_pton
3554                 (void) inet_pton;
3555                 #endif
3556                 inet_pton (0, NULL, NULL);
3557         ], [
3558                 # Yes, we have it...
3559                 AC_MSG_RESULT(yes)
3560                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3561         ], [
3562                 AC_MSG_RESULT(no)
3563         ])
3565         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3566         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3567         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3568         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3569         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3570         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3571         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3574 dnl socklen_t check
3575 AC_MSG_CHECKING(for socklen_t)
3576 AC_TRY_COMPILE([
3577 #include <sys/types.h>
3578 #include <sys/socket.h>
3580   socklen_t foo;
3582 ac_cv_c_socklen_t=yes
3583         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3584         AC_MSG_RESULT(yes)
3586         AC_MSG_RESULT(no)
3589 AC_CHECK_FUNCS(execvp)
3591 dnl ****************************
3592 dnl *** Look for /dev/random ***
3593 dnl ****************************
3595 AC_MSG_CHECKING([if usage of random device is requested])
3596 AC_ARG_ENABLE(dev-random,
3597 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3598 try_dev_random=$enableval, try_dev_random=yes)
3600 AC_MSG_RESULT($try_dev_random)
3602 case "{$build}" in
3604 dnl IBM i does not have /dev/random, use unblocking only
3606     *-*-os400*)
3607     NAME_DEV_RANDOM="/dev/urandom"
3608     ;;
3610 dnl Win32 does not have /dev/random, they have their own method...
3612     *-mingw*|*-*-cygwin*)
3613     ac_cv_have_dev_random=no
3614     ;;
3616 dnl Everywhere else, it's /dev/random
3618     *)
3619     NAME_DEV_RANDOM="/dev/random"
3620     ;;
3621 esac
3623 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3625 dnl Now check if the device actually exists
3627 if test "x$try_dev_random" = "xyes"; then
3628     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3629     [if test -r "$NAME_DEV_RANDOM" ; then
3630         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3631     if test "x$ac_cv_have_dev_random" = "xyes"; then
3632         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3633     fi
3634 else
3635     AC_MSG_CHECKING(for random device)
3636     ac_cv_have_dev_random=no
3637     AC_MSG_RESULT(has been disabled)
3640 if test "x$host_win32" = "xyes"; then
3641     AC_DEFINE(HAVE_CRYPT_RNG)
3644 if test "x$ac_cv_have_dev_random" = "xno" \
3645     && test "x$host_win32" = "xno"; then
3646     AC_MSG_WARN([[
3648 *** A system-provided entropy source was not found on this system.
3649 *** Because of this, the System.Security.Cryptography random number generator
3650 *** will throw a NotImplemented exception.
3652 *** If you are seeing this message, and you know your system DOES have an
3653 *** entropy collection in place, please report an issue on GitHub and
3654 *** provide information about the system and how to access the random device.
3656 *** Otherwise you can install either egd or prngd and set the environment
3657 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3658 ***]])
3661 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)
3663 AC_MSG_CHECKING([if big-arrays are to be enabled])
3664 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)
3665 if test "x$enable_big_arrays" = "xyes" ; then
3666     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3667         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3668     else
3669         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3670     fi
3672 AC_MSG_RESULT($enable_big_arrays)
3674 dnl **************
3675 dnl *** DTRACE ***
3676 dnl **************
3678 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3680 if test "x$enable_dtrace" = "xyes"; then
3681    if test "x$has_dtrace" = "xno"; then
3682           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3683    fi
3684    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3685    if test "x$DTRACE" = "xno"; then
3686           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3687           enable_dtrace=no
3688    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3689           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3690           enable_dtrace=no
3691    fi
3694 dtrace_g=no
3695 if test "x$enable_dtrace" = "xyes"; then
3696         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3697         DTRACEFLAGS=
3698         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3699                 case "$host" in
3700                         powerpc-*-darwin*)
3701                         DTRACEFLAGS="-arch ppc64"
3702                         ;;
3703                         i*86-*-darwin*)
3704                         DTRACEFLAGS="-arch x86_64"
3705                         ;;
3706                         *)
3707                         DTRACEFLAGS=-64
3708                         ;;
3709                 esac
3710         else
3711                 case "$host" in
3712                         powerpc-*-darwin*)
3713                         DTRACEFLAGS="-arch ppc"
3714                         ;;
3715                         i*86-*-darwin*)
3716                         DTRACEFLAGS="-arch i386"
3717                         ;;
3718                         *)
3719                         DTRACEFLAGS=-32
3720                         ;;
3721                 esac
3722         fi
3723         AC_SUBST(DTRACEFLAGS)
3724         case "$host" in
3725                 *-*-solaris*)
3726                 dtrace_g=yes
3727                 ;;
3728         esac
3729         AC_CHECK_HEADERS([sys/sdt.h])
3731 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3732 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3734 dnl **************************
3735 dnl *** AOT cross offsets  ***
3736 dnl **************************
3738 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3739     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3741 dnl **************
3742 dnl ***  LLVM  ***
3743 dnl **************
3745 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3746 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3747 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)
3748 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3749 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3751 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3753 if test "x$enable_llvm" = "xdefault"; then
3754    enable_llvm=$enable_llvm_default
3757 internal_llvm="no"
3758 if test "x$enable_llvm" = "xyes"; then
3759         if test "x$with_llvm" != "x"; then
3760                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3761                 if test x$host_win32 = xyes; then
3762                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3763                 fi
3764                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3765                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3766                 fi
3767         else
3768                 if test x$host_win32 = xyes; then
3769                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3770                 else
3771                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3772                 fi
3773                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3774                         internal_llvm=yes
3775                 fi
3776         fi
3778         LLVM_CODEGEN_LIBS="x86codegen"
3779         case "$target" in
3780         arm*)
3781                 LLVM_CODEGEN_LIBS="armcodegen"
3782                 ;;
3783         aarch64*)
3784                 LLVM_CODEGEN_LIBS="aarch64codegen"
3785                 ;;
3786         powerpc*)
3787                 LLVM_CODEGEN_LIBS="powerpccodegen"
3788                 ;;
3789         esac
3790         if test "x$host" != "x$target"; then
3791                 # No need for jit libs
3792                 LLVM_CODEGEN_LIBS=
3793         fi
3795         AC_SUBST(LLVM_CODEGEN_LIBS)
3796         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3797         
3798         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3799 fi # ENABLE_LLVM
3801 # AC_DEFINE necessary for correct restore behavior on Linux
3802 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3803 if test "x$internal_llvm" != "xno"; then
3804    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3807 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3808 if test "x$enable_llvm_asserts" != "xno"; then
3809    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3812 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3814 if test "x$enable_loadedllvm" = "xyes"; then
3815    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3817 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3819 if test "x$enable_llvm" = "xyes"; then
3820    enable_llvm_runtime=yes
3822 if test "x$enable_llvm_runtime" = "xyes"; then
3823    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3825 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3827 TARGET="unknown"
3828 ACCESS_UNALIGNED="yes"
3830 LIBC="libc.so.6"
3831 INTL="libc.so.6"
3832 SQLITE="libsqlite.so.0"
3833 SQLITE3="libsqlite3.so.0"
3834 X11="libX11.so"
3835 GDKX11="libgdk-x11-2.0.so.0"
3836 GTKX11="libgtk-x11-2.0.so.0"
3837 XINERAMA="libXinerama.so.1"
3839 sizeof_register="SIZEOF_VOID_P"
3841 jit_wanted=true
3842 boehm_supported=true
3843 BTLS_SUPPORTED=no
3844 BTLS_PLATFORM=
3846 case "$host" in
3847         wasm32*)
3848                 TARGET=WASM
3849                 arch_target=wasm
3850                 BTLS_SUPPORTED=no
3851                 ACCESS_UNALIGNED="no"
3852                 with_tls=pthread
3853                 ;;
3854         mips*)
3855                 TARGET=MIPS;
3856                 arch_target=mips;
3857                 with_tls=pthread;
3858                 ACCESS_UNALIGNED="no"
3860                 AC_MSG_CHECKING(for mips n32)
3861                 AC_TRY_COMPILE([],[
3862                 #if _MIPS_SIM != _ABIN32
3863                 #error Not mips n32
3864                 #endif
3865                 ],[
3866                 AC_MSG_RESULT(yes)
3867                 sizeof_register=8
3868                 ],[
3869                 AC_MSG_RESULT(no)
3870                 ])
3871                 ;;
3872         i*86-*-*)
3873                 TARGET=X86;
3874                 arch_target=x86;
3875                 case $host_os in
3876                   solaris*)
3877                         LIBC="libc.so"
3878                         INTL="libintl.so"
3879                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3880                                 TARGET=AMD64
3881                                 arch_target=amd64
3882                         fi
3884                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3885                         # int astruct __attribute__ ((visibility ("hidden")));
3886                         # void foo ()
3887                         # {
3888                         #       void *p = &astruct;
3889                         # }
3890                         # gcc -fPIC --shared -o libfoo.so foo.c
3891                         # yields:
3892                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3893                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3894                         have_visibility_hidden=no
3895                         ;;
3896                   mingw*|cygwin*)
3897                         have_visibility_hidden=no
3898                         BTLS_SUPPORTED=no
3899                         BTLS_PLATFORM=i386
3900                         ;;
3901                   haiku*)
3902                         LIBC=libroot.so
3903                         ;;
3904                   linux*)
3905                         AOT_SUPPORTED="yes"
3906                         BTLS_SUPPORTED=yes
3907                         BTLS_PLATFORM=i386
3908                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3909                         ;;
3910                   darwin*)
3911                         AOT_SUPPORTED="yes"
3912                         BTLS_SUPPORTED=yes
3913                         BTLS_PLATFORM=i386
3914                         ;;
3915                   openbsd*|freebsd*|kfreebsd-gnu*)
3916                         AOT_SUPPORTED="yes"
3917                         BTLS_SUPPORTED=yes
3918                         BTLS_PLATFORM=i386
3919                         ;;
3920                 esac
3921                 ;;
3922         x86_64-*-* | amd64-*-*)
3923                 TARGET=AMD64;
3924                 arch_target=amd64;
3925                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3926                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3927                         sizeof_register=8
3928                 fi
3929                 case $host_os in
3930                   linux*)
3931                         AOT_SUPPORTED="yes"
3932                         BTLS_SUPPORTED=yes
3933                         BTLS_PLATFORM=x86_64
3934                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3935                         ;;
3936                   darwin*)
3937                         AOT_SUPPORTED="yes"
3938                         BTLS_SUPPORTED=yes
3939                         BTLS_PLATFORM=x86_64
3940                         boehm_supported=false
3941                         ;;
3942                   openbsd*|freebsd*|kfreebsd-gnu*)
3943                         AOT_SUPPORTED="yes"
3944                         BTLS_SUPPORTED=yes
3945                         BTLS_PLATFORM=x86_64
3946                         ;;
3947                   mingw*|cygwin*)
3948                         BTLS_SUPPORTED=no
3949                         BTLS_PLATFORM=x86_64
3950                         ;;
3951                 esac
3952                 ;;
3953         sparc*-*-*)
3954                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3955                    TARGET=SPARC64
3956                 else
3957                         TARGET=SPARC
3958                 fi
3959                 arch_target=sparc;
3960                 ACCESS_UNALIGNED="no"
3961                 case $host_os in
3962                   linux*) ;;
3963                   *)
3964                         LIBC="libc.so"
3965                         INTL="libintl.so"
3966                 esac
3967                 if test x"$GCC" = xyes; then
3968                         # We don't support v8 cpus
3969                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3970                 fi
3971                 if test x"$AR" = xfalse; then
3972                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3973                 fi
3974                 ;;
3975         *-mingw*|*-*-cygwin*)
3976                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3977                 have_visibility_hidden=no
3978                 INTL="intl"
3979                 ;;
3980         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3981         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3982         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
3983                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3984                         TARGET=POWERPC64;
3985                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3986                         if ! (echo $CC | grep -q -- 'clang'); then
3987                                 CFLAGS="$CFLAGS -mminimal-toc"
3988                         fi
3989                 else
3990                         TARGET=POWERPC;
3991                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3992                 fi
3993                 arch_target=ppc;
3994                 case $host_os in
3995                   aix*|os400*)
3996                         BTLS_SUPPORTED=yes
3997                         BTLS_PLATFORM=powerpc
3998                         dnl on AIX/PASE, shared libraries can be inside archives
3999                         dnl if they are, we specify them by lib.a(lib.so)
4000                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4001                         LIBC="libc.a(shr_64.o)"
4002                         INTL="libintl.a(libintl.so.8)"
4003                         ;;
4004                   linux*)
4005                         BTLS_SUPPORTED=yes
4006                         BTLS_PLATFORM=powerpc
4007                         ;;
4008                 esac
4009                 ;;
4010         armv7k-*-darwin*)
4011                 TARGET=ARM;
4012                 TARGET_SYS=WATCHOS
4013                 arch_target=arm;
4014                 arm_fpu=VFP_HARD
4015                 ACCESS_UNALIGNED="no"
4016                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4017                 ;;
4019         arm*-darwin*)
4020                 TARGET=ARM;
4021                 arch_target=arm;
4022                 ACCESS_UNALIGNED="no"
4023                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4024                 ;;
4025         arm*-linux*)
4026                 TARGET=ARM;
4027                 arch_target=arm;
4028                 ACCESS_UNALIGNED="no"
4029                 AOT_SUPPORTED="yes"
4030                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4031                 BTLS_SUPPORTED=yes
4032                 BTLS_PLATFORM=arm
4033                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4034                 case "$target" in
4035                 arm*-linux*-gnueabi)
4036                         BTLS_PLATFORM=armsoft
4037                         ;;
4038                 esac
4039                 ;;
4040         arm*-netbsd*-eabi*)
4041                 TARGET=ARM;
4042                 arch_target=arm;
4043                 ACCESS_UNALIGNED="no"
4044                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4045                 ;;
4046         aarch64-*)
4047                 # https://lkml.org/lkml/2012/7/15/133
4048                 TARGET=ARM64
4049                 arch_target=arm64
4050                 boehm_supported=false
4051                 AOT_SUPPORTED="yes"
4052                 BTLS_SUPPORTED=yes
4053                 BTLS_PLATFORM=aarch64
4054                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4055                 ;;
4056         s390x-*-linux*)
4057                 TARGET=S390X;
4058                 arch_target=s390x;
4059                 ACCESS_UNALIGNED="yes"
4060                 BTLS_SUPPORTED=yes
4061                 BTLS_PLATFORM=s390x
4062                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4063                 ;;
4064 esac
4066 HOST=$TARGET
4068 if test "x$host" != "x$target"; then
4069    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4070    enable_mcs_build=no
4071    enable_support_build=no
4072    BTLS_SUPPORTED=no
4073    # Can't use tls, since it depends on the runtime detection of tls offsets
4074    # in mono-compiler.h
4075    with_tls=pthread
4076    target_mach=no
4077    case "$target" in
4078    wasm32*)
4079                 TARGET=WASM
4080                 arch_target=wasm
4081                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4082                 ;;
4083    arm*-darwin*)
4084                 TARGET=ARM;
4085                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4086                 case "$target" in
4087                 armv7k-*)
4088                         arm_fpu=VFP_HARD
4089                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4090                         ;;
4091                 esac            
4092                 ;;
4093    powerpc64-ps3-linux-gnu)
4094                 TARGET=POWERPC64
4095                 arch_target=powerpc64
4096                 AC_DEFINE(TARGET_PS3, 1, [...])
4097                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4098                 # uses this define
4099                 AC_DEFINE(__mono_ppc64__, 1, [...])
4100                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
4101                 sizeof_register=8
4102                 target_byte_order=G_BIG_ENDIAN
4103                 ;;
4104    powerpc64-xbox360-linux-gnu)
4105                 TARGET=POWERPC64
4106                 arch_target=powerpc64
4107                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4108                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4109                 # uses this define
4110                 sizeof_register=8
4111                 target_byte_order=G_BIG_ENDIAN
4112                 ;;
4113    arm*-linux-*)
4114                 TARGET=ARM;
4115                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4116                 ;;
4117    arm*-netbsd*-eabi*)
4118                 TARGET=ARM;
4119                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4120                 ;;
4121    i686*-linux-*)
4122                 TARGET=X86;
4123                 ;;
4124    i*86-apple-*)
4125                 TARGET=X86;
4126                 ;;
4127    x86_64*-linux-*)
4128                 TARGET=AMD64;
4129                 ;;
4130    x86_64-ps4-freebsd)
4131                 TARGET=AMD64;
4132                 AC_DEFINE(TARGET_PS4, 1, [...])
4133                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4134                 CPPFLAGS="$CPPFLAGS"
4135                 target_win32=no
4136                 ;;
4137    aarch64*-linux-*)
4138                 TARGET=ARM64;
4139                 ;;
4140         aarch64-*)
4141                 TARGET=ARM64
4142                 ;;
4143         *)
4144                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4145         esac
4147         case "$target" in
4148         *-darwin*)
4149                 target_mach=yes
4150                 ;;
4151         *-linux-android*)
4152                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4153                 ;;
4154         esac
4157 case "$TARGET" in
4158 WASM)
4159         AC_DEFINE(TARGET_WASM, 1, [...])
4160         arch_target=wasm
4161         target_sizeof_void_p=4
4162         ;;
4163 X86)
4164         AC_DEFINE(TARGET_X86, 1, [...])
4165         arch_target=x86
4166         target_sizeof_void_p=4
4167         ;;
4168 AMD64)
4169         AC_DEFINE(TARGET_AMD64, 1, [...])
4170         arch_target=amd64
4171         ;;
4172 ARM)
4173         AC_DEFINE(TARGET_ARM, 1, [...])
4174         arch_target=arm
4175         ACCESS_UNALIGNED="no"
4176         target_sizeof_void_p=4
4177         ;;
4178 ARM64)
4179         AC_DEFINE(TARGET_ARM64, 1, [...])
4180         arch_target=arm64
4181         ;;
4182 POWERPC)
4183         AC_DEFINE(TARGET_POWERPC, 1, [...])
4184         ;;
4185 POWERPC64)
4186         AC_DEFINE(TARGET_POWERPC, 1, [...])
4187         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4188         ;;
4189 S390X)
4190         AC_DEFINE(TARGET_S390X, 1, [...])
4191         ;;
4192 MIPS)
4193         AC_DEFINE(TARGET_MIPS, 1, [...])
4194         ;;
4195 SPARC)
4196         AC_DEFINE(TARGET_SPARC, 1, [...])
4197         ;;
4198 SPARC64)
4199         AC_DEFINE(TARGET_SPARC64, 1, [...])
4200         ;;
4201 esac
4203 case "$HOST" in
4204 WASM)
4205         AC_DEFINE(HOST_WASM, 1, [...])
4206         ;;
4207 X86)
4208         AC_DEFINE(HOST_X86, 1, [...])
4209         ;;
4210 AMD64)
4211         AC_DEFINE(HOST_AMD64, 1, [...])
4212         ;;
4213 ARM)
4214         AC_DEFINE(HOST_ARM, 1, [...])
4215         ;;
4216 ARM64)
4217         AC_DEFINE(HOST_ARM64, 1, [...])
4218         ;;
4219 POWERPC)
4220         AC_DEFINE(HOST_POWERPC, 1, [...])
4221         ;;
4222 POWERPC64)
4223         AC_DEFINE(HOST_POWERPC, 1, [...])
4224         AC_DEFINE(HOST_POWERPC64, 1, [...])
4225         ;;
4226 S390X)
4227         AC_DEFINE(HOST_S390X, 1, [...])
4228         ;;
4229 MIPS)
4230         AC_DEFINE(HOST_MIPS, 1, [...])
4231         ;;
4232 SPARC)
4233         AC_DEFINE(HOST_SPARC, 1, [...])
4234         ;;
4235 SPARC64)
4236         AC_DEFINE(HOST_SPARC64, 1, [...])
4237         ;;
4238 esac
4240 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4241 case "$HOST" in
4242 X86 | AMD64 | ARM | ARM64)
4243         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4244         ;;
4245 esac
4247 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4248 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4250 dnl *************
4251 dnl *** VTUNE ***
4252 dnl *************
4254 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4255 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4257 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4259 if test "x$enable_vtune" = "xyes"; then
4260         if test "x$with_vtune" = "x"; then
4261                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4262         else
4263                 VTUNE_PATH=$with_vtune
4264         fi
4265         VTUNE_INCLUDE=$VTUNE_PATH/include
4266         case "$TARGET" in
4267         X86)
4268                 VTUNE_LIB=$VTUNE_PATH/lib32
4269                 ;;
4270         AMD64)
4271                 VTUNE_LIB=$VTUNE_PATH/lib64
4272                 ;;
4273         *)
4274                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4275                 ;;
4276         esac
4277         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4278                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4279         fi
4280         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4281                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4282         fi
4284         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4285         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4287         AC_SUBST(VTUNE_LIBS)
4288         AC_SUBST(VTUNE_CFLAGS)
4290 dnl Use GCC atomic ops if they work on the target.
4291 if test x$GCC = "xyes"; then
4292         case $TARGET in
4293         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
4294                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4295                 ;;
4296         esac
4299 if test "x$target_mach" = "xyes"; then
4301    if test "x$TARGET_SYS" = "xWATCHOS"; then
4302           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4303           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4304           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4305           BTLS_SUPPORTED=no
4306    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4307           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4308           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4309           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4310           BTLS_SUPPORTED=no
4311           target_ios=yes
4312    else
4313        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4314        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4315        #error fail this for ios
4316        #endif
4317        ], [
4318                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4319           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4320           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4321           target_osx=yes
4322        ], [
4323           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4324           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4325           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4326           BTLS_SUPPORTED=no
4327                   target_ios=yes
4328        ])
4329         fi
4330    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4333 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4335 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4337 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4338    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4339 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4340    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4341 else
4342    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4345 if test "x$target_sizeof_void_p" != "x"; then
4346    AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4347    # This is true for all the current cross-compiling targets
4348    AC_DEFINE(SIZEOF_REGISTER,TARGET_SIZEOF_VOID_P,[size of target machine integer registers])
4349 else
4350    AC_DEFINE(TARGET_SIZEOF_VOID_P,SIZEOF_VOID_P,[wordsize of target])
4351    if test "x$sizeof_register" = "x4"; then
4352       AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4353    elif test "x$sizeof_register" = "x8"; then
4354       AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4355    else
4356       AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of target machine integer registers])
4357    fi
4360 if test "x$have_visibility_hidden" = "xyes"; then
4361    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4364 if test "x$have_deprecated" = "xyes"; then
4365    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4368 dnl 
4369 dnl Simple Generational checks (sgen)
4371 SGEN_DEFINES=
4372 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4373 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4374 if test x$buildsgen = xyes; then
4375    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4376    SGEN_DEFINES="-DHAVE_SGEN_GC"
4378         conc_gc_msg=""
4379    if test x$with_sgen_default_concurrent != xno; then
4380        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4381            conc_gc_msg=" (concurrent by default)"
4382    fi
4384    if test "x$gc_msg" = "x"; then
4385       gc_msg="sgen$conc_gc_msg"
4386    else
4387       gc_msg="sgen$conc_gc_msg and $gc_msg"
4388    fi
4390 AC_SUBST(SGEN_DEFINES)
4391 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4393 jit_status="Building and using the JIT"
4395 libsuffix=".so"
4397 case "$host" in
4398      *-*-darwin*)
4399         libsuffix=".dylib"
4400         LIBC="libc.dylib"
4401         INTL="libintl.dylib"
4402         SQLITE="libsqlite.0.dylib"
4403         SQLITE3="libsqlite3.0.dylib"
4404         X11="libX11.dylib"
4405         GDKX11="libgdk-x11-2.0.dylib"
4406         GTKX11="libgtk-x11-2.0.dylib"
4407         ;;
4408      *-*-*netbsd*)
4409         LIBC="libc.so"
4410         INTL="libintl.so"
4411         SQLITE="libsqlite.so"
4412         SQLITE3="libsqlite3.so"
4413         ;;
4414      *-*-kfreebsd*-gnu)
4415         LIBC="libc.so.0.1"
4416         INTL="libc.so.0.1"
4417         X11="libX11.so.6"
4418         ;;
4419     *-*-*freebsd*)
4420         LIBC="libc.so.7"
4421         INTL="libintl.so"
4422         SQLITE="libsqlite.so"
4423         SQLITE3="libsqlite3.so"
4424         ;;
4425     *-*-*openbsd*)
4426         LIBC="libc.so"
4427         INTL="libintl.so"
4428         SQLITE="libsqlite.so"
4429         SQLITE3="libsqlite3.so"
4430         ;;
4431     *-*-*linux*)
4432         AC_PATH_X
4433         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4434         AC_MSG_CHECKING(for the soname of libX11.so)
4435         for i in $x_libraries $dlsearch_path; do
4436                 for r in 4 5 6; do
4437                         if test -f $i/libX11.so.$r; then
4438                                 X11=libX11.so.$r
4439                                 AC_MSG_RESULT($X11)
4440                         fi
4441                 done
4442         done
4443         
4444         if test "x$X11" = "xlibX11.so"; then
4445                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4446                 X11=libX11.so.6
4447         fi
4448         ;;
4449 esac
4451 AC_SUBST(libsuffix)
4453 ######################################
4454 # EGLIB CHECKS
4455 ######################################
4457 GNUC_PRETTY=
4458 GNUC_UNUSED=
4459 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4460 if test x$GCC = xyes; then
4461    GNUC_UNUSED='__attribute__((__unused__))'
4462    GNUC_NORETURN='__attribute__((__noreturn__))'
4463    case $host_cpu in
4464      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4465    esac
4467 AC_SUBST(GNUC_PRETTY)
4468 AC_SUBST(GNUC_UNUSED)
4469 AC_SUBST(GNUC_NORETURN)
4470 AC_SUBST(BREAKPOINT)
4472 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4474 case $host in
4475 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4476     PATHSEP='\\'
4477     SEARCHSEP=';'
4478     OS="WIN32"
4479     PIDTYPE='void *'
4480     ;;
4482     PATHSEP='/'
4483     SEARCHSEP=':'
4484     OS="UNIX"
4485     PIDTYPE='int'
4486     ;;
4487 esac
4489 case $host in
4490         *-*-solaris*)
4491         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4492         ;;
4493 esac
4495 case $target in
4496 arm*-darwin*|aarch64*-*)
4497     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4498     ;;
4499 i*86-*-darwin*)
4500     ORDER=G_LITTLE_ENDIAN
4501     ;;
4502 *-*-haiku*)
4503     LDFLAGS="$LDFLAGS -ltextencoding"
4504     ;;
4505 *-*-openbsd*)
4506     CFLAGS="$CFLAGS -pthread"
4507     LDFLAGS="$LDFLAGS -pthread"
4508     ;;
4509 esac
4511 AC_SUBST(ORDER)
4512 AC_SUBST(CFLAGS)
4513 AC_SUBST(PATHSEP)
4514 AC_SUBST(SEARCHSEP)
4515 AC_SUBST(OS)
4516 AC_SUBST(PIDTYPE)
4518 # Defined for all targets/platforms using classic Windows API support.
4519 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4520 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4522 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4523 AC_CHECK_FUNCS(getrlimit)
4524 AC_CHECK_FUNCS(fork execv execve)
4526 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4528 if test x$with_overridable_allocators = xyes; then
4529         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4530   AC_MSG_NOTICE([Overridable allocator support enabled])
4531 else
4532   AC_MSG_NOTICE([Overridable allocator support disabled])
4536 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4537 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4538 # removed once support for 10.6 is dropped.
4540 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4542 if test x$target_osx = xyes; then
4543 AC_CHECK_FUNCS(getpwuid_r)
4544 elif test x$target_ios = xno; then
4545 AC_CHECK_FUNCS(strndup getpwuid_r)
4548 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4550 AC_SEARCH_LIBS(sqrtf, m)
4552 # nanosleep may not be part of libc, also search it in other libraries
4553 AC_SEARCH_LIBS(nanosleep, rt)
4555 AC_SEARCH_LIBS(dlopen, dl)
4556 old_ldflags="${LDFLAGS}"
4557 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4558 if test $lt_cv_prog_gnu_ld = yes; then
4559         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4560 else
4561         case $host in
4562         *-*-aix*|*-*-os400*)
4563                 ;;
4564         *)
4565                 dnl Try to use export-dynamic anyways
4566                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4567                 ;;
4568         esac
4570 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4571 if test $found_export_dynamic = no; then
4572         LDFLAGS="${old_ldflags}"
4575 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4576 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4577 AC_CHECK_LIB(iconv, iconv_open)
4578 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4579 AC_SUBST(HAVE_ALLOCA_H)
4581 # Get the exact type of size_t, not just its size.
4582 # This is so we can find an exact printf format among u, lu, llu, I64u.
4583 # To avoid warnings about slight mismatches.
4584 # C99 runtime "zu" dependency is being avoided here.
4586 # We have to compile as C++ because C is too lenient
4587 # and lets the wrong thing compile, with warnings.
4589 # Note: "zu" or ifdef <something> have the advantage
4590 # of producing installable "biarch" headers. i.e. one Mac header
4591 # for Mac/x86 and Mac/amd64.
4593 AC_LANG_PUSH(C++)
4595 # Check long before int because it is the overwhelming Unix answer,
4596 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4598 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4600 AC_MSG_CHECKING(if size_t is unsigned long)
4601 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4602         #include <stddef.h>
4603         unsigned long *a = (size_t*)0;
4604 ])], [
4605         AC_MSG_RESULT(yes)
4606         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4607 ], [
4608         AC_MSG_RESULT(no)
4609         AC_MSG_CHECKING(if size_t is unsigned int)
4610         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4611                 #include <stddef.h>
4612                 unsigned *a = (size_t*)0;
4613         ])], [
4614                 AC_MSG_RESULT(yes)
4615                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4616         ], [
4617 # At this point the majority of systems have their answer,
4618 # and we descend into non-standard or new-standard territory.
4620 # Check __int64 first because I64 on some systems predates ll, enabling
4621 # new compiler/old runtime interop, and the types always have the same size.
4622                 AC_MSG_RESULT(no)
4623                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4624                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4625                         #include <stddef.h>
4626                         unsigned __int64 *a = (size_t*)0;
4627                 ])], [
4628                         AC_MSG_RESULT(yes)
4629                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4630                 ], [
4631                         AC_MSG_RESULT(no)
4632                         AC_MSG_CHECKING(if size_t is unsigned long long)
4633                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4634                                 #include <stddef.h>
4635                                 unsigned long long *a = (size_t*)0;
4636                         ])], [
4637                                 AC_MSG_RESULT(yes)
4638                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4639                         ], [
4640                                 AC_MSG_RESULT(no)
4641                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4642                         ] )
4643                 ] )
4644         ] )
4645 ] )
4647 AC_LANG_POP
4649 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4650 # This provides for an exact match with functions that
4651 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4652 # uintptr_t is not necessarily the same.
4654 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4655 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4657 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4658    GSIZE="size_t"
4659    GSSIZE="ptrdiff_t"
4660 else
4661    GSIZE="uintptr_t"
4662    GSSIZE="intptr_t"
4665 AC_SUBST(GSIZE)
4666 AC_SUBST(GSSIZE)
4667 AC_SUBST(GSIZE_FORMAT)
4670 # END OF EGLIB CHECKS
4673 AC_ARG_WITH([libgdiplus],
4674         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4675         [], [with_libgdiplus=installed])
4677 # default install location
4678 libgdiplus_install_loc=libgdiplus${libsuffix}
4679 case "$host" in
4680     *-*-*linux*)
4681     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4682     ;;
4683 esac
4685 case $with_libgdiplus in
4686     no)
4687     libgdiplus_loc=
4688     ;;
4690     installed)
4691     libgdiplus_loc=
4692     if test x$cross_compiling = xno; then
4693         if test x$host_darwin = xyes; then
4694             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4695             if test -x $a; then
4696               libgdiplus_install_loc=$a
4697               libgdiplus_loc=$a
4698             fi
4699         fi
4700     fi
4701     ;;
4703     yes|sibling)
4704     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4705     ;;
4707     /*) # absolute path, assume it is an install location
4708     libgdiplus_loc=$with_libgdiplus
4709     libgdiplus_install_loc=$with_libgdiplus
4710     ;;
4712     *)
4713     libgdiplus_loc=`pwd`/$with_libgdiplus
4714     ;;
4715 esac
4716 AC_SUBST(libgdiplus_loc)
4717 AC_SUBST(libgdiplus_install_loc)
4719 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)
4720 if test "x$icall_symbol_map" = "xyes"; then
4721    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4724 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4725 if test "x$icall_export" = "xyes"; then
4726    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4729 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4730 if test "x$icall_tables" = "xno"; then
4731    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4734 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4736 if test "x$with_tls" = "x__thread"; then
4737         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4738         # Pass the information to libgc
4739         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4740         AC_MSG_CHECKING(if the tls_model attribute is supported)
4741         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4742                 ], [
4743                         AC_MSG_RESULT(yes)
4744                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4745                 ], [
4746                         AC_MSG_RESULT(no)
4747         ])
4750 if test ${TARGET} = ARM; then
4751         dnl ******************************************
4752         dnl *** Check to see what FPU is available ***
4753         dnl ******************************************
4754         AC_MSG_CHECKING(which FPU to use)
4756         #
4757         # This is a bit tricky:
4758         #
4759         # if (__ARM_PCS_VFP) {
4760         #       /* mfloat-abi=hard == VFP with hard ABI */
4761         # } elif (!__SOFTFP__) {
4762         #       /* mfloat-abi=softfp == VFP with soft ABI */
4763         # } else {
4764         #       /* mfloat-abi=soft == no VFP */
4765         # }
4766         #
4767         # The exception is iOS (w/ GCC) where none of the above
4768         # are defined (but iOS always uses the 'softfp' ABI).
4769         #
4770         # No support for FPA.
4771         #
4773         fpu=NONE
4775         # iOS GCC always uses the 'softfp' ABI.
4776         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4777                 fpu=VFP
4778         fi
4780         # Are we using the 'hard' ABI?
4781         if test x$fpu = xNONE; then
4782                 AC_TRY_COMPILE([], [
4783                         #ifndef __ARM_PCS_VFP
4784                         #error "Float ABI is not 'hard'"
4785                         #endif
4786                 ], [
4787                         fpu=VFP_HARD
4788                 ], [
4789                         fpu=NONE
4790                 ])
4791         fi
4793         # No 'hard' ABI. 'soft' or 'softfp'?
4794         if test x$fpu = xNONE; then
4795                 AC_TRY_COMPILE([], [
4796                         #ifdef __SOFTFP__
4797                         #error "Float ABI is not 'softfp'"
4798                         #endif
4799                 ], [
4800                         fpu=VFP
4801                 ], [
4802                         fpu=NONE
4803                 ])
4804         fi
4806         if test x$arm_fpu != x; then
4807            fpu=$arm_fpu
4808         fi
4810         AC_MSG_RESULT($fpu)
4811         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4812         unset fpu
4814         dnl *********************************************
4815         dnl *** Check which ARM version(s) we can use ***
4816         dnl *********************************************
4817         AC_MSG_CHECKING(which ARM version to use)
4819         AC_TRY_COMPILE([], [
4820                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4821                 #error Not on ARM v5.
4822                 #endif
4823         ], [
4824                 arm_v5=yes
4826                 arm_ver=ARMv5
4827         ], [])
4829         AC_TRY_COMPILE([], [
4830                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4831                 #error Not on ARM v6.
4832                 #endif
4833         ], [
4834                 arm_v5=yes
4835                 arm_v6=yes
4837                 arm_ver=ARMv6
4838         ], [])
4840         AC_TRY_COMPILE([], [
4841                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4842                 #error Not on ARM v7.
4843                 #endif
4844         ], [
4845                 arm_v5=yes
4846                 arm_v6=yes
4847                 arm_v7=yes
4849                 arm_ver=ARMv7
4850         ], [])
4852         AC_MSG_RESULT($arm_ver)
4854         if test x$arm_v5 = xyes; then
4855                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4856                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4857         fi
4859         if test x$arm_v6 = xyes; then
4860                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4861                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4862         fi
4864         if test x$arm_v7 = xyes; then
4865                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4866                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4867         fi
4870 if test ${TARGET} = unknown; then
4871         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4872         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4875 if test "x$platform_android" = "xyes"; then
4876         case "x${TARGET}" in
4877         xARM)
4878                 case "x$arm_ver" in
4879                 xARMv5)
4880                         BTLS_SUPPORTED=yes
4881                         BTLS_PLATFORM=android-armv5
4882                         ;;
4883                 xARMv6)
4884                         BTLS_SUPPORTED=yes
4885                         BTLS_PLATFORM=android-armv6
4886                         ;;
4887                 xARMv7)
4888                         BTLS_SUPPORTED=yes
4889                         BTLS_PLATFORM=android-armv7
4890                         ;;
4891                 *)
4892                         BTLS_SUPPORTED=no
4893                         ;;
4894                 esac
4895                 ;;
4896         xARM64)
4897                 BTLS_SUPPORTED=yes
4898                 BTLS_PLATFORM=android-v8a
4899                 ;;
4900         xX86)
4901                 BTLS_SUPPORTED=yes
4902                 BTLS_PLATFORM=android-x86
4903                 ;;
4904         xAMD64)
4905                 BTLS_SUPPORTED=yes
4906                 BTLS_PLATFORM=android-x64
4907                 ;;
4908         *)
4909                 BTLS_SUPPORTED=no
4910                 ;;
4911         esac
4914 if test ${ACCESS_UNALIGNED} = no; then
4915         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4918 if test x$host_darwin = xyes; then
4919         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4920         AS_IF(
4921                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4922                 [AC_MSG_RESULT([no])],
4923                 [
4924                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4925                         AR_FLAGS="Scru"
4926                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4927                         AC_MSG_RESULT([yes])
4928                 ]
4929         )
4932 case "x$libgc" in
4933         xincluded)
4934                 # Pass CPPFLAGS to libgc configure
4935                 # We should use a separate variable for this to avoid passing useless and
4936                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4937                 # This should be executed late so we pick up the final version of CPPFLAGS
4938                 # The problem with this approach, is that during a reconfigure, the main
4939                 # configure scripts gets invoked with these arguments, so we use separate
4940                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4941                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4942                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4943                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4944                 fi
4945                 # Don't pass -finstrument-for-thread-suspension in, 
4946                 # if these are instrumented it will be very bad news 
4947                 # (infinite recursion, undefined parking behavior, etc)
4948                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4949                 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\""
4950                 if test "x$support_boehm" = "xyes"; then
4951                         AC_CONFIG_SUBDIRS(libgc)
4952                 fi
4953                 ;;
4954 esac
4956 MALLOC_MEMPOOLS=no
4957 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4958         if test x$with_malloc_mempools = xyes; then
4959                 MALLOC_MEMPOOLS=yes
4960                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4961         fi
4965 DISABLE_MCS_DOCS=default
4966 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4967         if test x$with_mcs_docs != xyes; then
4968                 DISABLE_MCS_DOCS=yes
4969         fi
4971 if test -n "$INSTALL_4_x_TRUE"; then :
4972         DISABLE_MCS_DOCS=yes
4974 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4975    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4978 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)],[
4979         if test x$with_lazy_gc_thread_creation != xno ; then
4980                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4981         fi
4982 ], [with_lazy_gc_thread_creation=no])
4984 dnl *****************************
4985 dnl *** Thread suspend policy ***
4986 dnl *****************************
4988 dnl Set a default hybrid or cooperative suspend on some platforms
4990 dnl Coop default is set by the bitcode preset.
4992 dnl If coop isn't on by default, maybe hybrid should be?
4993 if test x$enable_cooperative_suspend_default != xyes; then
4994         case $HOST in
4995         X86 | AMD64)
4996                 dnl Some host/target confusion, there's no host_osx (and
4997                 dnl host_darwin would be true on iOS not just macOS).
4998                 if test x$target_osx = xyes; then
4999                         enable_hybrid_suspend_default=yes
5000                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5001                         enable_hybrid_suspend_default=yes
5002                 fi
5003                 ;;
5004         esac
5007 dnl Now check if there were flags overriding the defaults
5009 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])
5010 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5012 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5013         enable_cooperative_suspend=$with_cooperative_gc
5016 if test x$enable_cooperative_suspend = xdefault; then
5017         enable_cooperative_suspend=$enable_cooperative_suspend_default
5020 if test x$enable_cooperative_suspend != xno; then
5021         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5024 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5026 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])
5028 if test x$enable_hybrid_suspend = xdefault; then
5029    enable_hybrid_suspend=$enable_hybrid_suspend_default
5032 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5033         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5036 if test x$enable_hybrid_suspend != xno ; then
5037         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5040 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5042 dnl End of thread suspend policy
5044 dnl ***************************
5045 dnl *** feature experiments ***
5046 dnl ***************************
5048 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5049 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5051         if test x$enable_experiment != x ; then
5052                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5053         fi
5054         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5055                 eval "mono_experiment_test_enable_$feature='yes'"
5056         done
5058         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5059                 eval "mono_experiment_test_enable_null='yes'"
5060                 true
5061         fi
5063         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5064                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5065         fi
5066 ],[])
5068 dnl **********************
5069 dnl *** checked builds ***
5070 dnl **********************
5072 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],[
5074         if test x$enable_checked_build != x ; then
5075                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5076         fi
5077         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5078                 eval "mono_checked_build_test_enable_$feature='yes'"
5079         done
5081         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5082                 eval "mono_checked_build_test_enable_gc='yes'"
5083                 eval "mono_checked_build_test_enable_metadata='yes'"
5084                 eval "mono_checked_build_test_enable_thread='yes'"
5085                 eval "mono_checked_build_test_enable_private_types='yes'"
5086         fi
5088         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5089                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5090         fi
5092         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5093                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5094         fi
5096         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5097                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5098         fi
5100         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5101                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5102         fi
5103 ], [])
5105 dnl End of checked builds
5107 AC_CHECK_HEADER([malloc.h], 
5108                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5109                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5111 if test x"$GCC" = xyes; then
5112         # Implicit function declarations are not 64 bit safe
5113         # Do this late, since this causes lots of configure tests to fail
5114         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5115         # jay has a lot of implicit declarations
5116         JAY_CFLAGS="-Wno-implicit-function-declaration"
5119 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5120 # instead of libmono-static.a
5121 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5122    LIBMONO_LA=libmini-static.la
5123 else
5124    if test x$buildsgen = xyes; then
5125       LIBMONO_LA=libmonosgen-$API_VER.la
5126    else
5127       LIBMONO_LA=libmonoboehm-$API_VER.la
5128    fi
5130 AC_SUBST(LIBMONO_LA)
5132 dnl **************
5133 dnl ***  Btls  ***
5134 dnl **************
5136 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5137 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5138 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5140 if test "x$enable_btls" = "xno"; then
5141    enable_btls_lib=no
5144 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5146 btls_android=no
5147 if test "x$enable_btls" = "xyes"; then
5148         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5149         if test "x$CMAKE" = "xno"; then
5150                 AC_MSG_ERROR("cmake not found")
5151         fi
5153         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5154         AC_SUBST(BTLS_ROOT)
5156         btls_arch=
5157         btls_cflags=
5158         BTLS_CMAKE_ARGS=
5160         if test "x$host_win32" = "xyes"; then
5161                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5162         fi
5164         case "$BTLS_PLATFORM" in
5165         i386)
5166                 btls_arch=i386
5167                 btls_cflags="-m32"
5168                 case $host_os in
5169                         darwin*)
5170                                 btls_cflags="$btls_cflags -arch i386"
5171                                 ;;
5172                         mingw*|cygwin*)
5173                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5174                                 if test "x$HAVE_YASM" != "xyes"; then
5175                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5176                                 fi
5177                                 ;;
5178                 esac
5179                 ;;
5180         x86_64)
5181                 btls_arch=x86_64
5182                 case $host_os in
5183                         mingw*|cygwin*)
5184                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5185                                 if test "x$HAVE_YASM" != "xyes"; then
5186                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5187                                 fi
5188                                 ;;
5189                 esac
5190                 ;;
5191         arm)
5192                 btls_arch=arm
5193                 btls_cflags="-DOPENSSL_NO_ASM=1"
5194                 ;;
5195         armsoft)
5196                 btls_arch=arm
5197                 btls_cflags="-DOPENSSL_NO_ASM=1"
5198                 ;;
5199         aarch64)
5200                 btls_arch=aarch64
5201                 btls_cflags="-march=armv8-a+crypto"
5202                 ;;
5203         s390x)
5204                 btls_arch=s390x
5205                 ;;
5206         powerpc)
5207                 btls_arch=powerpc
5208                 case $host_os in
5209                         aix*|os400*)
5210                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5211                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5212                 esac
5213                 ;;
5214         android-armv5)
5215                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5216                 ;;
5217         android-armv6)
5218                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5219                 ;;
5220         android-armv7)
5221                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5222                 ;;
5223         android-v8a)
5224                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5225                 ;;
5226         android-x86)
5227                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5228                 ;;
5229         android-x64)
5230                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5231                 ;;
5232         *)
5233                 AC_MSG_ERROR(Invalid BTLS platform)
5234         esac
5236         if test "x$platform_android" = "xyes"; then
5237                 btls_android=yes
5238                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5239                 if test "x$with_btls_android_ndk" != "x"; then
5240                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5241                 else
5242                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5243                 fi
5244         fi
5246         if test "x$btls_arch" != "x"; then
5247                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5248         fi
5250         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5251         AC_SUBST(BTLS_ARCH)
5252         AC_SUBST(BTLS_CFLAGS)
5253         AC_SUBST(BTLS_PLATFORM)
5254         AC_SUBST(BTLS_CMAKE_ARGS)
5256         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5257 else
5258         enable_btls=no
5261 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5263 if test x$DISABLE_MCS_DOCS = xyes; then
5264    docs_dir=""
5265 else
5266    docs_dir=docs
5268 AC_SUBST(docs_dir)
5270 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5271 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5272 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5274 libmono_ldflags="$libmono_ldflags $LIBS"
5276 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5277 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5278 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5279 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5280 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5281 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5282 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5283 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5284 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5285 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5286 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5287 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5288 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5289 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5290 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5291 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5292 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5293 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5295 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5297 AC_SUBST(LIBC)
5298 AC_SUBST(INTL)
5299 AC_SUBST(SQLITE)
5300 AC_SUBST(SQLITE3)
5301 AC_SUBST(X11)
5302 AC_SUBST(GDKX11)
5303 AC_SUBST(GTKX11)
5304 AC_SUBST(XINERAMA)
5305 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5306 AC_SUBST(arch_target)
5307 AC_SUBST(CFLAGS)
5308 AC_SUBST(CPPFLAGS)
5309 AC_SUBST(LDFLAGS)
5311 #This must always be defined when building the runtime
5312 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5314 mono_build_root=`pwd`
5315 AC_SUBST(mono_build_root)
5317 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5318 if test x$host_win32 = xno; then
5319         if test x$enable_msvc = xyes; then
5320                 echo "Error, --enable-msvc only supported for Windows builds."
5321                 exit 1
5322         fi
5324 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5326 if test "x$enable_msvc" = "xyes"; then
5327         if test "x$support_boehm" = "xyes"; then
5328                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5329                 exit 1
5330         fi
5331         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5332         if test "x$host_cpu" = "xi686"; then
5333                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5334                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5335                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5336         else
5337                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5338                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5339                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5340         fi
5341         AC_SUBST(mono_msvc_build_dir)
5342         AC_SUBST(mono_msvc_build_lib_dir)
5343         AC_SUBST(mono_msvc_build_bin_dir)
5344 else
5345         mono_runtime=mono/mini/mono
5348 AC_SUBST(mono_runtime)
5350 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5352 if test $csc_compiler = mcs; then
5353   CSC=$mcs_topdir/class/lib/build/mcs.exe
5354 else
5355   CSC=$CSC_LOCATION
5358 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5360 mono_cfg_root=$mono_build_root/runtime
5361 if test x$host_win32 = xyes; then
5362   if test "x$cross_compiling" = "xno"; then
5363     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5364     CSC=`cygpath -m -a $CSC`
5365     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5366   else
5367     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5368   fi
5369 else
5370   mono_cfg_dir=$mono_cfg_root/etc
5372 AC_SUBST(mono_cfg_dir)
5374 AC_SUBST(CSC)
5376 AC_CONFIG_FILES([po/mcs/Makefile.in])
5378 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5379 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5381 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5382 [   depth=../../../..
5383     case $srcdir in
5384     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5385     .) reldir=$depth ;;
5386     *) reldir=$depth/$srcdir ;;
5387     esac
5388     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5389     cd runtime/etc/mono/1.0
5390     rm -f machine.config
5391     $LN_S $reldir/data/net_1_1/machine.config machine.config
5392     cd $depth
5393 ],[LN_S='$LN_S'])
5395 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5396 [   depth=../../../..
5397     case $srcdir in
5398     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5399     .) reldir=$depth ;;
5400     *) reldir=$depth/$srcdir ;;
5401     esac
5402     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5403     cd runtime/etc/mono/2.0
5404     rm -f machine.config
5405     $LN_S $reldir/data/net_2_0/machine.config machine.config
5406     cd $depth
5407 ],[LN_S='$LN_S'])
5409 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5410 [   depth=../../../..
5411     case $srcdir in
5412     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5413     .) reldir=$depth ;;
5414     *) reldir=$depth/$srcdir ;;
5415     esac
5416     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5417     cd runtime/etc/mono/2.0
5418     rm -f web.config
5419     $LN_S $reldir/data/net_2_0/web.config web.config
5420     cd $depth
5421 ],[LN_S='$LN_S'])
5423 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5424 [   depth=../../..
5425     case $srcdir in
5426     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5427     .) reldir=$depth ;;
5428     *) reldir=$depth/$srcdir ;;
5429     esac
5430     $ac_aux_dir/install-sh -d runtime/etc/mono/
5431     cd runtime/etc/mono/
5432     rm -f browscap.ini
5433     $LN_S $reldir/data/browscap.ini browscap.ini
5434     cd $depth
5435 ],[LN_S='$LN_S'])
5437 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5438 [   depth=../../../../..
5439     case $srcdir in
5440     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5441     .) reldir=$depth ;;
5442     *) reldir=$depth/$srcdir ;;
5443     esac
5444     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5445     cd runtime/etc/mono/2.0/Browsers
5446     rm -f Compat.browser
5447     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5448     cd $depth
5449 ],[LN_S='$LN_S'])
5451 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5452 [   depth=../../../../..
5453     case $srcdir in
5454     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5455     .) reldir=$depth ;;
5456     *) reldir=$depth/$srcdir ;;
5457     esac
5458     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5459     cd runtime/etc/mono/4.0/Browsers
5460     rm -f Compat.browser
5461     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5462     cd $depth
5463 ],[LN_S='$LN_S'])
5465 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5466 [   depth=../../../../..
5467     case $srcdir in
5468     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5469     .) reldir=$depth ;;
5470     *) reldir=$depth/$srcdir ;;
5471     esac
5472     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5473     cd runtime/etc/mono/4.5/Browsers
5474     rm -f Compat.browser
5475     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5476     cd $depth
5477 ],[LN_S='$LN_S'])
5479 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5480 [   depth=../../../..
5481     case $srcdir in
5482     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5483     .) reldir=$depth ;;
5484     *) reldir=$depth/$srcdir ;;
5485     esac
5486     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5487     cd runtime/etc/mono/4.0
5488     rm -f machine.config
5489     $LN_S $reldir/data/net_4_0/machine.config machine.config
5490     cd $depth
5491 ],[LN_S='$LN_S'])
5493 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5494 [   depth=../../../..
5495     case $srcdir in
5496     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5497     .) reldir=$depth ;;
5498     *) reldir=$depth/$srcdir ;;
5499     esac
5500     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5501     cd runtime/etc/mono/4.0
5502     rm -f web.config
5503     $LN_S $reldir/data/net_4_0/web.config web.config
5504     cd $depth
5505 ],[LN_S='$LN_S'])
5507 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5508 [   depth=../../../..
5509     case $srcdir in
5510     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5511     .) reldir=$depth ;;
5512     *) reldir=$depth/$srcdir ;;
5513     esac
5514     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5515     cd runtime/etc/mono/4.5
5516     rm -f machine.config
5517     $LN_S $reldir/data/net_4_5/machine.config machine.config
5518     cd $depth
5519 ],[LN_S='$LN_S'])
5521 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5522 [   depth=../../../..
5523     case $srcdir in
5524     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5525     .) reldir=$depth ;;
5526     *) reldir=$depth/$srcdir ;;
5527     esac
5528     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5529     cd runtime/etc/mono/4.5
5530     rm -f web.config
5531     $LN_S $reldir/data/net_4_5/web.config web.config
5532     cd $depth
5533 ],[LN_S='$LN_S'])
5535 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])
5536 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])
5537 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5539 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5540 if test x"$GCC" = xyes; then
5542         # incompatible-pointer-types requires gcc circa 5.x
5544         ORIG_CFLAGS=$CFLAGS
5545         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5546         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5547         AC_TRY_COMPILE([],[
5548         ], [
5549                 AC_MSG_RESULT(yes)
5550                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5551         ], [
5552                 AC_MSG_RESULT(no)
5553                 CFLAGS=$ORIG_CFLAGS
5554         ])
5558 # Mono.Native Support
5559 # -------------------
5560 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5561 # It is built as a stand-alone shared library and not bundled with the runtime because we
5562 # may need to build two different versions of it.
5564 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5565 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5567 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5568 # implementation accordingly.  We build a single `libmono_native` shared library.
5570 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5572 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5573 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5574 # depending on platform.
5576 # We build two versions of the shared library:
5577 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5578 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5580 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5581 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5582 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5584 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5585 # to verify that it's the correct version of it.
5588 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
5589 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
5591 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5592 if test x$target_osx = xyes; then
5593         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5594         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5595         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5596         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5597         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5598         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5599         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5600         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5601         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5603         mono_native=yes
5604         MONO_NATIVE_PLATFORM=macos
5605         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5606         AC_MSG_CHECKING([Mono.Native support])
5607         AC_MSG_RESULT(macos)
5609         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5610                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5612         if test x$mono_native_compat = xyes; then
5613                 mono_native_compat=yes
5614                 mono_native_text="Mac OSX (compat+unified)"
5615                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5616                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5617                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5618                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5619         else
5620                 mono_native_compat=no
5621                 mono_native_text="Mac OSX"
5622         fi
5623 elif test x$mono_native_platform_ios = xyes; then
5624         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5626         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5627                 if test x$mono_native_ios_sim = xyes; then
5628                         mono_native_ios_target=ios-simulator
5629                         mono_native_text="iOS Simulator"
5630                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5631                 else
5632                         mono_native_ios_target=iphoneos
5633                         mono_native_text="iOS Device"
5634                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5635                 fi
5636                 mono_native_unified_version="10.0"
5637                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5638         ], [
5639                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5640                         if test x$mono_native_ios_sim = xyes; then
5641                                 mono_native_ios_target=tvos-simulator
5642                                 mono_native_text="AppleTV Simulator"
5643                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5644                         else
5645                                 mono_native_ios_target=tvos
5646                                 mono_native_text="AppleTV Device"
5647                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5648                         fi
5649                         mono_native_unified_version="10.0"
5650                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5651                 ], [
5652                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5653                                 if test x$mono_native_ios_sim = xyes; then
5654                                         mono_native_ios_target=watchos-simulator
5655                                         mono_native_text="Apple Watch Simulator"
5656                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5657                                 else
5658                                         mono_native_ios_target=watchos
5659                                         mono_native_text="Apple Watch Device"
5660                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5661                                 fi
5662                                 mono_native_unified_version="5.0"
5663                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5664                         ], [
5665                                 AC_MSG_ERROR([Unknown iOS Target])
5666                         ])
5667                 ])
5668         ])
5670         AC_MSG_CHECKING([Mono.Native support])
5671         AC_MSG_RESULT([$mono_native_ios_target])
5673         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5675         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5676         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5678         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5680         mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5681         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5682         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5683         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5684         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5685         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5686         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5688         if test x$mono_native_compat = xyes; then
5689                 mono_native_text="$mono_native_text (compat+unified)"
5690                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5691                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5692                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5693                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5694         fi
5696         mono_native=yes
5697         MONO_NATIVE_PLATFORM=ios
5698 elif test x$host_linux = xyes; then
5699         mono_native_text="Linux"
5700         MONO_NATIVE_CC=$CC
5701         MONO_NATIVE_CXX=$CXX
5702         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5703         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5704         MONO_NATIVE_CFLAGS=$CFLAGS
5705         MONO_NATIVE_LDFLAGS=$LDFLAGS
5707         mono_native=yes
5708         mono_native_compat=no
5709         MONO_NATIVE_PLATFORM=linux
5710         AC_MSG_CHECKING([Mono.Native support])
5711         AC_MSG_RESULT(linux)
5713         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5714 else
5715         mono_native=no
5716         mono_native_text="no"
5717         AC_MSG_CHECKING([Mono.Native support])
5718         AC_MSG_RESULT(no)
5721 if test x$mono_native_compat = xyes; then
5722         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5723 else
5724         MONO_NATIVE_LIBRARY_NAME=libmono-native
5727 AC_SUBST(MONO_NATIVE_PLATFORM)
5728 AC_SUBST(MONO_NATIVE_CC)
5729 AC_SUBST(MONO_NATIVE_CXX)
5730 AC_SUBST(MONO_NATIVE_CPPFLAGS)
5731 AC_SUBST(MONO_NATIVE_CXXFLAGS)
5732 AC_SUBST(MONO_NATIVE_CFLAGS)
5733 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
5734 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
5735 AC_SUBST(MONO_NATIVE_LDFLAGS)
5736 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
5737 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
5738 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
5740 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
5741 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
5742 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
5743 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
5744 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
5746 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
5747 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
5748 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
5749 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
5750 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
5752 # Update all submodules recursively to ensure everything is checked out
5753 (cd $srcdir && scripts/update_submodules.sh)
5755 AC_OUTPUT([
5756 Makefile
5757 mono-uninstalled.pc
5758 acceptance-tests/Makefile
5759 llvm/Makefile
5760 scripts/mono-find-provides
5761 scripts/mono-find-requires
5762 mk/Makefile
5763 mono/Makefile
5764 mono/btls/Makefile
5765 mono/native/Makefile
5766 mono/utils/Makefile
5767 mono/utils/jemalloc/Makefile
5768 mono/metadata/Makefile
5769 mono/dis/Makefile
5770 mono/cil/Makefile
5771 mono/arch/Makefile
5772 mono/arch/x86/Makefile
5773 mono/arch/amd64/Makefile
5774 mono/arch/ppc/Makefile
5775 mono/arch/sparc/Makefile
5776 mono/arch/s390x/Makefile
5777 mono/arch/arm/Makefile
5778 mono/arch/arm64/Makefile
5779 mono/arch/mips/Makefile
5780 mono/sgen/Makefile
5781 mono/native/platform-type.c
5782 mono/native/platform-type-compat.c
5783 mono/native/platform-type-unified.c
5784 mono/tests/Makefile
5785 mono/tests/assembly-load-reference/Makefile
5786 mono/tests/tests-config
5787 mono/tests/gc-descriptors/Makefile
5788 mono/tests/testing_gac/Makefile
5789 mono/unit-tests/Makefile
5790 mono/benchmark/Makefile
5791 mono/mini/Makefile
5792 mono/profiler/Makefile
5793 mono/eglib/Makefile
5794 mono/eglib/eglib-config.h
5795 mono/eglib/test/Makefile
5796 m4/Makefile
5797 ikvm-native/Makefile
5798 scripts/Makefile
5799 man/Makefile
5800 docs/Makefile
5801 data/Makefile
5802 data/net_2_0/Makefile
5803 data/net_4_0/Makefile
5804 data/net_4_5/Makefile
5805 data/net_2_0/Browsers/Makefile
5806 data/net_4_0/Browsers/Makefile
5807 data/net_4_5/Browsers/Makefile
5808 data/mint.pc
5809 data/mono-2.pc
5810 data/monosgen-2.pc
5811 data/mono.pc
5812 data/mono-cairo.pc
5813 data/mono-nunit.pc
5814 data/mono-options.pc
5815 data/mono-lineeditor.pc
5816 data/monodoc.pc
5817 data/dotnet.pc
5818 data/dotnet35.pc
5819 data/wcf.pc
5820 data/cecil.pc
5821 data/system.web.extensions_1.0.pc
5822 data/system.web.extensions.design_1.0.pc
5823 data/system.web.mvc.pc
5824 data/system.web.mvc2.pc
5825 data/system.web.mvc3.pc
5826 data/aspnetwebstack.pc
5827 data/reactive.pc
5828 samples/Makefile
5829 support/Makefile
5830 data/config
5831 tools/Makefile
5832 tools/locale-builder/Makefile
5833 tools/sgen/Makefile
5834 tools/monograph/Makefile
5835 tools/pedump/Makefile
5836 runtime/Makefile
5837 msvc/Makefile
5838 po/Makefile
5841 if test x$host_win32 = xyes; then
5842    # Get rid of 'cyg' prefixes in library names
5843    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5844    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5845    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5846    # executable doesn't work...
5847    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5850 if test x$host_darwin = xyes; then
5851    # This doesn't seem to be required and it slows down parallel builds
5852    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5856   case $prefix in
5857   NONE) prefix=$ac_default_prefix ;;
5858   esac
5859   case $exec_prefix in
5860   NONE) exec_prefix='${prefix}' ;;
5861   esac
5863   #
5864   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5865   # any existing config.make.  This allows people to share the same source tree
5866   # with different build directories, one native and one cross
5867   #
5868   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5870     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5872     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5873     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5874     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5875     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5876     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5877     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5878     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5879     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5880     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5882     case $INSTALL in
5883     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5884     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5885     esac
5887     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5889     export VERSION
5890     [myver=$($AWK 'BEGIN {
5891       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5892       if(length(vsplit [1]) > 4) {
5893         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5894       }
5895       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5896     }')]
5898     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5899     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5901     if test x$host_darwin = xyes; then
5902       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
5903       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
5904       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5905     elif test x$host_win32 = xyes; then
5906       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5907       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5908       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5909     elif test x$host_linux = xyes; then
5910       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5911       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5912       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5913     else
5914       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
5915       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5916       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5917     fi
5919     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5920       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5921     fi
5923         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5924            enable_system_aot=yes
5925         fi
5927     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5928       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5929     fi
5931     if test x$DISABLE_MCS_DOCS = xyes; then
5932       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5933     fi
5935     if test x$has_extension_module != xno; then
5936         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5937     fi
5938     
5939     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5940     
5941     if test "x$test_bcl_opt" = "xyes"; then    
5942       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5943     fi
5945     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5947     if test $csc_compiler = mcs; then
5948       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5949     fi
5951     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5952       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5953       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5954       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5955     fi
5957     if test "x$AOT_MODE" != "x" ; then
5958       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5959     fi
5961     if test "x$enable_btls" = "xyes"; then
5962       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5963     fi
5965     if test "x$mono_native" = "xyes"; then
5966       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
5967     else
5968       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
5969     fi
5971     if test x$mono_native_compat = xyes; then
5972       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
5973     else
5974       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
5975     fi
5977     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
5978     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
5980   fi
5984 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5986 btls_platform_string=
5987 if test x$enable_btls = xyes; then
5988         if test x$btls_android = xyes; then
5989                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5990         else
5991                 btls_platform_string=" ($BTLS_PLATFORM)"
5992         fi
5995 thread_suspend_msg=
5996 if test x$buildsgen = xyes; then
5997         if test x$enable_cooperative_suspend != xno; then
5998                 thread_suspend_msg="Suspend:       Cooperative"
5999         elif test x$enable_hybrid_suspend != xno; then
6000                 thread_suspend_msg="Suspend:       Hybrid"
6001         else
6002                 thread_suspend_msg="Suspend:       Preemptive"
6003         fi
6005         
6006 echo "
6007         mcs source:    $mcsdir
6008         C# Compiler:   $csc_compiler
6010    Engine:
6011         Host:          $host
6012         Target:        $target
6013         GC:            $gc_msg 
6014         $thread_suspend_msg
6015         TLS:           $with_tls
6016         SIGALTSTACK:   $with_sigaltstack
6017         Engine:        $jit_status
6018         BigArrays:     $enable_big_arrays
6019         DTrace:        $enable_dtrace
6020         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
6021         Spectre:       $spectre_mitigation_status
6022         Mono.Native:   $mono_native_text
6024    Libraries:
6025         .NET 4.x:        $with_profile4_x
6026         Xamarin.Android: $with_monodroid
6027         Xamarin.iOS:     $with_monotouch
6028         Xamarin.WatchOS: $with_monotouch_watch
6029         Xamarin.TVOS:    $with_monotouch_tv
6030         Xamarin.Mac:     $with_xammac
6031         Windows AOT:     $with_winaot
6032         Orbis:           $with_orbis
6033         Unreal:          $with_unreal
6034         WebAssembly:     $with_wasm
6035         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6036         JNI support:     $jdk_headers_found
6037         libgdiplus:      $libgdiplus_msg
6038         zlib:            $zlib_msg
6039         BTLS:            $enable_btls$btls_platform_string
6040         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6041         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6042         $disabled
6044 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6045    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)