[jit] Implement Vector.IsHardwareAccelerated () as an intrinsics even if SIMD is...
[mono-project.git] / configure.ac
blob5e48556cf35175da555ed66497beae2575306cdf
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, assert_messages, 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_assert_messages" = "xyes"; then
1591         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1592         AC_MSG_NOTICE([Disabled assertion messages.])
1595 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1596         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1597         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1601 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1602         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1603         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1606 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1607         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1608         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1611 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1612         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1613         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1616 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1617 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1619 has_extension_module=no
1620 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1622         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1623                 if test x$extension = xdefault ; then
1624                         has_extension_module=yes;
1625                 fi
1626         done
1627         if test x$enable_extension_module = xyes; then
1628                 has_extension_module=yes;
1629         fi
1630 ], [])
1632 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1634 if test x$has_extension_module != xno ; then
1635         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1636         AC_MSG_NOTICE([Enabling mono extension module.])
1639 # Deprecated
1640 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1642 AC_MSG_CHECKING(for visibility __attribute__)
1643 AC_COMPILE_IFELSE([
1644         AC_LANG_SOURCE([[
1645                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1646                 int main () { doit (); return 0; }
1647         ]])
1648 ], [
1649    have_visibility_hidden=yes
1650    AC_MSG_RESULT(yes)
1651 ], [
1652    have_visibility_hidden=no
1653    AC_MSG_RESULT(no)
1657 dnl Boehm GC configuration
1660 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1662 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1663 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1665 if test "x$support_boehm" = "xyes"; then
1667         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1668         if test x$enable_parallel_mark = xyes; then
1669                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1670         fi
1672         gc_msg=""
1673         LIBGC_CPPFLAGS=
1674         LIBGC_LIBS=
1675         LIBGC_STATIC_LIBS=
1676         libgc_dir=
1677         case "x$libgc" in
1678                 xincluded)
1679                         if test "x$support_boehm" = "xyes"; then
1680                                 libgc_dir=libgc
1681                         fi
1683                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1684                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1685                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1687                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1689                         if test x$target_win32 = xyes; then
1690                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1691                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1692                         fi
1694                         gc_msg="Included Boehm GC with typed GC"
1695                         if test x$enable_parallel_mark = xyes; then
1696                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1697                                 gc_msg="$gc_msg and parallel mark"
1698                         else
1699                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1700                         fi
1701                         ;;
1703                 xboehm|xbohem|xyes)
1704                         AC_MSG_WARN("External Boehm is no longer supported")
1705                         ;;
1707                 xsgen)
1708                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1709                         ;;
1711                 xnone)
1712                         AC_MSG_WARN("Compiling mono without GC.")
1713                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1714                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1715                         gc_msg="none"
1716                         ;;
1717                 *)
1718                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1719                         ;;
1720         esac
1722         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])
1723         if test "x$large_heap" = "xyes"; then
1724            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1725         fi
1727         AC_SUBST(LIBGC_CPPFLAGS)
1728         AC_SUBST(LIBGC_LIBS)
1729         AC_SUBST(LIBGC_STATIC_LIBS)
1730         AC_SUBST(libgc_dir)
1731         AC_SUBST(BOEHM_DEFINES)
1734 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1737 dnl End of Boehm GC Configuration
1740 dnl *************************************
1741 dnl *** Checks for zero length arrays ***
1742 dnl *************************************
1743 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1744 AC_TRY_COMPILE([
1745         struct s {
1746                 int  length;
1747                 char data [0];
1748         };
1749 ], [], [
1750         AC_MSG_RESULT(yes)
1751         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1752 ], [
1753         AC_MSG_RESULT(no)
1754         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1757 dnl ***********************************
1758 dnl *** Checks for signals
1759 dnl ***********************************
1760 AC_CHECK_HEADERS(signal.h)
1761 AC_CHECK_FUNCS(sigaction)
1762 AC_CHECK_FUNCS(kill)
1763 AC_CHECK_FUNCS(signal)
1765 # signal() is declared inline in Android headers
1766 # so we need to workaround it by overriding the check.
1767 if test x$platform_android = xyes; then
1768         AC_DEFINE(HAVE_SIGNAL,1)
1771 dnl ***********************************
1772 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1773 dnl ***********************************
1774 enable_gss=no;
1775 AC_MSG_CHECKING(for GSS/GSS.h)
1776 AC_TRY_COMPILE([
1777     #include <GSS/GSS.h>
1778 ], [
1780     AC_MSG_RESULT(yes)
1781     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1782     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1783     enable_gss=yes
1784 ], [
1785     AC_MSG_RESULT(no)
1788 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1789 AC_TRY_COMPILE([
1790     #include <gssapi/gssapi_ext.h>
1791 ], [
1793     AC_MSG_RESULT(yes)
1794     enable_gss=yes
1795 ], [
1796     AC_MSG_RESULT(no)
1799 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1800 AC_TRY_COMPILE([
1801     #include <gssapi/gssapi_ext.h>
1802     #include <gssapi/gssapi_krb5.h>
1803     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1804 ], [
1806     AC_MSG_RESULT(yes)
1807     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1808 ], [
1809     AC_MSG_RESULT(no)
1812 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1814 if test x$host_win32 = xno; then
1815         dnl *************************************
1816         dnl *** Checks for time capabilities ***
1817         dnl *************************************
1819         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1820         AC_TRY_COMPILE([#include <time.h>], [
1821                 const int foo = CLOCK_MONOTONIC;
1822         ],[
1823                 AC_MSG_RESULT(yes)
1824                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1825         ], [
1826                 AC_MSG_RESULT(no)
1827         ])
1829         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1830         AC_TRY_COMPILE([#include <time.h>], [
1831                 const int foo = CLOCK_MONOTONIC_COARSE;
1832         ],[
1833                 AC_MSG_RESULT(yes)
1834                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1835         ], [
1836                 AC_MSG_RESULT(no)
1837         ])
1839         AC_MSG_CHECKING(for CLOCK_REALTIME)
1840         AC_TRY_COMPILE([#include <time.h>], [
1841                 const int foo = CLOCK_REALTIME;
1842         ],[
1843                 AC_MSG_RESULT(yes)
1844                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1845         ], [
1846                 AC_MSG_RESULT(no)
1847         ])
1849         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1850         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1851         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1852         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1853         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1854         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1856         dnl hires monotonic clock support
1857         AC_SEARCH_LIBS(clock_gettime, rt)
1858         AC_CHECK_FUNCS(clock_nanosleep)
1860         dnl dynamic loader support
1861         AC_CHECK_FUNC(dlopen, DL_LIB="",
1862                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1863         )
1864         if test x$dl_support = xno; then
1865                 AC_MSG_WARN([No dynamic loading support available])
1866         else
1867                 LIBS="$LIBS $DL_LIB"
1868                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1869                 dnl from glib's configure.ac
1870                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1871                         mono_cv_uscore,[
1872                         AC_TRY_RUN([#include <dlfcn.h>
1873                         int mono_underscore_test (void) { return 42; }
1874                         int main() {
1875                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1876                           handle = dlopen ((void*)0, 0);
1877                           if (handle) {
1878                             f1 = dlsym (handle, "mono_underscore_test");
1879                             f2 = dlsym (handle, "_mono_underscore_test");
1880                           } return (!f2 || f1);
1881                         }],
1882                                 [mono_cv_uscore=yes],
1883                                 [mono_cv_uscore=no],
1884                         [])
1885                 ])
1886                 if test "x$mono_cv_uscore" = "xyes"; then
1887                         MONO_DL_NEED_USCORE=1
1888                 else
1889                         MONO_DL_NEED_USCORE=0
1890                 fi
1891                 AC_SUBST(MONO_DL_NEED_USCORE)
1892                 AC_CHECK_FUNC(dlerror)
1893         fi
1895         dnl ******************************************************************
1896         dnl *** Checks for the IKVM JNI interface library                  ***
1897         dnl ******************************************************************
1898         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])
1900         ikvm_native_dir=
1901         if test x$with_ikvm_native = xyes; then
1902                 ikvm_native_dir=ikvm-native
1903                 jdk_headers_found="IKVM Native"
1904         fi
1906         AC_SUBST(ikvm_native_dir)
1908         AC_CHECK_HEADERS(execinfo.h)
1910         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1912         AC_CHECK_FUNCS(getgrgid_r)
1913         AC_CHECK_FUNCS(getgrnam_r)
1914         AC_CHECK_FUNCS(getresuid)
1915         AC_CHECK_FUNCS(setresuid)
1916         AC_CHECK_FUNCS(kqueue)
1917         AC_CHECK_FUNCS(backtrace_symbols)
1918         AC_CHECK_FUNCS(mkstemp)
1919         AC_CHECK_FUNCS(mmap)
1920         AC_CHECK_FUNCS(madvise)
1921         AC_CHECK_FUNCS(getrusage)
1922         AC_CHECK_FUNCS(getpriority)
1923         AC_CHECK_FUNCS(setpriority)
1924         AC_CHECK_FUNCS(dl_iterate_phdr)
1925         AC_CHECK_FUNCS(dladdr)
1926         AC_CHECK_FUNCS(sysconf)
1927         AC_CHECK_FUNCS(getrlimit)
1928         AC_CHECK_FUNCS(prctl)
1929         AC_CHECK_FUNCS(arc4random)
1930         AC_CHECK_FUNCS(nl_langinfo)
1932         AC_CHECK_FUNCS(sched_getaffinity)
1933         AC_CHECK_FUNCS(sched_setaffinity)
1934         AC_CHECK_FUNCS(sched_getcpu)
1936         if test x$platform_android != xyes; then
1937                 AC_CHECK_FUNCS(getpwnam_r)
1938                 AC_CHECK_FUNCS(getpwuid_r)
1939         fi
1941         AC_FUNC_STRERROR_R()
1943         dnl ****************************************************************
1944         dnl *** Check for sched_setaffinity from glibc versions before   ***
1945         dnl *** 2.3.4. The older versions of the function only take 2    ***
1946         dnl *** parameters, not 3.                                       ***
1947         dnl ***                                                          ***
1948         dnl *** Because the interface change was not made in a minor     ***
1949         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1950         dnl *** won't always indicate the interface sched_affinity has.  ***
1951         dnl ****************************************************************
1952         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1953         AC_TRY_COMPILE([#include <sched.h>], [
1954             int mask = 1; 
1955             sched_setaffinity(0, &mask);
1956         ], [
1957                 # Yes, we have it...
1958                 AC_MSG_RESULT(yes)
1959                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1960         ], [
1961                 # We have the new, three-parameter version
1962                 AC_MSG_RESULT(no)
1963         ])
1964         AC_TRY_COMPILE([#include <sched.h>], [
1965              CPU_COUNT((void *) 0);
1966         ], [
1967                 AC_MSG_RESULT(yes)
1968                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1969         ], [
1970                 # We have the new, three-parameter version
1971                 AC_MSG_RESULT(no)
1972         ])
1974         dnl ******************************************************************
1975         dnl *** Check for large file support                               ***
1976         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1977         dnl ******************************************************************
1978         
1979         # Check that off_t can represent 2**63 - 1 correctly, working around
1980         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1981         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1982         large_offt=no
1983         AC_DEFUN([LARGE_FILES], [
1984                 large_CPPFLAGS=$CPPFLAGS
1985                 CPPFLAGS="$CPPFLAGS $1"
1986                 AC_TRY_COMPILE([
1987                         #include <sys/types.h>
1988                         #include <limits.h>
1989                 ], [
1990                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1991                         #define COMPILE_TIME_ASSERT(pred) \
1992                                 switch(0){case 0:case pred:;}
1993                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1994                 ], [
1995                         AC_MSG_RESULT(ok)
1996                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1997                         large_CPPFLAGS="$large_CPPFLAGS $1"
1998                         large_offt=yes
1999                 ], [
2000                         AC_MSG_RESULT(no)
2001                 ])
2002                 CPPFLAGS=$large_CPPFLAGS
2003         ])
2005         AC_MSG_CHECKING(if off_t is 64 bits wide)
2006         LARGE_FILES("")
2007         if test $large_offt = no; then
2008                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2009                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2010         fi
2011         if test $large_offt = no; then
2012                 AC_MSG_WARN([No 64 bit file size support available])
2013         fi
2014         
2015         dnl *****************************
2016         dnl *** Checks for libsocket  ***
2017         dnl *****************************
2018         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2020         case "$host" in
2021                 *-*-*freebsd*)
2022                         dnl *****************************
2023                         dnl *** Checks for libinotify ***
2024                         dnl *****************************
2025                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2026         esac
2028         dnl *******************************
2029         dnl *** Checks for MSG_NOSIGNAL ***
2030         dnl *******************************
2031         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2032         AC_TRY_COMPILE([#include <sys/socket.h>], [
2033                 int f = MSG_NOSIGNAL;
2034         ], [
2035                 # Yes, we have it...
2036                 AC_MSG_RESULT(yes)
2037                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2038         ], [
2039                 # We'll have to use signals
2040                 AC_MSG_RESULT(no)
2041         ])
2043         dnl *****************************
2044         dnl *** Checks for IPPROTO_IP ***
2045         dnl *****************************
2046         AC_MSG_CHECKING(for IPPROTO_IP)
2047         AC_TRY_COMPILE([#include <netinet/in.h>], [
2048                 int level = IPPROTO_IP;
2049         ], [
2050                 # Yes, we have it...
2051                 AC_MSG_RESULT(yes)
2052                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2053         ], [
2054                 # We'll have to use getprotobyname
2055                 AC_MSG_RESULT(no)
2056         ])
2058         dnl *******************************
2059         dnl *** Checks for IPPROTO_IPV6 ***
2060         dnl *******************************
2061         AC_MSG_CHECKING(for IPPROTO_IPV6)
2062         AC_TRY_COMPILE([#include <netinet/in.h>], [
2063                 int level = IPPROTO_IPV6;
2064         ], [
2065                 # Yes, we have it...
2066                 AC_MSG_RESULT(yes)
2067                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2068         ], [
2069                 # We'll have to use getprotobyname
2070                 AC_MSG_RESULT(no)
2071         ])
2073         dnl ******************************
2074         dnl *** Checks for IPPROTO_TCP ***
2075         dnl ******************************
2076         AC_MSG_CHECKING(for IPPROTO_TCP)
2077         AC_TRY_COMPILE([#include <netinet/in.h>], [
2078                 int level = IPPROTO_TCP;
2079         ], [
2080                 # Yes, we have it...
2081                 AC_MSG_RESULT(yes)
2082                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2083         ], [
2084                 # We'll have to use getprotobyname
2085                 AC_MSG_RESULT(no)
2086         ])
2088         dnl *****************************
2089         dnl *** Checks for SOL_IP     ***
2090         dnl *****************************
2091         AC_MSG_CHECKING(for SOL_IP)
2092         AC_TRY_COMPILE([#include <netdb.h>], [
2093                 int level = SOL_IP;
2094         ], [
2095                 # Yes, we have it...
2096                 AC_MSG_RESULT(yes)
2097                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2098         ], [
2099                 # We'll have to use getprotobyname
2100                 AC_MSG_RESULT(no)
2101         ])
2103         dnl *****************************
2104         dnl *** Checks for SOL_IPV6     ***
2105         dnl *****************************
2106         AC_MSG_CHECKING(for SOL_IPV6)
2107         AC_TRY_COMPILE([#include <netdb.h>], [
2108                 int level = SOL_IPV6;
2109         ], [
2110                 # Yes, we have it...
2111                 AC_MSG_RESULT(yes)
2112                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2113         ], [
2114                 # We'll have to use getprotobyname
2115                 AC_MSG_RESULT(no)
2116         ])
2118         dnl *****************************
2119         dnl *** Checks for SOL_TCP    ***
2120         dnl *****************************
2121         AC_MSG_CHECKING(for SOL_TCP)
2122         AC_TRY_COMPILE([#include <netdb.h>], [
2123                 int level = SOL_TCP;
2124         ], [
2125                 # Yes, we have it...
2126                 AC_MSG_RESULT(yes)
2127                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2128         ], [
2129                 # We'll have to use getprotobyname
2130                 AC_MSG_RESULT(no)
2131         ])
2133         dnl *****************************
2134         dnl *** Checks for IP_PKTINFO ***
2135         dnl *****************************
2136         AC_MSG_CHECKING(for IP_PKTINFO)
2137         AC_TRY_COMPILE([#include <linux/in.h>], [
2138                 int level = IP_PKTINFO;
2139         ], [
2140                 # Yes, we have it...
2141                 AC_MSG_RESULT(yes)
2142                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2143         ], [
2144                 AC_MSG_RESULT(no)
2145         ])
2147         dnl *****************************
2148         dnl *** Checks for IPV6_PKTINFO ***
2149         dnl *****************************
2150         AC_MSG_CHECKING(for IPV6_PKTINFO)
2151         AC_TRY_COMPILE([#include <netdb.h>], [
2152                 int level = IPV6_PKTINFO;
2153         ], [
2154                 # Yes, we have it...
2155                 AC_MSG_RESULT(yes)
2156                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2157         ], [
2158                 AC_MSG_RESULT(no)
2159         ])
2161         dnl **********************************
2162         dnl *** Checks for IP_DONTFRAG     ***
2163         dnl **********************************
2164         AC_MSG_CHECKING(for IP_DONTFRAG)
2165         AC_TRY_COMPILE([#include <netinet/in.h>], [
2166                 int level = IP_DONTFRAG;
2167         ], [
2168                 # Yes, we have it...
2169                 AC_MSG_RESULT(yes)
2170                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2171         ], [
2172                 AC_MSG_RESULT(no)
2173         ])
2175         dnl **********************************
2176         dnl *** Checks for IP_DONTFRAGMENT ***
2177         dnl **********************************
2178         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2179         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2180                 int level = IP_DONTFRAGMENT;
2181         ], [
2182                 # Yes, we have it...
2183                 AC_MSG_RESULT(yes)
2184                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2185         ], [
2186                 AC_MSG_RESULT(no)
2187         ])
2189         dnl **********************************
2190         dnl *** Checks for IP_MTU_DISCOVER ***
2191         dnl **********************************
2192         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2193         AC_TRY_COMPILE([#include <linux/in.h>], [
2194                 int level = IP_MTU_DISCOVER;
2195         ], [
2196                 # Yes, we have it...
2197                 AC_MSG_RESULT(yes)
2198                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2199         ], [
2200                 AC_MSG_RESULT(no)
2201         ])
2203         dnl **********************************
2204         dnl *** Checks for  IP_PMTUDISC_DO ***
2205         dnl **********************************
2206         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2207         AC_TRY_COMPILE([#include <linux/in.h>], [
2208                 int level = IP_PMTUDISC_DO;
2209         ], [
2210                 # Yes, we have it...
2211                 AC_MSG_RESULT(yes)
2212                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2213         ], [
2214                 AC_MSG_RESULT(no)
2215         ])
2217         dnl *********************************
2218         dnl *** Check for struct ip_mreqn ***
2219         dnl *********************************
2220         AC_MSG_CHECKING(for struct ip_mreqn)
2221         AC_TRY_COMPILE([#include <netinet/in.h>], [
2222                 struct ip_mreqn mreq;
2223                 mreq.imr_address.s_addr = 0;
2224         ], [
2225                 # Yes, we have it...
2226                 AC_MSG_RESULT(yes)
2227                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2228         ], [
2229                 # We'll just have to try and use struct ip_mreq
2230                 AC_MSG_RESULT(no)
2231                 AC_MSG_CHECKING(for struct ip_mreq)
2232                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2233                         struct ip_mreq mreq;
2234                         mreq.imr_interface.s_addr = 0;
2235                 ], [
2236                         # Yes, we have it...
2237                         AC_MSG_RESULT(yes)
2238                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2239                 ], [
2240                         # No multicast support
2241                         AC_MSG_RESULT(no)
2242                 ])
2243         ])
2244         
2245         dnl **********************************
2246         dnl *** Check for getaddrinfo ***
2247         dnl **********************************
2248         AC_MSG_CHECKING(for getaddrinfo)
2249                 AC_TRY_LINK([
2250                 #include <stdio.h>
2251                 #include <netdb.h>
2252         ], [
2253                 getaddrinfo(NULL,NULL,NULL,NULL);
2254         ], [
2255                 # Yes, we have it...
2256                 AC_MSG_RESULT(yes)
2257                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2258         ], [
2259                 AC_MSG_RESULT(no)
2260         ])
2262         dnl **********************************
2263         dnl *** Check for gethostbyname2_r ***
2264         dnl **********************************
2265         AC_MSG_CHECKING(for gethostbyname2_r)
2266                 AC_TRY_LINK([
2267                 #include <stdio.h>
2268                 #include <netdb.h>
2269         ], [
2271                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2272         ], [
2273                 # Yes, we have it...
2274                 AC_MSG_RESULT(yes)
2275                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2276         ], [
2277                 AC_MSG_RESULT(no)
2278         ])
2280         dnl **********************************
2281         dnl *** Check for gethostbyname2 ***
2282         dnl **********************************
2283         AC_MSG_CHECKING(for gethostbyname2)
2284                 AC_TRY_LINK([
2285                 #include <stdio.h>
2286                 #include <netdb.h>
2287         ], [
2288                 gethostbyname2(NULL,0);
2289         ], [
2290                 # Yes, we have it...
2291                 AC_MSG_RESULT(yes)
2292                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2293         ], [
2294                 AC_MSG_RESULT(no)
2295         ])
2297         dnl **********************************
2298         dnl *** Check for gethostbyname ***
2299         dnl **********************************
2300         AC_MSG_CHECKING(for gethostbyname)
2301                 AC_TRY_LINK([
2302                 #include <stdio.h>
2303                 #include <netdb.h>
2304         ], [
2305                 gethostbyname(NULL);
2306         ], [
2307                 # Yes, we have it...
2308                 AC_MSG_RESULT(yes)
2309                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2310         ], [
2311                 AC_MSG_RESULT(no)
2312         ])
2314         dnl **********************************
2315         dnl *** Check for getprotobyname ***
2316         dnl **********************************
2317         AC_MSG_CHECKING(for getprotobyname)
2318                 AC_TRY_LINK([
2319                 #include <stdio.h>
2320                 #include <netdb.h>
2321         ], [
2322                 getprotobyname(NULL);
2323         ], [
2324                 # Yes, we have it...
2325                 AC_MSG_RESULT(yes)
2326                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2327         ], [
2328                 AC_MSG_RESULT(no)
2329         ])
2331         dnl **********************************
2332         dnl *** Check for getprotobyname_r ***
2333         dnl **********************************
2334         AC_MSG_CHECKING(for getprotobyname_r)
2335                 AC_TRY_LINK([
2336                 #include <stdio.h>
2337                 #include <netdb.h>
2338         ], [
2339                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2340         ], [
2341                 # Yes, we have it...
2342                 AC_MSG_RESULT(yes)
2343                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2344         ], [
2345                 AC_MSG_RESULT(no)
2346         ])
2348         dnl **********************************
2349         dnl *** Check for getnameinfo ***
2350         dnl **********************************
2351         AC_MSG_CHECKING(for getnameinfo)
2352                 AC_TRY_LINK([
2353                 #include <stdio.h>
2354                 #include <netdb.h>
2355         ], [
2356                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2357         ], [
2358                 # Yes, we have it...
2359                 AC_MSG_RESULT(yes)
2360                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2361         ], [
2362                 AC_MSG_RESULT(no)
2363         ])
2366         dnl **********************************
2367         dnl *** Check for inet_ntop ***
2368         dnl **********************************
2369         AC_MSG_CHECKING(for inet_ntop)
2370                 AC_TRY_LINK([
2371                 #include <stdio.h>
2372                 #include <arpa/inet.h>
2373         ], [
2374                 inet_ntop (0, NULL, NULL, 0);
2375         ], [
2376                 # Yes, we have it...
2377                 AC_MSG_RESULT(yes)
2378                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2379         ], [
2380                 AC_MSG_RESULT(no)
2381         ])
2383         dnl *****************************
2384         dnl *** Checks for libnsl     ***
2385         dnl *****************************
2386         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2388         AC_CHECK_FUNCS(inet_pton inet_aton)
2390         dnl *****************************
2391         dnl *** Checks for libxnet    ***
2392         dnl *****************************
2393         case "${host}" in
2394                 *solaris* )
2395                         AC_MSG_CHECKING(for Solaris XPG4 support)
2396                         if test -f /usr/lib/libxnet.so; then
2397                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2398                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2399                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2400                                 LIBS="$LIBS -lxnet"
2401                                 AC_MSG_RESULT(yes)
2402                         else
2403                                 AC_MSG_RESULT(no)
2404                         fi
2406                         if test "$GCC" = "yes"; then
2407                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2408                         fi
2409                 ;;
2410         esac
2412         dnl *****************************
2413         dnl *** Checks for libpthread ***
2414         dnl *****************************
2415 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2416 # and libpthread does not exist
2418         case "${host}" in
2419                 *-*-*haiku*)
2420                         dnl Haiku has pthread in libroot (libc equiv)
2421                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2422                 ;;
2423                 *-*-*freebsd*)
2424                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2425                 ;;
2426                 *-*-*openbsd*)
2427                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2428                 ;;
2429                 *)
2430                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2431                 ;;
2432         esac
2433         AC_CHECK_HEADERS(pthread.h)
2434         AC_CHECK_HEADERS(pthread_np.h)
2435         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2436         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2437         AC_CHECK_FUNCS(pthread_kill)
2438         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2439         AC_TRY_COMPILE([ #include <pthread.h>], [
2440                 pthread_mutexattr_t attr;
2441                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2442         ], [
2443                 AC_MSG_RESULT(ok)
2444         ], [
2445                 AC_MSG_RESULT(no)
2446                 AC_ERROR(Posix system lacks support for recursive mutexes)
2447         ])
2448         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2449         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2450         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2451         AC_CHECK_FUNCS(mincore mlock munlock)
2453         dnl ***********************************
2454         dnl *** Checks for working __thread ***
2455         dnl ***********************************
2456         AC_MSG_CHECKING(for working __thread)
2457         if test "x$with_tls" != "x__thread"; then
2458                 AC_MSG_RESULT(disabled)
2459         elif test "x$cross_compiling" = "xyes"; then
2460                 AC_MSG_RESULT(cross compiling, assuming yes)
2461         else
2462                 AC_TRY_RUN([
2463                         #if defined(__APPLE__) && defined(__clang__)
2464                         #error "__thread does not currently work with clang on Mac OS X"
2465                         #endif
2466                         
2467                         #include <pthread.h>
2468                         __thread int i;
2469                         static int res1, res2;
2471                         void thread_main (void *arg)
2472                         {
2473                                 i = arg;
2474                                 sleep (1);
2475                                 if (arg == 1)
2476                                         res1 = (i == arg);
2477                                 else
2478                                         res2 = (i == arg);
2479                         }
2481                         int main () {
2482                                 pthread_t t1, t2;
2484                                 i = 5;
2486                                 pthread_create (&t1, NULL, thread_main, 1);
2487                                 pthread_create (&t2, NULL, thread_main, 2);
2489                                 pthread_join (t1, NULL);
2490                                 pthread_join (t2, NULL);
2492                                 return !(res1 + res2 == 2);
2493                         }
2494                 ], [
2495                                 AC_MSG_RESULT(yes)
2496                 ], [
2497                                 AC_MSG_RESULT(no)
2498                                 with_tls=pthread
2499                 ])
2500         fi
2502         dnl **************************************
2503         dnl *** Checks for working sigaltstack ***
2504         dnl **************************************
2505         AC_MSG_CHECKING(for working sigaltstack)
2506         if test "x$with_sigaltstack" != "xyes"; then
2507                 AC_MSG_RESULT(disabled)
2508         elif test "x$cross_compiling" = "xyes"; then
2509                 AC_MSG_RESULT(cross compiling, assuming yes)
2510         else
2511                 AC_TRY_RUN([
2512                         #include <stdio.h>
2513                         #include <stdlib.h>
2514                         #include <unistd.h>
2515                         #include <signal.h>
2516                         #include <pthread.h>
2517                         #include <sys/wait.h>
2518                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2519                         #define SA_STACK SA_ONSTACK
2520                         #endif
2521                         static void
2522                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2523                         {
2524                                 exit (0);
2525                         }
2527                         volatile char*__ptr = NULL;
2528                         static void *
2529                         loop (void *ignored)
2530                         {
2531                                 *__ptr = 0;
2532                                 return NULL;
2533                         }
2535                         static void
2536                         child ()
2537                         {
2538                                 struct sigaction sa;
2539                                 stack_t sas;
2540                                 pthread_t id;
2541                                 pthread_attr_t attr;
2543                                 sa.sa_sigaction = sigsegv_signal_handler;
2544                                 sigemptyset (&sa.sa_mask);
2545                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2546                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2547                                         perror ("sigaction");
2548                                         return;
2549                                 }
2551                                 /* x86 darwin deliver segfaults using SIGBUS */
2552                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2553                                         perror ("sigaction");
2554                                         return;
2555                                 }
2556                                 sas.ss_sp = malloc (SIGSTKSZ);
2557                                 sas.ss_size = SIGSTKSZ;
2558                                 sas.ss_flags = 0;
2559                                 if (sigaltstack (&sas, NULL) == -1) {
2560                                         perror ("sigaltstack");
2561                                         return;
2562                                 }
2564                                 pthread_attr_init (&attr);
2565                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2566                                         printf ("pthread_create\n");
2567                                         return;
2568                                 }
2570                                 sleep (100);
2571                         }
2573                         int
2574                         main ()
2575                         {
2576                                 pid_t son;
2577                                 int status;
2578                                 int i;
2580                                 son = fork ();
2581                                 if (son == -1) {
2582                                         return 1;
2583                                 }
2585                                 if (son == 0) {
2586                                         child ();
2587                                         return 0;
2588                                 }
2590                                 for (i = 0; i < 300; ++i) {
2591                                         waitpid (son, &status, WNOHANG);
2592                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2593                                                 return 0;
2594                                         usleep (10000);
2595                                 }
2597                                 kill (son, SIGKILL);
2598                                 return 1;
2599                         }
2601                 ], [
2602                                 AC_MSG_RESULT(yes)
2603                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2604                 ], [
2605                                 with_sigaltstack=no
2606                                 AC_MSG_RESULT(no)
2607                 ])
2608         fi
2610         dnl ********************************
2611         dnl *** Checks for semaphore lib ***
2612         dnl ********************************
2613         # 'Real Time' functions on Solaris
2614         # posix4 on Solaris 2.6
2615         # pthread (first!) on Linux
2616         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2618         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2619         AC_CHECK_FUNCS(shm_open)
2621         dnl ********************************
2622         dnl *** Checks for timezone stuff **
2623         dnl ********************************
2624         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2625                 AC_TRY_COMPILE([
2626                         #include <time.h>
2627                         ], [
2628                         struct tm tm;
2629                         tm.tm_gmtoff = 1;
2630                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2631         if test $ac_cv_struct_tm_gmtoff = yes; then
2632                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2633         else
2634                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2635                         AC_TRY_COMPILE([
2636                                 #include <time.h>
2637                         ], [
2638                                 timezone = 1;
2639                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2640                 if test $ac_cv_var_timezone = yes; then
2641                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2642                 else
2643                         AC_ERROR(unable to find a way to determine timezone)
2644                 fi
2645         fi
2647         dnl *********************************
2648         dnl *** Checks for math functions ***
2649         dnl *********************************
2650         AC_SEARCH_LIBS(sqrtf, m)
2652         dnl ****************************************************************
2653         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2654         dnl *** have it in the library (duh))                            ***
2655         dnl ****************************************************************
2656         AC_CHECK_FUNCS(poll)
2658         dnl **********************************
2659         dnl *** epoll                      ***
2660         dnl **********************************
2661         AC_CHECK_HEADERS(sys/epoll.h)
2662         haveepoll=no
2663         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2664         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2665                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2666         fi
2668         havekqueue=no
2670         AC_CHECK_HEADERS(sys/event.h)
2671         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2673         dnl **************************************
2674         dnl * Darwin has a race that prevents us from using reliably:
2675         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2676         dnl * Since kqueue is mostly used for scaling large web servers, 
2677         dnl * and very few folks run Mono on large web servers on OSX, falling
2678         dnl * back 
2679         dnl **************************************
2680         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2681                 if test "x$host_darwin" = "xno"; then
2682                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2683                 fi
2684         fi
2686         dnl ******************************
2687         dnl *** Checks for SIOCGIFCONF ***
2688         dnl ******************************
2689         AC_CHECK_HEADERS(sys/ioctl.h)
2690         AC_CHECK_HEADERS(net/if.h, [], [],
2691            [
2692            #ifdef HAVE_SYS_TYPES_H
2693            # include <sys/types.h>
2694            #endif
2695            #ifdef HAVE_SYS_SOCKET_H
2696            # include <sys/socket.h>
2697            #endif
2698            ])
2699         AC_MSG_CHECKING(for ifreq)
2700         AC_TRY_COMPILE([
2701                 #include <stdio.h>
2702                 #include <sys/ioctl.h>
2703                 #include <net/if.h>
2704                 ], [
2705                 struct ifconf ifc;
2706                 struct ifreq *ifr;
2707                 void *x;
2708                 ifc.ifc_len = 0;
2709                 ifc.ifc_buf = NULL;
2710                 x = (void *) &ifr->ifr_addr;
2711                 ],[
2712                         AC_MSG_RESULT(yes)
2713                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2714                 ], [
2715                         AC_MSG_RESULT(no)
2716                 ])
2717         dnl **********************************
2718         dnl ***     Checks for sin_len     ***
2719         dnl **********************************
2720         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2721         AC_TRY_COMPILE([
2722                 #include <netinet/in.h>
2723                 ], [
2724                 struct sockaddr_in saddr;
2725                 saddr.sin_len = sizeof (saddr);
2726                 ],[
2727                         AC_MSG_RESULT(yes)
2728                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2729                 ], [
2730                         AC_MSG_RESULT(no)
2731                 ])      
2732         dnl **********************************
2733         dnl ***    Checks for sin6_len     ***
2734         dnl **********************************
2735         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2736         AC_TRY_COMPILE([
2737                 #include <netinet/in.h>
2738                 ], [
2739                 struct sockaddr_in6 saddr6;
2740                 saddr6.sin6_len = sizeof (saddr6);
2741                 ],[
2742                         AC_MSG_RESULT(yes)
2743                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2744                 ], [
2745                         AC_MSG_RESULT(no)
2746                 ])
2747         dnl **********************************
2748         dnl *** Check for getifaddrs       ***
2749         dnl **********************************
2750         AC_MSG_CHECKING(for getifaddrs)
2751                 AC_TRY_LINK([
2752                 #include <stdio.h>
2753                 #include <sys/types.h>
2754                 #include <sys/socket.h>
2755                 #include <ifaddrs.h>
2756         ], [
2757                 getifaddrs(NULL);
2758         ], [
2759                 # Yes, we have it...
2760                 AC_MSG_RESULT(yes)
2761                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2762         ], [
2763                 AC_MSG_RESULT(no)
2764         ])
2765         dnl **********************************
2766         dnl *** Check for if_nametoindex   ***
2767         dnl **********************************
2768         AC_MSG_CHECKING(for if_nametoindex)
2769                 AC_TRY_LINK([
2770                 #include <stdio.h>
2771                 #include <sys/types.h>
2772                 #include <sys/socket.h>
2773                 #include <net/if.h>
2774         ], [
2775                 if_nametoindex(NULL);
2776         ], [
2777                 # Yes, we have it...
2778                 AC_MSG_RESULT(yes)
2779                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2780         ], [
2781                 AC_MSG_RESULT(no)
2782         ])
2783         dnl **********************************
2784         dnl *** Check for access ***
2785         dnl **********************************
2786         AC_MSG_CHECKING(for access)
2787                 AC_TRY_LINK([
2788                 #include <unistd.h>
2789         ], [
2790                 access(NULL,0);
2791         ], [
2792                 # Yes, we have it...
2793                 AC_MSG_RESULT(yes)
2794                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2795         ], [
2796                 AC_MSG_RESULT(no)
2797         ])
2798                         
2799         dnl **********************************
2800         dnl *** Checks for proclib         ***
2801         dnl **********************************
2802         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.)])
2803         dnl **********************************
2804         dnl *** Checks for MonoPosixHelper ***
2805         dnl **********************************
2806         AC_CHECK_HEADERS(checklist.h)
2807         AC_CHECK_HEADERS(pathconf.h)
2808         AC_CHECK_HEADERS(fstab.h)
2809         AC_CHECK_HEADERS(attr/xattr.h)
2810         AC_CHECK_HEADERS(sys/extattr.h)
2811         AC_CHECK_HEADERS(sys/sendfile.h)
2812         AC_CHECK_HEADERS(sys/statvfs.h)
2813         AC_CHECK_HEADERS(sys/statfs.h)
2814         AC_CHECK_HEADERS(sys/vfstab.h)
2815         AC_CHECK_HEADERS(sys/xattr.h)
2816         AC_CHECK_HEADERS(sys/mman.h)
2817         AC_CHECK_HEADERS(sys/param.h)
2818         AC_CHECK_HEADERS(sys/mount.h, [], [],
2819                 [
2820                 #ifdef HAVE_SYS_PARAM_H
2821                 # include <sys/param.h>
2822                 #endif
2823                 ])
2824         AC_CHECK_HEADERS(sys/mount.h)
2825         AC_CHECK_FUNCS(confstr)
2826         AC_CHECK_FUNCS(seekdir telldir)
2827         AC_CHECK_FUNCS(getdomainname)
2828         AC_CHECK_FUNCS(setdomainname)
2829         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2830         AC_CHECK_FUNCS(setgroups)
2831         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2832         AC_CHECK_FUNCS(getfsstat)
2833         AC_CHECK_FUNCS(lutimes futimes)
2834         AC_CHECK_FUNCS(mremap)
2835         AC_CHECK_FUNCS(remap_file_pages)
2836         AC_CHECK_FUNCS(posix_fadvise)
2837         AC_CHECK_FUNCS(posix_fallocate)
2838         AC_CHECK_FUNCS(posix_madvise)
2839         AC_CHECK_FUNCS(vsnprintf)
2840         AC_CHECK_FUNCS(sendfile)
2841         AC_CHECK_FUNCS(gethostid sethostid)
2842         AC_CHECK_FUNCS(sethostname)
2843         AC_CHECK_FUNCS(statfs)
2844         AC_CHECK_FUNCS(fstatfs)
2845         AC_CHECK_FUNCS(statvfs)
2846         AC_CHECK_FUNCS(fstatvfs)
2847         AC_CHECK_FUNCS(stime)
2848         AC_CHECK_FUNCS(ttyname_r)
2849         AC_CHECK_FUNCS(psignal)
2850         AC_CHECK_FUNCS(getlogin_r)
2851         AC_CHECK_FUNCS(lockf)
2852         AC_CHECK_FUNCS(swab)
2853         AC_CHECK_FUNCS(setusershell endusershell)
2854         AC_CHECK_FUNCS(futimens utimensat)
2855         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2856         AC_CHECK_FUNCS(readv writev preadv pwritev)
2857         AC_CHECK_FUNCS(setpgid)
2858         AC_CHECK_FUNCS(system)
2859         AC_CHECK_FUNCS(fork execv execve)
2860         AC_CHECK_FUNCS(accept4)
2861         AC_CHECK_FUNCS(localtime_r)
2862         AC_CHECK_FUNCS(mkdtemp)
2863         AC_CHECK_SIZEOF(size_t)
2864         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2865                 [#include <sys/types.h>
2866                  #include <sys/stat.h>
2867                  #include <unistd.h>])
2868         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2869                 [#include <sys/types.h>
2870                  #include <sys/stat.h>
2871                  #include <unistd.h>])
2872         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2873                 [#include <sys/time.h>])
2874         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2875                 [#include <sys/socket.h>])
2876         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2877                 [#include <unistd.h>
2878                  #include <fcntl.h>])
2879         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2880                 [#include <sys/uio.h>])
2881         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2882                 [#include <sys/socket.h>])
2883         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2884                 [#include <sys/poll.h>])
2885         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2886                 [#include <sys/socket.h>])
2887         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2888                 [#include <sys/socket.h>])
2889         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2890                 [#include <netinet/in.h>])
2891         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2892                 [#include <netinet/in.h>])
2893         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2894                 [#include <sys/un.h>])
2895         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2896                 [#include <sys/types.h>
2897                  #include <sys/stat.h>
2898                  #include <unistd.h>])
2899         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2900                 [#include <time.h>])
2901         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2902                 [#include <sys/time.h>
2903                  #include <sys/types.h>
2904                  #include <utime.h>])
2905         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2906                 [#include <sys/time.h>])
2907         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2908                 [#include <sys/types.h>
2909                  #include <utime.h>])
2910         AC_CHECK_MEMBERS(
2911                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2912                 [#include <sys/types.h>
2913                  #include <dirent.h>])
2914         AC_CHECK_MEMBERS(
2915                 [struct passwd.pw_gecos],,, 
2916                 [#include <sys/types.h>
2917                  #include <pwd.h>])
2918         AC_CHECK_MEMBERS(
2919                 [struct statfs.f_flags],,, 
2920                 [#include <sys/types.h>
2921                  #include <sys/vfs.h>])
2922         AC_CHECK_MEMBERS(
2923                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2924                 [#include <sys/types.h>
2925                  #include <sys/stat.h>
2926                  #include <unistd.h>])
2928         dnl Favour xattr through glibc, but use libattr if we have to
2929         AC_CHECK_FUNC(lsetxattr, ,
2930                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2931         )
2932         AC_SUBST(XATTR_LIB)
2934         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2935         AC_CHECK_MEMBERS(
2936                 [struct kinfo_proc.kp_proc],,, 
2937                 [#include <sys/types.h>
2938                  #include <sys/param.h>
2939                  #include <sys/sysctl.h>
2940                  #include <sys/proc.h>
2941                  ])
2943         dnl *********************************
2944         dnl *** Checks for Windows compilation ***
2945         dnl *********************************
2946         AC_CHECK_HEADERS(sys/time.h)
2947         AC_CHECK_HEADERS(sys/param.h)
2948         AC_CHECK_HEADERS(dirent.h)
2950         dnl ******************************************
2951         dnl *** Checks for OSX and iOS compilation ***
2952         dnl ******************************************
2953         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2955         dnl *********************************
2956         dnl *** Check for Console 2.0 I/O ***
2957         dnl *********************************
2958         AC_CHECK_HEADERS([curses.h])
2959         AC_CHECK_HEADERS([term.h], [], [],
2960         [#if HAVE_CURSES_H
2961          #include <curses.h>
2962          #endif
2963         ])
2964         AC_CHECK_HEADERS([termios.h])
2966         dnl *********************************
2967         dnl *** Checks for random         ***
2968         dnl *********************************
2969         if test x$host_darwin = xno; then
2970                 AC_CHECK_HEADERS(sys/random.h)
2971                 AC_CHECK_FUNCS(getrandom getentropy)
2972         fi
2974         dnl *********************************
2975         dnl *** Checks for Mono.Native  ***
2976         dnl *********************************
2978         AC_MSG_CHECKING(for linux/in.h)
2979         AC_TRY_COMPILE([
2980                 #include <sys/socket.h>
2981                 #include <linux/in.h>
2982         ], [
2983         ],[
2984                 AC_MSG_RESULT(yes)
2985                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
2986         ], [
2987                 AC_MSG_RESULT(no)
2988         ])
2990         AC_MSG_CHECKING(for struct in_pktinfo)
2991         AC_TRY_COMPILE([
2992                 #ifdef HAVE_LINUX_IN_H
2993                 #include <sys/socket.h>
2994                 #include <linux/in.h>
2995                 #else
2996                 #include <netinet/in.h>
2997                 #endif
2998         ], [
2999                 struct in_pktinfo pktinfo;
3000         ],[
3001                 AC_MSG_RESULT(yes)
3002                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3003         ], [
3004                 AC_MSG_RESULT(no)
3005         ])
3007         AC_MSG_CHECKING(for struct ip_mreqn)
3008         AC_TRY_COMPILE([
3009                 #if HAVE_LINUX_IN_H
3010                 #include <sys/socket.h>
3011                 #include <linux/in.h>
3012                 #else
3013                 #include <netinet/in.h>
3014                 #endif
3015         ], [
3016                 struct ip_mreqn mreqn;
3017         ],[
3018                 AC_MSG_RESULT(yes)
3019                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3020         ], [
3021                 AC_MSG_RESULT(no)
3022         ])
3024         if test x$host_darwin = xno; then
3025                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3026         fi
3028         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3029         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3030         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3031         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3032         AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3033         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3034         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3035         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3036         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3037         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3038         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3039         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3040         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3041         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3042         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3043         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3044         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3045         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3046         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3047         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3049         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3050         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3052         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>]])
3053         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>]])
3054         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>]])
3055         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>]])
3056         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3057         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3058         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3060         AC_MSG_CHECKING(for struct statfs)
3061         AC_TRY_COMPILE([
3062                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3063                 #include <sys/mount.h>
3064                 #else
3065                 #include <sys/statfs.h>
3066                 #endif
3067         ], [
3068                 struct statfs;
3069         ],[
3070                 AC_MSG_RESULT(yes)
3071                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3072         ], [
3073                 AC_MSG_RESULT(no)
3074         ])
3076         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3077                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3078         fi
3080         AC_MSG_CHECKING(for readdir_r)
3081         AC_TRY_COMPILE([
3082                 #include <dirent.h>
3083         ], [
3084                 DIR* dir;
3085                 struct dirent* entry;
3086                 struct dirent* result;
3087                 readdir_r(dir, entry, &result);
3088         ],[
3089                 AC_MSG_RESULT(yes)
3090                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3091         ], [
3092                 AC_MSG_RESULT(no)
3093         ])
3095         AC_MSG_CHECKING(for kevent with void *data)
3096         AC_TRY_COMPILE([
3097                 #include <sys/types.h>
3098                 #include <sys/event.h>
3099         ], [
3100                 struct kevent event;
3101                 void* data;
3102                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3103         ],[
3104                 AC_MSG_RESULT(yes)
3105                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3106         ], [
3107                 AC_MSG_RESULT(no)
3108         ])
3110         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3111         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3113         AC_MSG_CHECKING(for sendfile with 4 arguments)
3114         AC_TRY_COMPILE([
3115                 #include <sys/sendfile.h>
3116         ], [
3117                 int result = sendfile(0, 0, 0, 0);
3118         ],[
3119                 AC_MSG_RESULT(yes)
3120                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3121         ], [
3122                 AC_MSG_RESULT(no)
3123         ])
3125         AC_MSG_CHECKING(for sendfile with 6 arguments)
3126         AC_TRY_LINK([
3127                 #include <stdlib.h>
3128                 #include <sys/types.h>
3129                 #include <sys/socket.h>
3130                 #include <sys/uio.h>
3131         ], [
3132                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3133         ],[
3134                 AC_MSG_RESULT(yes)
3135                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3136         ], [
3137                 AC_MSG_RESULT(no)
3138         ])
3140         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3141         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3142         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3143         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3145         ORIG_CFLAGS="$CFLAGS"
3146         CFLAGS="-Werror -Wsign-conversion"
3148         AC_MSG_CHECKING(for getnameinfo with signed flags)
3149         AC_TRY_COMPILE([
3150                 #include <sys/types.h>
3151                 #include <netdb.h>
3152         ], [
3153                 const struct sockaddr *addr;
3154                 socklen_t addrlen;
3155                 char *host;
3156                 socklen_t hostlen;
3157                 char *serv;
3158                 socklen_t servlen;
3159                 int flags;
3160                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3161         ],[
3162                 AC_MSG_RESULT(yes)
3163                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3164         ], [
3165                 AC_MSG_RESULT(no)
3166         ])
3168         CFLAGS="$ORIG_CFLAGS"
3170         if test "x$host_linux" = "xyes"; then
3171                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3172         else
3173                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3174         fi
3176         ORIG_CFLAGS="$CFLAGS"
3177         CFLAGS="-Werror -Wsign-conversion"
3179         AC_MSG_CHECKING(for bind with unsigned addrlen)
3180         AC_TRY_COMPILE([
3181                 #include <sys/socket.h>
3182         ], [
3183                 int fd;
3184                 struct sockaddr* addr;
3185                 socklen_t addrLen;
3186                 bind(fd, addr, addrLen);
3187         ],[
3188                 AC_MSG_RESULT(yes)
3189                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3190         ], [
3191                 AC_MSG_RESULT(no)
3192         ])
3194         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3195         AC_TRY_COMPILE([
3196                 #include <netinet/in.h>
3197                 #include <netinet/tcp.h>
3198         ], [
3199                 struct ipv6_mreq opt;
3200                 unsigned int index = 0;
3201                 opt.ipv6mr_interface = index;
3202         ],[
3203                 AC_MSG_RESULT(yes)
3204                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3205         ], [
3206                 AC_MSG_RESULT(no)
3207         ])
3209         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3210         AC_TRY_COMPILE([
3211                 #include <sys/inotify.h>
3212         ], [
3213                 intptr_t fd;
3214                 uint32_t wd;
3215                 int result = inotify_rm_watch(fd, wd);
3216         ],[
3217                 AC_MSG_RESULT(yes)
3218                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3219         ], [
3220                 AC_MSG_RESULT(no)
3221         ])
3223         CFLAGS="$ORIG_CFLAGS"
3225         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3226         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3227                 AC_MSG_RESULT(no)
3228         else
3229                 AC_TRY_RUN([
3230                         #include <sys/mman.h>
3231                         #include <fcntl.h>
3232                         #include <unistd.h>
3234                         int main ()
3235                         {
3236                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3237                                 if (fd == -1)
3238                                         return -1;
3240                                 shm_unlink("/mono_configure_shm_open");
3242                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3243                                 //       on at least the current version of Mac OS X
3245                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3246                                         return -1;
3248                                 return 0;
3249                         }
3250                 ],[
3251                         AC_MSG_RESULT(yes)
3252                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3253                 ], [
3254                         AC_MSG_RESULT(no)
3255                 ])
3256         fi
3258         AC_MSG_CHECKING(for getpriority with int who)
3259         AC_TRY_COMPILE([
3260                 #include <sys/resource.h>
3261         ], [
3262                 int which;
3263                 int who;
3264                 int result = getpriority(which, who);
3265         ],[
3266                 AC_MSG_RESULT(yes)
3267                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3268         ], [
3269                 AC_MSG_RESULT(no)
3270         ])
3272         AC_MSG_CHECKING(for kevent with int parameters)
3273         AC_TRY_COMPILE([
3274                 #include <sys/types.h>
3275                 #include <sys/event.h>
3276         ], [
3277                 int kg;
3278                 const struct kevent* chagelist;
3279                 int nchanges;
3280                 struct kevent* eventlist;
3281                 int nevents;
3282                 const struct timespec* timeout;
3283                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3284         ],[
3285                 AC_MSG_RESULT(yes)
3286                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3287         ], [
3288                 AC_MSG_RESULT(no)
3289         ])
3291         ORIG_CFLAGS="$CFLAGS"
3292         CFLAGS="-Werror -Wimplicit-function-declaration"
3294         AC_MSG_CHECKING(for mkstemps)
3295         AC_TRY_COMPILE([
3296                 #include <stdlib.h>
3297                 #include <unistd.h>
3298                 #include <string.h>
3299         ], [
3300                 char *template;
3301                 int suffixlen;
3302                 int result = mkstemps(template, suffixlen);
3303         ],[
3304                 AC_MSG_RESULT(yes)
3305                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3306                 have_mkstemps=yes
3307         ], [
3308                 AC_MSG_RESULT(no)
3309         ])
3311         CFLAGS="$ORIG_CFLAGS"
3313         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3314                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3315         fi
3317         AC_MSG_CHECKING(for tcp/var.h)
3318         AC_TRY_COMPILE([
3319                 #include <sys/types.h>
3320                 #include <sys/socketvar.h>
3321                 #include <netinet/ip.h>
3322                 #include <netinet/tcp.h>
3323                 #include <netinet/tcp_var.h>
3324         ], [
3325         ],[
3326                 AC_MSG_RESULT(yes)
3327                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3328         ], [
3329                 AC_MSG_RESULT(no)
3330         ])
3332         AC_CHECK_HEADERS([sys/cdefs.h])
3334         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3335         AC_TRY_COMPILE([
3336                 #ifdef HAVE_SYS_CDEFS_H
3337                 #include <sys/cdefs.h>
3338                 #endif
3339                 #include <netinet/tcp.h>
3340         ], [
3341                 int result = TCP_ESTABLISHED;
3342         ],[
3343                 AC_MSG_RESULT(yes)
3344                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3345         ], [
3346                 AC_MSG_RESULT(no)
3347         ])
3349         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3351         AC_MSG_CHECKING(for struct rt_msghdr)
3352         AC_TRY_COMPILE([
3353                 #include <sys/types.h>
3354                 #include <net/route.h>
3355         ], [
3356                 struct rt_msghdr;
3357         ],[
3358                 AC_MSG_RESULT(yes)
3359                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3360         ], [
3361                 AC_MSG_RESULT(no)
3362         ])
3364         AC_CHECK_HEADERS([sys/sysctl.h])
3365         AC_CHECK_HEADERS([linux/rtnetlink.h])
3367         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3368         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3369         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3371         ORIG_CFLAGS="$CFLAGS"
3372         CFLAGS="-Werror -Weverything"
3374         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3375         AC_TRY_COMPILE([
3376                 #include <unistd.h>
3377         ], [
3378                 size_t namelen = 20;
3379                 char name[20];
3380                 int result = getdomainname(name, namelen);
3381         ],[
3382                 AC_MSG_RESULT(yes)
3383                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3384         ], [
3385                 AC_MSG_RESULT(no)
3386         ])
3388         CFLAGS="$ORIG_CFLAGS"
3390         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3391         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3392         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3394         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
3395                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3396         elif test "x$host_linux" = "xyes"; then
3397                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3398         fi
3400         AC_CHECK_HEADERS([crt_externs.h])
3402         AC_MSG_CHECKING(for _NSGetEnviron)
3403         AC_TRY_COMPILE([
3404                 #include <crt_externs.h>
3405         ], [
3406                 char **result = *(_NSGetEnviron());
3407         ],[
3408                 AC_MSG_RESULT(yes)
3409                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3410         ], [
3411                 AC_MSG_RESULT(no)
3412         ])
3414         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3416 else
3417         dnl *********************************
3418         dnl *** Checks for Windows compilation ***
3419         dnl *********************************
3420         AC_CHECK_HEADERS(winternl.h)
3422         jdk_headers_found=no
3423         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3424         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3425         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3426         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3427         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3428         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3429         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3431         dnl *********************************
3432         dnl *** Check for struct ip_mreqn ***
3433         dnl *********************************
3434         AC_MSG_CHECKING(for struct ip_mreqn)
3435         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3436                 struct ip_mreqn mreq;
3437                 mreq.imr_address.s_addr = 0;
3438         ], [
3439                 # Yes, we have it...
3440                 AC_MSG_RESULT(yes)
3441                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3442         ], [
3443                 # We'll just have to try and use struct ip_mreq
3444                 AC_MSG_RESULT(no)
3445                 AC_MSG_CHECKING(for struct ip_mreq)
3446                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3447                         struct ip_mreq mreq;
3448                         mreq.imr_interface.s_addr = 0;
3449                 ], [
3450                         # Yes, we have it...
3451                         AC_MSG_RESULT(yes)
3452                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3453                 ], [
3454                         # No multicast support
3455                         AC_MSG_RESULT(no)
3456                 ])
3457         ])
3459         dnl **********************************
3460         dnl *** Check for getaddrinfo ***
3461         dnl **********************************
3462         AC_MSG_CHECKING(for getaddrinfo)
3463                 AC_TRY_LINK([
3464                 #include <stdio.h>
3465                 #include <winsock2.h>
3466                 #include <ws2tcpip.h>
3467         ], [
3468                 getaddrinfo(NULL,NULL,NULL,NULL);
3469         ], [
3470                 # Yes, we have it...
3471                 AC_MSG_RESULT(yes)
3472                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3473         ], [
3474                 AC_MSG_RESULT(no)
3475         ])
3477         dnl **********************************
3478         dnl *** Check for gethostbyname ***
3479         dnl **********************************
3480         AC_MSG_CHECKING(for gethostbyname)
3481                 AC_TRY_LINK([
3482                 #include <stdio.h>
3483                 #include <winsock2.h>
3484                 #include <ws2tcpip.h>
3485         ], [
3486                 gethostbyname(NULL);
3487         ], [
3488                 # Yes, we have it...
3489                 AC_MSG_RESULT(yes)
3490                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3491         ], [
3492                 AC_MSG_RESULT(no)
3493         ])
3495         dnl **********************************
3496         dnl *** Check for getprotobyname ***
3497         dnl **********************************
3498         AC_MSG_CHECKING(for getprotobyname)
3499                 AC_TRY_LINK([
3500                 #include <stdio.h>
3501                 #include <winsock2.h>
3502                 #include <ws2tcpip.h>
3503         ], [
3504                 getprotobyname(NULL);
3505         ], [
3506                 # Yes, we have it...
3507                 AC_MSG_RESULT(yes)
3508                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3509         ], [
3510                 AC_MSG_RESULT(no)
3511         ])
3513         dnl **********************************
3514         dnl *** Check for getnameinfo ***
3515         dnl **********************************
3516         AC_MSG_CHECKING(for getnameinfo)
3517                 AC_TRY_LINK([
3518                 #include <stdio.h>
3519                 #include <winsock2.h>
3520                 #include <ws2tcpip.h>
3521         ], [
3522                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3523         ], [
3524                 # Yes, we have it...
3525                 AC_MSG_RESULT(yes)
3526                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3527         ], [
3528                 AC_MSG_RESULT(no)
3529         ])
3531         dnl **********************************
3532         dnl *** Check for inet_ntop ***
3533         dnl **********************************
3534         AC_MSG_CHECKING(for inet_ntop)
3535                 AC_TRY_LINK([
3536                 #include <stdio.h>
3537                 #include <winsock2.h>
3538                 #include <ws2tcpip.h>
3539         ], [
3540                 inet_ntop (0, NULL, NULL, 0);
3541         ], [
3542                 # Yes, we have it...
3543                 AC_MSG_RESULT(yes)
3544                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3545         ], [
3546                 AC_MSG_RESULT(no)
3547         ])
3549         dnl **********************************
3550         dnl *** Check for inet_pton ***
3551         dnl **********************************
3552         AC_MSG_CHECKING(for inet_pton)
3553                 AC_TRY_LINK([
3554                 #include <stdio.h>
3555                 #include <winsock2.h>
3556                 #include <ws2tcpip.h>
3557         ], [
3558                 #ifndef inet_pton
3559                 (void) inet_pton;
3560                 #endif
3561                 inet_pton (0, NULL, NULL);
3562         ], [
3563                 # Yes, we have it...
3564                 AC_MSG_RESULT(yes)
3565                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3566         ], [
3567                 AC_MSG_RESULT(no)
3568         ])
3570         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3571         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3572         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3573         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3574         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3575         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3576         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3579 dnl socklen_t check
3580 AC_MSG_CHECKING(for socklen_t)
3581 AC_TRY_COMPILE([
3582 #include <sys/types.h>
3583 #include <sys/socket.h>
3585   socklen_t foo;
3587 ac_cv_c_socklen_t=yes
3588         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3589         AC_MSG_RESULT(yes)
3591         AC_MSG_RESULT(no)
3594 AC_CHECK_FUNCS(execvp)
3596 dnl ****************************
3597 dnl *** Look for /dev/random ***
3598 dnl ****************************
3600 AC_MSG_CHECKING([if usage of random device is requested])
3601 AC_ARG_ENABLE(dev-random,
3602 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3603 try_dev_random=$enableval, try_dev_random=yes)
3605 AC_MSG_RESULT($try_dev_random)
3607 case "{$build}" in
3609 dnl IBM i does not have /dev/random, use unblocking only
3611     *-*-os400*)
3612     NAME_DEV_RANDOM="/dev/urandom"
3613     ;;
3615 dnl Win32 does not have /dev/random, they have their own method...
3617     *-mingw*|*-*-cygwin*)
3618     ac_cv_have_dev_random=no
3619     ;;
3621 dnl Everywhere else, it's /dev/random
3623     *)
3624     NAME_DEV_RANDOM="/dev/random"
3625     ;;
3626 esac
3628 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3630 dnl Now check if the device actually exists
3632 if test "x$try_dev_random" = "xyes"; then
3633     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3634     [if test -r "$NAME_DEV_RANDOM" ; then
3635         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3636     if test "x$ac_cv_have_dev_random" = "xyes"; then
3637         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3638     fi
3639 else
3640     AC_MSG_CHECKING(for random device)
3641     ac_cv_have_dev_random=no
3642     AC_MSG_RESULT(has been disabled)
3645 if test "x$host_win32" = "xyes"; then
3646     AC_DEFINE(HAVE_CRYPT_RNG)
3649 if test "x$ac_cv_have_dev_random" = "xno" \
3650     && test "x$host_win32" = "xno"; then
3651     AC_MSG_WARN([[
3653 *** A system-provided entropy source was not found on this system.
3654 *** Because of this, the System.Security.Cryptography random number generator
3655 *** will throw a NotImplemented exception.
3657 *** If you are seeing this message, and you know your system DOES have an
3658 *** entropy collection in place, please report an issue on GitHub and
3659 *** provide information about the system and how to access the random device.
3661 *** Otherwise you can install either egd or prngd and set the environment
3662 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3663 ***]])
3666 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)
3668 AC_MSG_CHECKING([if big-arrays are to be enabled])
3669 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)
3670 if test "x$enable_big_arrays" = "xyes" ; then
3671     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3672         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3673     else
3674         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3675     fi
3677 AC_MSG_RESULT($enable_big_arrays)
3679 dnl **************
3680 dnl *** DTRACE ***
3681 dnl **************
3683 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3685 if test "x$enable_dtrace" = "xyes"; then
3686    if test "x$has_dtrace" = "xno"; then
3687           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3688    fi
3689    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3690    if test "x$DTRACE" = "xno"; then
3691           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3692           enable_dtrace=no
3693    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3694           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3695           enable_dtrace=no
3696    fi
3699 dtrace_g=no
3700 if test "x$enable_dtrace" = "xyes"; then
3701         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3702         DTRACEFLAGS=
3703         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3704                 case "$host" in
3705                         powerpc-*-darwin*)
3706                         DTRACEFLAGS="-arch ppc64"
3707                         ;;
3708                         i*86-*-darwin*)
3709                         DTRACEFLAGS="-arch x86_64"
3710                         ;;
3711                         *)
3712                         DTRACEFLAGS=-64
3713                         ;;
3714                 esac
3715         else
3716                 case "$host" in
3717                         powerpc-*-darwin*)
3718                         DTRACEFLAGS="-arch ppc"
3719                         ;;
3720                         i*86-*-darwin*)
3721                         DTRACEFLAGS="-arch i386"
3722                         ;;
3723                         *)
3724                         DTRACEFLAGS=-32
3725                         ;;
3726                 esac
3727         fi
3728         AC_SUBST(DTRACEFLAGS)
3729         case "$host" in
3730                 *-*-solaris*)
3731                 dtrace_g=yes
3732                 ;;
3733         esac
3734         AC_CHECK_HEADERS([sys/sdt.h])
3736 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3737 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3739 dnl **************************
3740 dnl *** AOT cross offsets  ***
3741 dnl **************************
3743 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3744     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3746 dnl **************
3747 dnl ***  LLVM  ***
3748 dnl **************
3750 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3751 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3752 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)
3753 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3754 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3756 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3758 if test "x$enable_llvm" = "xdefault"; then
3759    enable_llvm=$enable_llvm_default
3762 internal_llvm="no"
3763 if test "x$enable_llvm" = "xyes"; then
3764         if test "x$with_llvm" != "x"; then
3765                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3766                 if test x$host_win32 = xyes; then
3767                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3768                 fi
3769                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3770                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3771                 fi
3772         else
3773                 if test x$host_win32 = xyes; then
3774                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3775                 else
3776                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3777                 fi
3778                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3779                         internal_llvm=yes
3780                 fi
3781         fi
3783         LLVM_CODEGEN_LIBS="x86codegen"
3784         case "$target" in
3785         arm*)
3786                 LLVM_CODEGEN_LIBS="armcodegen"
3787                 ;;
3788         aarch64*)
3789                 LLVM_CODEGEN_LIBS="aarch64codegen"
3790                 ;;
3791         powerpc*)
3792                 LLVM_CODEGEN_LIBS="powerpccodegen"
3793                 ;;
3794         esac
3795         if test "x$host" != "x$target"; then
3796                 # No need for jit libs
3797                 LLVM_CODEGEN_LIBS=
3798         fi
3800         AC_SUBST(LLVM_CODEGEN_LIBS)
3801         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3802         
3803         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3804 fi # ENABLE_LLVM
3806 # AC_DEFINE necessary for correct restore behavior on Linux
3807 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3808 if test "x$internal_llvm" != "xno"; then
3809    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3812 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3813 if test "x$enable_llvm_asserts" != "xno"; then
3814    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3817 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3819 if test "x$enable_loadedllvm" = "xyes"; then
3820    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3822 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3824 if test "x$enable_llvm" = "xyes"; then
3825    enable_llvm_runtime=yes
3827 if test "x$enable_llvm_runtime" = "xyes"; then
3828    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3830 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3832 TARGET="unknown"
3833 ACCESS_UNALIGNED="yes"
3835 LIBC="libc.so.6"
3836 INTL="libc.so.6"
3837 SQLITE="libsqlite.so.0"
3838 SQLITE3="libsqlite3.so.0"
3839 X11="libX11.so"
3840 GDKX11="libgdk-x11-2.0.so.0"
3841 GTKX11="libgtk-x11-2.0.so.0"
3842 XINERAMA="libXinerama.so.1"
3844 sizeof_register="SIZEOF_VOID_P"
3846 jit_wanted=true
3847 boehm_supported=true
3848 BTLS_SUPPORTED=no
3849 BTLS_PLATFORM=
3851 case "$host" in
3852         wasm32*)
3853                 TARGET=WASM
3854                 arch_target=wasm
3855                 BTLS_SUPPORTED=no
3856                 ACCESS_UNALIGNED="no"
3857                 with_tls=pthread
3858                 ;;
3859         mips*)
3860                 TARGET=MIPS;
3861                 arch_target=mips;
3862                 with_tls=pthread;
3863                 ACCESS_UNALIGNED="no"
3865                 AC_MSG_CHECKING(for mips n32)
3866                 AC_TRY_COMPILE([],[
3867                 #if _MIPS_SIM != _ABIN32
3868                 #error Not mips n32
3869                 #endif
3870                 ],[
3871                 AC_MSG_RESULT(yes)
3872                 sizeof_register=8
3873                 ],[
3874                 AC_MSG_RESULT(no)
3875                 ])
3876                 ;;
3877         i*86-*-*)
3878                 TARGET=X86;
3879                 arch_target=x86;
3880                 case $host_os in
3881                   solaris*)
3882                         LIBC="libc.so"
3883                         INTL="libintl.so"
3884                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3885                                 TARGET=AMD64
3886                                 arch_target=amd64
3887                         fi
3889                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3890                         # int astruct __attribute__ ((visibility ("hidden")));
3891                         # void foo ()
3892                         # {
3893                         #       void *p = &astruct;
3894                         # }
3895                         # gcc -fPIC --shared -o libfoo.so foo.c
3896                         # yields:
3897                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3898                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3899                         have_visibility_hidden=no
3900                         ;;
3901                   mingw*|cygwin*)
3902                         have_visibility_hidden=no
3903                         BTLS_SUPPORTED=no
3904                         BTLS_PLATFORM=i386
3905                         ;;
3906                   haiku*)
3907                         LIBC=libroot.so
3908                         ;;
3909                   linux*)
3910                         AOT_SUPPORTED="yes"
3911                         BTLS_SUPPORTED=yes
3912                         BTLS_PLATFORM=i386
3913                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3914                         ;;
3915                   darwin*)
3916                         AOT_SUPPORTED="yes"
3917                         BTLS_SUPPORTED=yes
3918                         BTLS_PLATFORM=i386
3919                         ;;
3920                   openbsd*|freebsd*|kfreebsd-gnu*)
3921                         AOT_SUPPORTED="yes"
3922                         BTLS_SUPPORTED=yes
3923                         BTLS_PLATFORM=i386
3924                         ;;
3925                 esac
3926                 ;;
3927         x86_64-*-* | amd64-*-*)
3928                 TARGET=AMD64;
3929                 arch_target=amd64;
3930                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3931                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3932                         sizeof_register=8
3933                 fi
3934                 case $host_os in
3935                   linux*)
3936                         AOT_SUPPORTED="yes"
3937                         BTLS_SUPPORTED=yes
3938                         BTLS_PLATFORM=x86_64
3939                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3940                         ;;
3941                   darwin*)
3942                         AOT_SUPPORTED="yes"
3943                         BTLS_SUPPORTED=yes
3944                         BTLS_PLATFORM=x86_64
3945                         boehm_supported=false
3946                         ;;
3947                   openbsd*|freebsd*|kfreebsd-gnu*)
3948                         AOT_SUPPORTED="yes"
3949                         BTLS_SUPPORTED=yes
3950                         BTLS_PLATFORM=x86_64
3951                         ;;
3952                   mingw*|cygwin*)
3953                         BTLS_SUPPORTED=no
3954                         BTLS_PLATFORM=x86_64
3955                         ;;
3956                 esac
3957                 ;;
3958         sparc*-*-*)
3959                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3960                    TARGET=SPARC64
3961                 else
3962                         TARGET=SPARC
3963                 fi
3964                 arch_target=sparc;
3965                 ACCESS_UNALIGNED="no"
3966                 case $host_os in
3967                   linux*) ;;
3968                   *)
3969                         LIBC="libc.so"
3970                         INTL="libintl.so"
3971                 esac
3972                 if test x"$GCC" = xyes; then
3973                         # We don't support v8 cpus
3974                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3975                 fi
3976                 if test x"$AR" = xfalse; then
3977                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3978                 fi
3979                 ;;
3980         *-mingw*|*-*-cygwin*)
3981                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3982                 have_visibility_hidden=no
3983                 INTL="intl"
3984                 ;;
3985         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3986         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3987         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
3988                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3989                         TARGET=POWERPC64;
3990                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3991                         if ! (echo $CC | grep -q -- 'clang'); then
3992                                 CFLAGS="$CFLAGS -mminimal-toc"
3993                         fi
3994                 else
3995                         TARGET=POWERPC;
3996                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3997                 fi
3998                 arch_target=ppc;
3999                 case $host_os in
4000                   aix*|os400*)
4001                         BTLS_SUPPORTED=yes
4002                         BTLS_PLATFORM=powerpc
4003                         dnl on AIX/PASE, shared libraries can be inside archives
4004                         dnl if they are, we specify them by lib.a(lib.so)
4005                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4006                         LIBC="libc.a(shr_64.o)"
4007                         INTL="libintl.a(libintl.so.8)"
4008                         ;;
4009                   linux*)
4010                         BTLS_SUPPORTED=yes
4011                         BTLS_PLATFORM=powerpc
4012                         ;;
4013                 esac
4014                 ;;
4015         armv7k-*-darwin*)
4016                 TARGET=ARM;
4017                 TARGET_SYS=WATCHOS
4018                 arch_target=arm;
4019                 arm_fpu=VFP_HARD
4020                 ACCESS_UNALIGNED="no"
4021                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4022                 ;;
4024         arm*-darwin*)
4025                 TARGET=ARM;
4026                 arch_target=arm;
4027                 ACCESS_UNALIGNED="no"
4028                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4029                 ;;
4030         arm*-linux*)
4031                 TARGET=ARM;
4032                 arch_target=arm;
4033                 ACCESS_UNALIGNED="no"
4034                 AOT_SUPPORTED="yes"
4035                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4036                 BTLS_SUPPORTED=yes
4037                 BTLS_PLATFORM=arm
4038                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4039                 case "$target" in
4040                 arm*-linux*-gnueabi)
4041                         BTLS_PLATFORM=armsoft
4042                         ;;
4043                 esac
4044                 ;;
4045         arm*-netbsd*-eabi*)
4046                 TARGET=ARM;
4047                 arch_target=arm;
4048                 ACCESS_UNALIGNED="no"
4049                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4050                 ;;
4051         aarch64-*)
4052                 # https://lkml.org/lkml/2012/7/15/133
4053                 TARGET=ARM64
4054                 arch_target=arm64
4055                 boehm_supported=false
4056                 AOT_SUPPORTED="yes"
4057                 BTLS_SUPPORTED=yes
4058                 BTLS_PLATFORM=aarch64
4059                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4060                 ;;
4061         s390x-*-linux*)
4062                 TARGET=S390X;
4063                 arch_target=s390x;
4064                 ACCESS_UNALIGNED="yes"
4065                 BTLS_SUPPORTED=yes
4066                 BTLS_PLATFORM=s390x
4067                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4068                 ;;
4069 esac
4071 HOST=$TARGET
4073 if test "x$host" != "x$target"; then
4074    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4075    enable_mcs_build=no
4076    enable_support_build=no
4077    BTLS_SUPPORTED=no
4078    # Can't use tls, since it depends on the runtime detection of tls offsets
4079    # in mono-compiler.h
4080    with_tls=pthread
4081    target_mach=no
4082    case "$target" in
4083    wasm32*)
4084                 TARGET=WASM
4085                 arch_target=wasm
4086                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4087                 ;;
4088    arm*-darwin*)
4089                 TARGET=ARM;
4090                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4091                 case "$target" in
4092                 armv7k-*)
4093                         arm_fpu=VFP_HARD
4094                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4095                         ;;
4096                 esac            
4097                 ;;
4098    powerpc64-ps3-linux-gnu)
4099                 TARGET=POWERPC64
4100                 arch_target=powerpc64
4101                 AC_DEFINE(TARGET_PS3, 1, [...])
4102                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4103                 # uses this define
4104                 AC_DEFINE(__mono_ppc64__, 1, [...])
4105                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
4106                 sizeof_register=8
4107                 target_byte_order=G_BIG_ENDIAN
4108                 ;;
4109    powerpc64-xbox360-linux-gnu)
4110                 TARGET=POWERPC64
4111                 arch_target=powerpc64
4112                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4113                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4114                 # uses this define
4115                 sizeof_register=8
4116                 target_byte_order=G_BIG_ENDIAN
4117                 ;;
4118    arm*-linux-*)
4119                 TARGET=ARM;
4120                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4121                 ;;
4122    arm*-netbsd*-eabi*)
4123                 TARGET=ARM;
4124                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4125                 ;;
4126    i686*-linux-*)
4127                 TARGET=X86;
4128                 ;;
4129    i*86-apple-*)
4130                 TARGET=X86;
4131                 ;;
4132    x86_64*-linux-*)
4133                 TARGET=AMD64;
4134                 ;;
4135    x86_64-ps4-freebsd)
4136                 TARGET=AMD64;
4137                 AC_DEFINE(TARGET_PS4, 1, [...])
4138                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4139                 CPPFLAGS="$CPPFLAGS"
4140                 target_win32=no
4141                 ;;
4142    aarch64*-linux-*)
4143                 TARGET=ARM64;
4144                 ;;
4145         aarch64-*)
4146                 TARGET=ARM64
4147                 ;;
4148         *)
4149                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4150         esac
4152         case "$target" in
4153         *-darwin*)
4154                 target_mach=yes
4155                 ;;
4156         *-linux-android*)
4157                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4158                 ;;
4159         esac
4162 case "$TARGET" in
4163 WASM)
4164         AC_DEFINE(TARGET_WASM, 1, [...])
4165         arch_target=wasm
4166         target_sizeof_void_p=4
4167         ;;
4168 X86)
4169         AC_DEFINE(TARGET_X86, 1, [...])
4170         arch_target=x86
4171         target_sizeof_void_p=4
4172         ;;
4173 AMD64)
4174         AC_DEFINE(TARGET_AMD64, 1, [...])
4175         arch_target=amd64
4176         ;;
4177 ARM)
4178         AC_DEFINE(TARGET_ARM, 1, [...])
4179         arch_target=arm
4180         ACCESS_UNALIGNED="no"
4181         target_sizeof_void_p=4
4182         ;;
4183 ARM64)
4184         AC_DEFINE(TARGET_ARM64, 1, [...])
4185         arch_target=arm64
4186         ;;
4187 POWERPC)
4188         AC_DEFINE(TARGET_POWERPC, 1, [...])
4189         ;;
4190 POWERPC64)
4191         AC_DEFINE(TARGET_POWERPC, 1, [...])
4192         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4193         ;;
4194 S390X)
4195         AC_DEFINE(TARGET_S390X, 1, [...])
4196         ;;
4197 MIPS)
4198         AC_DEFINE(TARGET_MIPS, 1, [...])
4199         ;;
4200 SPARC)
4201         AC_DEFINE(TARGET_SPARC, 1, [...])
4202         ;;
4203 SPARC64)
4204         AC_DEFINE(TARGET_SPARC64, 1, [...])
4205         ;;
4206 esac
4208 case "$HOST" in
4209 WASM)
4210         AC_DEFINE(HOST_WASM, 1, [...])
4211         ;;
4212 X86)
4213         AC_DEFINE(HOST_X86, 1, [...])
4214         ;;
4215 AMD64)
4216         AC_DEFINE(HOST_AMD64, 1, [...])
4217         ;;
4218 ARM)
4219         AC_DEFINE(HOST_ARM, 1, [...])
4220         ;;
4221 ARM64)
4222         AC_DEFINE(HOST_ARM64, 1, [...])
4223         ;;
4224 POWERPC)
4225         AC_DEFINE(HOST_POWERPC, 1, [...])
4226         ;;
4227 POWERPC64)
4228         AC_DEFINE(HOST_POWERPC, 1, [...])
4229         AC_DEFINE(HOST_POWERPC64, 1, [...])
4230         ;;
4231 S390X)
4232         AC_DEFINE(HOST_S390X, 1, [...])
4233         ;;
4234 MIPS)
4235         AC_DEFINE(HOST_MIPS, 1, [...])
4236         ;;
4237 SPARC)
4238         AC_DEFINE(HOST_SPARC, 1, [...])
4239         ;;
4240 SPARC64)
4241         AC_DEFINE(HOST_SPARC64, 1, [...])
4242         ;;
4243 esac
4245 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4246 case "$HOST" in
4247 X86 | AMD64 | ARM | ARM64)
4248         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4249         ;;
4250 esac
4252 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4253 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4255 dnl *************
4256 dnl *** VTUNE ***
4257 dnl *************
4259 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4260 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4262 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4264 if test "x$enable_vtune" = "xyes"; then
4265         if test "x$with_vtune" = "x"; then
4266                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4267         else
4268                 VTUNE_PATH=$with_vtune
4269         fi
4270         VTUNE_INCLUDE=$VTUNE_PATH/include
4271         case "$TARGET" in
4272         X86)
4273                 VTUNE_LIB=$VTUNE_PATH/lib32
4274                 ;;
4275         AMD64)
4276                 VTUNE_LIB=$VTUNE_PATH/lib64
4277                 ;;
4278         *)
4279                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4280                 ;;
4281         esac
4282         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4283                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4284         fi
4285         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4286                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4287         fi
4289         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4290         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4292         AC_SUBST(VTUNE_LIBS)
4293         AC_SUBST(VTUNE_CFLAGS)
4295 dnl Use GCC atomic ops if they work on the target.
4296 if test x$GCC = "xyes"; then
4297         case $TARGET in
4298         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
4299                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4300                 ;;
4301         esac
4304 if test "x$target_mach" = "xyes"; then
4306    if test "x$TARGET_SYS" = "xWATCHOS"; then
4307           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4308           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4309           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4310           BTLS_SUPPORTED=no
4311    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4312           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4313           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4314           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4315           BTLS_SUPPORTED=no
4316           target_ios=yes
4317    else
4318        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4319        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4320        #error fail this for ios
4321        #endif
4322        ], [
4323                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4324           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4325           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4326           target_osx=yes
4327        ], [
4328           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4329           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4330           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4331           BTLS_SUPPORTED=no
4332                   target_ios=yes
4333        ])
4334         fi
4335    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4338 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4340 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4342 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4343    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4344 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4345    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4346 else
4347    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4350 if test "x$target_sizeof_void_p" != "x"; then
4351    AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4352    # This is true for all the current cross-compiling targets
4353    AC_DEFINE(SIZEOF_REGISTER,TARGET_SIZEOF_VOID_P,[size of target machine integer registers])
4354 else
4355    AC_DEFINE(TARGET_SIZEOF_VOID_P,SIZEOF_VOID_P,[wordsize of target])
4356    if test "x$sizeof_register" = "x4"; then
4357       AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4358    elif test "x$sizeof_register" = "x8"; then
4359       AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4360    else
4361       AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of target machine integer registers])
4362    fi
4365 if test "x$have_visibility_hidden" = "xyes"; then
4366    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4369 if test "x$have_deprecated" = "xyes"; then
4370    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4373 dnl 
4374 dnl Simple Generational checks (sgen)
4376 SGEN_DEFINES=
4377 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4378 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4379 if test x$buildsgen = xyes; then
4380    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4381    SGEN_DEFINES="-DHAVE_SGEN_GC"
4383         conc_gc_msg=""
4384    if test x$with_sgen_default_concurrent != xno; then
4385        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4386            conc_gc_msg=" (concurrent by default)"
4387    fi
4389    if test "x$gc_msg" = "x"; then
4390       gc_msg="sgen$conc_gc_msg"
4391    else
4392       gc_msg="sgen$conc_gc_msg and $gc_msg"
4393    fi
4395 AC_SUBST(SGEN_DEFINES)
4396 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4398 jit_status="Building and using the JIT"
4400 libsuffix=".so"
4402 case "$host" in
4403      *-*-darwin*)
4404         libsuffix=".dylib"
4405         LIBC="libc.dylib"
4406         INTL="libintl.dylib"
4407         SQLITE="libsqlite.0.dylib"
4408         SQLITE3="libsqlite3.0.dylib"
4409         X11="libX11.dylib"
4410         GDKX11="libgdk-x11-2.0.dylib"
4411         GTKX11="libgtk-x11-2.0.dylib"
4412         ;;
4413      *-*-*netbsd*)
4414         LIBC="libc.so"
4415         INTL="libintl.so"
4416         SQLITE="libsqlite.so"
4417         SQLITE3="libsqlite3.so"
4418         ;;
4419      *-*-kfreebsd*-gnu)
4420         LIBC="libc.so.0.1"
4421         INTL="libc.so.0.1"
4422         X11="libX11.so.6"
4423         ;;
4424     *-*-*freebsd*)
4425         LIBC="libc.so.7"
4426         INTL="libintl.so"
4427         SQLITE="libsqlite.so"
4428         SQLITE3="libsqlite3.so"
4429         ;;
4430     *-*-*openbsd*)
4431         LIBC="libc.so"
4432         INTL="libintl.so"
4433         SQLITE="libsqlite.so"
4434         SQLITE3="libsqlite3.so"
4435         ;;
4436     *-*-*linux*)
4437         AC_PATH_X
4438         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4439         AC_MSG_CHECKING(for the soname of libX11.so)
4440         for i in $x_libraries $dlsearch_path; do
4441                 for r in 4 5 6; do
4442                         if test -f $i/libX11.so.$r; then
4443                                 X11=libX11.so.$r
4444                                 AC_MSG_RESULT($X11)
4445                         fi
4446                 done
4447         done
4448         
4449         if test "x$X11" = "xlibX11.so"; then
4450                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4451                 X11=libX11.so.6
4452         fi
4453         ;;
4454 esac
4456 AC_SUBST(libsuffix)
4458 ######################################
4459 # EGLIB CHECKS
4460 ######################################
4462 GNUC_PRETTY=
4463 GNUC_UNUSED=
4464 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4465 if test x$GCC = xyes; then
4466    GNUC_UNUSED='__attribute__((__unused__))'
4467    GNUC_NORETURN='__attribute__((__noreturn__))'
4468    case $host_cpu in
4469      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4470    esac
4472 AC_SUBST(GNUC_PRETTY)
4473 AC_SUBST(GNUC_UNUSED)
4474 AC_SUBST(GNUC_NORETURN)
4475 AC_SUBST(BREAKPOINT)
4477 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4479 case $host in
4480 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4481     PATHSEP='\\'
4482     SEARCHSEP=';'
4483     OS="WIN32"
4484     PIDTYPE='void *'
4485     ;;
4487     PATHSEP='/'
4488     SEARCHSEP=':'
4489     OS="UNIX"
4490     PIDTYPE='int'
4491     ;;
4492 esac
4494 case $host in
4495         *-*-solaris*)
4496         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4497         ;;
4498 esac
4500 case $target in
4501 arm*-darwin*|aarch64*-*)
4502     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4503     ;;
4504 i*86-*-darwin*)
4505     ORDER=G_LITTLE_ENDIAN
4506     ;;
4507 *-*-haiku*)
4508     LDFLAGS="$LDFLAGS -ltextencoding"
4509     ;;
4510 *-*-openbsd*)
4511     CFLAGS="$CFLAGS -pthread"
4512     LDFLAGS="$LDFLAGS -pthread"
4513     ;;
4514 esac
4516 AC_SUBST(ORDER)
4517 AC_SUBST(CFLAGS)
4518 AC_SUBST(PATHSEP)
4519 AC_SUBST(SEARCHSEP)
4520 AC_SUBST(OS)
4521 AC_SUBST(PIDTYPE)
4523 # Defined for all targets/platforms using classic Windows API support.
4524 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4525 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4527 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4528 AC_CHECK_FUNCS(getrlimit)
4529 AC_CHECK_FUNCS(fork execv execve)
4531 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4533 if test x$with_overridable_allocators = xyes; then
4534         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4535   AC_MSG_NOTICE([Overridable allocator support enabled])
4536 else
4537   AC_MSG_NOTICE([Overridable allocator support disabled])
4541 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4542 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4543 # removed once support for 10.6 is dropped.
4545 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4547 if test x$target_osx = xyes; then
4548 AC_CHECK_FUNCS(getpwuid_r)
4549 elif test x$target_ios = xno; then
4550 AC_CHECK_FUNCS(strndup getpwuid_r)
4553 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4555 AC_SEARCH_LIBS(sqrtf, m)
4557 # nanosleep may not be part of libc, also search it in other libraries
4558 AC_SEARCH_LIBS(nanosleep, rt)
4560 AC_SEARCH_LIBS(dlopen, dl)
4561 old_ldflags="${LDFLAGS}"
4562 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4563 if test $lt_cv_prog_gnu_ld = yes; then
4564         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4565 else
4566         case $host in
4567         *-*-aix*|*-*-os400*)
4568                 ;;
4569         *)
4570                 dnl Try to use export-dynamic anyways
4571                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4572                 ;;
4573         esac
4575 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4576 if test $found_export_dynamic = no; then
4577         LDFLAGS="${old_ldflags}"
4580 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4581 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4582 AC_CHECK_LIB(iconv, iconv_open)
4583 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4584 AC_SUBST(HAVE_ALLOCA_H)
4586 # Get the exact type of size_t, not just its size.
4587 # This is so we can find an exact printf format among u, lu, llu, I64u.
4588 # To avoid warnings about slight mismatches.
4589 # C99 runtime "zu" dependency is being avoided here.
4591 # We have to compile as C++ because C is too lenient
4592 # and lets the wrong thing compile, with warnings.
4594 # Note: "zu" or ifdef <something> have the advantage
4595 # of producing installable "biarch" headers. i.e. one Mac header
4596 # for Mac/x86 and Mac/amd64.
4598 AC_LANG_PUSH(C++)
4600 # Check long before int because it is the overwhelming Unix answer,
4601 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4603 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4605 AC_MSG_CHECKING(if size_t is unsigned long)
4606 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4607         #include <stddef.h>
4608         unsigned long *a = (size_t*)0;
4609 ])], [
4610         AC_MSG_RESULT(yes)
4611         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4612 ], [
4613         AC_MSG_RESULT(no)
4614         AC_MSG_CHECKING(if size_t is unsigned int)
4615         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4616                 #include <stddef.h>
4617                 unsigned *a = (size_t*)0;
4618         ])], [
4619                 AC_MSG_RESULT(yes)
4620                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4621         ], [
4622 # At this point the majority of systems have their answer,
4623 # and we descend into non-standard or new-standard territory.
4625 # Check __int64 first because I64 on some systems predates ll, enabling
4626 # new compiler/old runtime interop, and the types always have the same size.
4627                 AC_MSG_RESULT(no)
4628                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4629                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4630                         #include <stddef.h>
4631                         unsigned __int64 *a = (size_t*)0;
4632                 ])], [
4633                         AC_MSG_RESULT(yes)
4634                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4635                 ], [
4636                         AC_MSG_RESULT(no)
4637                         AC_MSG_CHECKING(if size_t is unsigned long long)
4638                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4639                                 #include <stddef.h>
4640                                 unsigned long long *a = (size_t*)0;
4641                         ])], [
4642                                 AC_MSG_RESULT(yes)
4643                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4644                         ], [
4645                                 AC_MSG_RESULT(no)
4646                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4647                         ] )
4648                 ] )
4649         ] )
4650 ] )
4652 AC_LANG_POP
4654 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4655 # This provides for an exact match with functions that
4656 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4657 # uintptr_t is not necessarily the same.
4659 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4660 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4662 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4663    GSIZE="size_t"
4664    GSSIZE="ptrdiff_t"
4665 else
4666    GSIZE="uintptr_t"
4667    GSSIZE="intptr_t"
4670 AC_SUBST(GSIZE)
4671 AC_SUBST(GSSIZE)
4672 AC_SUBST(GSIZE_FORMAT)
4675 # END OF EGLIB CHECKS
4678 AC_ARG_WITH([libgdiplus],
4679         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4680         [], [with_libgdiplus=installed])
4682 # default install location
4683 libgdiplus_install_loc=libgdiplus${libsuffix}
4684 case "$host" in
4685     *-*-*linux*)
4686     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4687     ;;
4688 esac
4690 case $with_libgdiplus in
4691     no)
4692     libgdiplus_loc=
4693     ;;
4695     installed)
4696     libgdiplus_loc=
4697     if test x$cross_compiling = xno; then
4698         if test x$host_darwin = xyes; then
4699             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4700             if test -x $a; then
4701               libgdiplus_install_loc=$a
4702               libgdiplus_loc=$a
4703             fi
4704         fi
4705     fi
4706     ;;
4708     yes|sibling)
4709     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4710     ;;
4712     /*) # absolute path, assume it is an install location
4713     libgdiplus_loc=$with_libgdiplus
4714     libgdiplus_install_loc=$with_libgdiplus
4715     ;;
4717     *)
4718     libgdiplus_loc=`pwd`/$with_libgdiplus
4719     ;;
4720 esac
4721 AC_SUBST(libgdiplus_loc)
4722 AC_SUBST(libgdiplus_install_loc)
4724 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)
4725 if test "x$icall_symbol_map" = "xyes"; then
4726    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4729 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4730 if test "x$icall_export" = "xyes"; then
4731    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4734 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4735 if test "x$icall_tables" = "xno"; then
4736    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4739 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4741 if test "x$with_tls" = "x__thread"; then
4742         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4743         # Pass the information to libgc
4744         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4745         AC_MSG_CHECKING(if the tls_model attribute is supported)
4746         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4747                 ], [
4748                         AC_MSG_RESULT(yes)
4749                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4750                 ], [
4751                         AC_MSG_RESULT(no)
4752         ])
4755 if test ${TARGET} = ARM; then
4756         dnl ******************************************
4757         dnl *** Check to see what FPU is available ***
4758         dnl ******************************************
4759         AC_MSG_CHECKING(which FPU to use)
4761         #
4762         # This is a bit tricky:
4763         #
4764         # if (__ARM_PCS_VFP) {
4765         #       /* mfloat-abi=hard == VFP with hard ABI */
4766         # } elif (!__SOFTFP__) {
4767         #       /* mfloat-abi=softfp == VFP with soft ABI */
4768         # } else {
4769         #       /* mfloat-abi=soft == no VFP */
4770         # }
4771         #
4772         # The exception is iOS (w/ GCC) where none of the above
4773         # are defined (but iOS always uses the 'softfp' ABI).
4774         #
4775         # No support for FPA.
4776         #
4778         fpu=NONE
4780         # iOS GCC always uses the 'softfp' ABI.
4781         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4782                 fpu=VFP
4783         fi
4785         # Are we using the 'hard' ABI?
4786         if test x$fpu = xNONE; then
4787                 AC_TRY_COMPILE([], [
4788                         #ifndef __ARM_PCS_VFP
4789                         #error "Float ABI is not 'hard'"
4790                         #endif
4791                 ], [
4792                         fpu=VFP_HARD
4793                 ], [
4794                         fpu=NONE
4795                 ])
4796         fi
4798         # No 'hard' ABI. 'soft' or 'softfp'?
4799         if test x$fpu = xNONE; then
4800                 AC_TRY_COMPILE([], [
4801                         #ifdef __SOFTFP__
4802                         #error "Float ABI is not 'softfp'"
4803                         #endif
4804                 ], [
4805                         fpu=VFP
4806                 ], [
4807                         fpu=NONE
4808                 ])
4809         fi
4811         if test x$arm_fpu != x; then
4812            fpu=$arm_fpu
4813         fi
4815         AC_MSG_RESULT($fpu)
4816         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4817         unset fpu
4819         dnl *********************************************
4820         dnl *** Check which ARM version(s) we can use ***
4821         dnl *********************************************
4822         AC_MSG_CHECKING(which ARM version to use)
4824         AC_TRY_COMPILE([], [
4825                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4826                 #error Not on ARM v5.
4827                 #endif
4828         ], [
4829                 arm_v5=yes
4831                 arm_ver=ARMv5
4832         ], [])
4834         AC_TRY_COMPILE([], [
4835                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4836                 #error Not on ARM v6.
4837                 #endif
4838         ], [
4839                 arm_v5=yes
4840                 arm_v6=yes
4842                 arm_ver=ARMv6
4843         ], [])
4845         AC_TRY_COMPILE([], [
4846                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4847                 #error Not on ARM v7.
4848                 #endif
4849         ], [
4850                 arm_v5=yes
4851                 arm_v6=yes
4852                 arm_v7=yes
4854                 arm_ver=ARMv7
4855         ], [])
4857         AC_MSG_RESULT($arm_ver)
4859         if test x$arm_v5 = xyes; then
4860                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4861                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4862         fi
4864         if test x$arm_v6 = xyes; then
4865                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4866                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4867         fi
4869         if test x$arm_v7 = xyes; then
4870                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4871                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4872         fi
4875 if test ${TARGET} = unknown; then
4876         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4877         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4880 if test "x$platform_android" = "xyes"; then
4881         case "x${TARGET}" in
4882         xARM)
4883                 case "x$arm_ver" in
4884                 xARMv5)
4885                         BTLS_SUPPORTED=yes
4886                         BTLS_PLATFORM=android-armv5
4887                         ;;
4888                 xARMv6)
4889                         BTLS_SUPPORTED=yes
4890                         BTLS_PLATFORM=android-armv6
4891                         ;;
4892                 xARMv7)
4893                         BTLS_SUPPORTED=yes
4894                         BTLS_PLATFORM=android-armv7
4895                         ;;
4896                 *)
4897                         BTLS_SUPPORTED=no
4898                         ;;
4899                 esac
4900                 ;;
4901         xARM64)
4902                 BTLS_SUPPORTED=yes
4903                 BTLS_PLATFORM=android-v8a
4904                 ;;
4905         xX86)
4906                 BTLS_SUPPORTED=yes
4907                 BTLS_PLATFORM=android-x86
4908                 ;;
4909         xAMD64)
4910                 BTLS_SUPPORTED=yes
4911                 BTLS_PLATFORM=android-x64
4912                 ;;
4913         *)
4914                 BTLS_SUPPORTED=no
4915                 ;;
4916         esac
4919 if test ${ACCESS_UNALIGNED} = no; then
4920         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4923 if test x$host_darwin = xyes; then
4924         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4925         AS_IF(
4926                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4927                 [AC_MSG_RESULT([no])],
4928                 [
4929                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4930                         AR_FLAGS="Scru"
4931                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4932                         AC_MSG_RESULT([yes])
4933                 ]
4934         )
4937 case "x$libgc" in
4938         xincluded)
4939                 # Pass CPPFLAGS to libgc configure
4940                 # We should use a separate variable for this to avoid passing useless and
4941                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4942                 # This should be executed late so we pick up the final version of CPPFLAGS
4943                 # The problem with this approach, is that during a reconfigure, the main
4944                 # configure scripts gets invoked with these arguments, so we use separate
4945                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4946                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4947                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4948                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4949                 fi
4950                 # Don't pass -finstrument-for-thread-suspension in, 
4951                 # if these are instrumented it will be very bad news 
4952                 # (infinite recursion, undefined parking behavior, etc)
4953                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4954                 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\""
4955                 if test "x$support_boehm" = "xyes"; then
4956                         AC_CONFIG_SUBDIRS(libgc)
4957                 fi
4958                 ;;
4959 esac
4961 MALLOC_MEMPOOLS=no
4962 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4963         if test x$with_malloc_mempools = xyes; then
4964                 MALLOC_MEMPOOLS=yes
4965                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4966         fi
4970 DISABLE_MCS_DOCS=default
4971 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4972         if test x$with_mcs_docs != xyes; then
4973                 DISABLE_MCS_DOCS=yes
4974         fi
4976 if test -n "$INSTALL_4_x_TRUE"; then :
4977         DISABLE_MCS_DOCS=yes
4979 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4980    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4983 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)],[
4984         if test x$with_lazy_gc_thread_creation != xno ; then
4985                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4986         fi
4987 ], [with_lazy_gc_thread_creation=no])
4989 dnl *****************************
4990 dnl *** Thread suspend policy ***
4991 dnl *****************************
4993 dnl Set a default hybrid or cooperative suspend on some platforms
4995 dnl Coop default is set by the bitcode preset.
4997 dnl If coop isn't on by default, maybe hybrid should be?
4998 if test x$enable_cooperative_suspend_default != xyes; then
4999         case $HOST in
5000         X86 | AMD64)
5001                 dnl Some host/target confusion, there's no host_osx (and
5002                 dnl host_darwin would be true on iOS not just macOS).
5003                 if test x$target_osx = xyes; then
5004                         enable_hybrid_suspend_default=yes
5005                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5006                         enable_hybrid_suspend_default=yes
5007                 fi
5008                 ;;
5009         esac
5012 dnl Now check if there were flags overriding the defaults
5014 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])
5015 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5017 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5018         enable_cooperative_suspend=$with_cooperative_gc
5021 if test x$enable_cooperative_suspend = xdefault; then
5022         enable_cooperative_suspend=$enable_cooperative_suspend_default
5025 if test x$enable_cooperative_suspend != xno; then
5026         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5029 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5031 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])
5033 if test x$enable_hybrid_suspend = xdefault; then
5034    enable_hybrid_suspend=$enable_hybrid_suspend_default
5037 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5038         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5041 if test x$enable_hybrid_suspend != xno ; then
5042         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5045 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5047 dnl End of thread suspend policy
5049 dnl ***************************
5050 dnl *** feature experiments ***
5051 dnl ***************************
5053 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5054 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5056         if test x$enable_experiment != x ; then
5057                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5058         fi
5059         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5060                 eval "mono_experiment_test_enable_$feature='yes'"
5061         done
5063         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5064                 eval "mono_experiment_test_enable_null='yes'"
5065                 true
5066         fi
5068         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5069                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5070         fi
5071 ],[])
5073 dnl **********************
5074 dnl *** checked builds ***
5075 dnl **********************
5077 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],[
5079         if test x$enable_checked_build != x ; then
5080                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5081         fi
5082         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5083                 eval "mono_checked_build_test_enable_$feature='yes'"
5084         done
5086         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5087                 eval "mono_checked_build_test_enable_gc='yes'"
5088                 eval "mono_checked_build_test_enable_metadata='yes'"
5089                 eval "mono_checked_build_test_enable_thread='yes'"
5090                 eval "mono_checked_build_test_enable_private_types='yes'"
5091         fi
5093         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5094                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5095         fi
5097         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5098                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5099         fi
5101         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5102                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5103         fi
5105         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5106                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5107         fi
5108 ], [])
5110 dnl End of checked builds
5112 AC_CHECK_HEADER([malloc.h], 
5113                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5114                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5116 if test x"$GCC" = xyes; then
5117         # Implicit function declarations are not 64 bit safe
5118         # Do this late, since this causes lots of configure tests to fail
5119         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5120         # jay has a lot of implicit declarations
5121         JAY_CFLAGS="-Wno-implicit-function-declaration"
5124 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5125 # instead of libmono-static.a
5126 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5127    LIBMONO_LA=libmini-static.la
5128 else
5129    if test x$buildsgen = xyes; then
5130       LIBMONO_LA=libmonosgen-$API_VER.la
5131    else
5132       LIBMONO_LA=libmonoboehm-$API_VER.la
5133    fi
5135 AC_SUBST(LIBMONO_LA)
5137 dnl **************
5138 dnl ***  Btls  ***
5139 dnl **************
5141 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5142 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5143 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5145 if test "x$enable_btls" = "xno"; then
5146    enable_btls_lib=no
5149 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5151 btls_android=no
5152 if test "x$enable_btls" = "xyes"; then
5153         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5154         if test "x$CMAKE" = "xno"; then
5155                 AC_MSG_ERROR("cmake not found")
5156         fi
5158         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5159         AC_SUBST(BTLS_ROOT)
5161         btls_arch=
5162         btls_cflags=
5163         BTLS_CMAKE_ARGS=
5165         if test "x$host_win32" = "xyes"; then
5166                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5167         fi
5169         case "$BTLS_PLATFORM" in
5170         i386)
5171                 btls_arch=i386
5172                 btls_cflags="-m32"
5173                 case $host_os in
5174                         darwin*)
5175                                 btls_cflags="$btls_cflags -arch i386"
5176                                 ;;
5177                         mingw*|cygwin*)
5178                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5179                                 if test "x$HAVE_YASM" != "xyes"; then
5180                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5181                                 fi
5182                                 ;;
5183                 esac
5184                 ;;
5185         x86_64)
5186                 btls_arch=x86_64
5187                 case $host_os in
5188                         mingw*|cygwin*)
5189                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5190                                 if test "x$HAVE_YASM" != "xyes"; then
5191                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5192                                 fi
5193                                 ;;
5194                 esac
5195                 ;;
5196         arm)
5197                 btls_arch=arm
5198                 btls_cflags="-DOPENSSL_NO_ASM=1"
5199                 ;;
5200         armsoft)
5201                 btls_arch=arm
5202                 btls_cflags="-DOPENSSL_NO_ASM=1"
5203                 ;;
5204         aarch64)
5205                 btls_arch=aarch64
5206                 btls_cflags="-march=armv8-a+crypto"
5207                 ;;
5208         s390x)
5209                 btls_arch=s390x
5210                 ;;
5211         powerpc)
5212                 btls_arch=powerpc
5213                 case $host_os in
5214                         aix*|os400*)
5215                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5216                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5217                 esac
5218                 ;;
5219         android-armv5)
5220                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5221                 ;;
5222         android-armv6)
5223                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5224                 ;;
5225         android-armv7)
5226                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5227                 ;;
5228         android-v8a)
5229                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5230                 ;;
5231         android-x86)
5232                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5233                 ;;
5234         android-x64)
5235                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5236                 ;;
5237         *)
5238                 AC_MSG_ERROR(Invalid BTLS platform)
5239         esac
5241         if test "x$platform_android" = "xyes"; then
5242                 btls_android=yes
5243                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5244                 if test "x$with_btls_android_ndk" != "x"; then
5245                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5246                 else
5247                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5248                 fi
5249         fi
5251         if test "x$btls_arch" != "x"; then
5252                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5253         fi
5255         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5256         AC_SUBST(BTLS_ARCH)
5257         AC_SUBST(BTLS_CFLAGS)
5258         AC_SUBST(BTLS_PLATFORM)
5259         AC_SUBST(BTLS_CMAKE_ARGS)
5261         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5262 else
5263         enable_btls=no
5266 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5268 if test x$DISABLE_MCS_DOCS = xyes; then
5269    docs_dir=""
5270 else
5271    docs_dir=docs
5273 AC_SUBST(docs_dir)
5275 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5276 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5277 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5279 libmono_ldflags="$libmono_ldflags $LIBS"
5281 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5282 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5283 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5284 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5285 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5286 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5287 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5288 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5289 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5290 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5291 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5292 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5293 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5294 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5295 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5296 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5297 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5298 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5300 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5302 AC_SUBST(LIBC)
5303 AC_SUBST(INTL)
5304 AC_SUBST(SQLITE)
5305 AC_SUBST(SQLITE3)
5306 AC_SUBST(X11)
5307 AC_SUBST(GDKX11)
5308 AC_SUBST(GTKX11)
5309 AC_SUBST(XINERAMA)
5310 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5311 AC_SUBST(arch_target)
5312 AC_SUBST(CFLAGS)
5313 AC_SUBST(CPPFLAGS)
5314 AC_SUBST(LDFLAGS)
5316 #This must always be defined when building the runtime
5317 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5319 mono_build_root=`pwd`
5320 AC_SUBST(mono_build_root)
5322 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5323 if test x$host_win32 = xno; then
5324         if test x$enable_msvc = xyes; then
5325                 echo "Error, --enable-msvc only supported for Windows builds."
5326                 exit 1
5327         fi
5329 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5331 if test "x$enable_msvc" = "xyes"; then
5332         if test "x$support_boehm" = "xyes"; then
5333                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5334                 exit 1
5335         fi
5336         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5337         if test "x$host_cpu" = "xi686"; then
5338                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5339                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5340                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5341         else
5342                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5343                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5344                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5345         fi
5346         AC_SUBST(mono_msvc_build_dir)
5347         AC_SUBST(mono_msvc_build_lib_dir)
5348         AC_SUBST(mono_msvc_build_bin_dir)
5349 else
5350         mono_runtime=mono/mini/mono
5353 AC_SUBST(mono_runtime)
5355 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5357 if test $csc_compiler = mcs; then
5358   CSC=$mcs_topdir/class/lib/build/mcs.exe
5359 else
5360   CSC=$CSC_LOCATION
5363 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5365 mono_cfg_root=$mono_build_root/runtime
5366 if test x$host_win32 = xyes; then
5367   if test "x$cross_compiling" = "xno"; then
5368     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5369     CSC=`cygpath -m -a $CSC`
5370     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5371   else
5372     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5373   fi
5374 else
5375   mono_cfg_dir=$mono_cfg_root/etc
5377 AC_SUBST(mono_cfg_dir)
5379 AC_SUBST(CSC)
5381 AC_CONFIG_FILES([po/mcs/Makefile.in])
5383 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5384 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5386 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5387 [   depth=../../../..
5388     case $srcdir in
5389     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5390     .) reldir=$depth ;;
5391     *) reldir=$depth/$srcdir ;;
5392     esac
5393     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5394     cd runtime/etc/mono/1.0
5395     rm -f machine.config
5396     $LN_S $reldir/data/net_1_1/machine.config machine.config
5397     cd $depth
5398 ],[LN_S='$LN_S'])
5400 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5401 [   depth=../../../..
5402     case $srcdir in
5403     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5404     .) reldir=$depth ;;
5405     *) reldir=$depth/$srcdir ;;
5406     esac
5407     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5408     cd runtime/etc/mono/2.0
5409     rm -f machine.config
5410     $LN_S $reldir/data/net_2_0/machine.config machine.config
5411     cd $depth
5412 ],[LN_S='$LN_S'])
5414 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5415 [   depth=../../../..
5416     case $srcdir in
5417     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5418     .) reldir=$depth ;;
5419     *) reldir=$depth/$srcdir ;;
5420     esac
5421     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5422     cd runtime/etc/mono/2.0
5423     rm -f web.config
5424     $LN_S $reldir/data/net_2_0/web.config web.config
5425     cd $depth
5426 ],[LN_S='$LN_S'])
5428 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5429 [   depth=../../..
5430     case $srcdir in
5431     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5432     .) reldir=$depth ;;
5433     *) reldir=$depth/$srcdir ;;
5434     esac
5435     $ac_aux_dir/install-sh -d runtime/etc/mono/
5436     cd runtime/etc/mono/
5437     rm -f browscap.ini
5438     $LN_S $reldir/data/browscap.ini browscap.ini
5439     cd $depth
5440 ],[LN_S='$LN_S'])
5442 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5443 [   depth=../../../../..
5444     case $srcdir in
5445     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5446     .) reldir=$depth ;;
5447     *) reldir=$depth/$srcdir ;;
5448     esac
5449     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5450     cd runtime/etc/mono/2.0/Browsers
5451     rm -f Compat.browser
5452     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5453     cd $depth
5454 ],[LN_S='$LN_S'])
5456 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5457 [   depth=../../../../..
5458     case $srcdir in
5459     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5460     .) reldir=$depth ;;
5461     *) reldir=$depth/$srcdir ;;
5462     esac
5463     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5464     cd runtime/etc/mono/4.0/Browsers
5465     rm -f Compat.browser
5466     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5467     cd $depth
5468 ],[LN_S='$LN_S'])
5470 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5471 [   depth=../../../../..
5472     case $srcdir in
5473     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5474     .) reldir=$depth ;;
5475     *) reldir=$depth/$srcdir ;;
5476     esac
5477     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5478     cd runtime/etc/mono/4.5/Browsers
5479     rm -f Compat.browser
5480     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5481     cd $depth
5482 ],[LN_S='$LN_S'])
5484 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5485 [   depth=../../../..
5486     case $srcdir in
5487     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5488     .) reldir=$depth ;;
5489     *) reldir=$depth/$srcdir ;;
5490     esac
5491     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5492     cd runtime/etc/mono/4.0
5493     rm -f machine.config
5494     $LN_S $reldir/data/net_4_0/machine.config machine.config
5495     cd $depth
5496 ],[LN_S='$LN_S'])
5498 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5499 [   depth=../../../..
5500     case $srcdir in
5501     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5502     .) reldir=$depth ;;
5503     *) reldir=$depth/$srcdir ;;
5504     esac
5505     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5506     cd runtime/etc/mono/4.0
5507     rm -f web.config
5508     $LN_S $reldir/data/net_4_0/web.config web.config
5509     cd $depth
5510 ],[LN_S='$LN_S'])
5512 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5513 [   depth=../../../..
5514     case $srcdir in
5515     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5516     .) reldir=$depth ;;
5517     *) reldir=$depth/$srcdir ;;
5518     esac
5519     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5520     cd runtime/etc/mono/4.5
5521     rm -f machine.config
5522     $LN_S $reldir/data/net_4_5/machine.config machine.config
5523     cd $depth
5524 ],[LN_S='$LN_S'])
5526 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5527 [   depth=../../../..
5528     case $srcdir in
5529     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5530     .) reldir=$depth ;;
5531     *) reldir=$depth/$srcdir ;;
5532     esac
5533     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5534     cd runtime/etc/mono/4.5
5535     rm -f web.config
5536     $LN_S $reldir/data/net_4_5/web.config web.config
5537     cd $depth
5538 ],[LN_S='$LN_S'])
5540 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])
5541 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])
5542 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5544 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5545 if test x"$GCC" = xyes; then
5547         # incompatible-pointer-types requires gcc circa 5.x
5549         ORIG_CFLAGS=$CFLAGS
5550         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5551         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5552         AC_TRY_COMPILE([],[
5553         ], [
5554                 AC_MSG_RESULT(yes)
5555                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5556         ], [
5557                 AC_MSG_RESULT(no)
5558                 CFLAGS=$ORIG_CFLAGS
5559         ])
5563 # Mono.Native Support
5564 # -------------------
5565 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5566 # It is built as a stand-alone shared library and not bundled with the runtime because we
5567 # may need to build two different versions of it.
5569 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5570 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5572 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5573 # implementation accordingly.  We build a single `libmono_native` shared library.
5575 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5577 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5578 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5579 # depending on platform.
5581 # We build two versions of the shared library:
5582 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5583 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5585 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5586 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5587 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5589 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5590 # to verify that it's the correct version of it.
5593 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
5594 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
5596 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5597 if test x$target_osx = xyes; then
5598         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5599         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5600         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5601         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5602         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5603         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5604         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5605         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5606         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5608         mono_native=yes
5609         MONO_NATIVE_PLATFORM=macos
5610         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5611         AC_MSG_CHECKING([Mono.Native support])
5612         AC_MSG_RESULT(macos)
5614         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5615                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5617         if test x$mono_native_compat = xyes; then
5618                 mono_native_compat=yes
5619                 mono_native_text="Mac OSX (compat+unified)"
5620                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5621                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5622                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5623                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5624         else
5625                 mono_native_compat=no
5626                 mono_native_text="Mac OSX"
5627         fi
5628 elif test x$mono_native_platform_ios = xyes; then
5629         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5631         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5632                 if test x$mono_native_ios_sim = xyes; then
5633                         mono_native_ios_target=ios-simulator
5634                         mono_native_text="iOS Simulator"
5635                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5636                 else
5637                         mono_native_ios_target=iphoneos
5638                         mono_native_text="iOS Device"
5639                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5640                 fi
5641                 mono_native_unified_version="10.0"
5642                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5643         ], [
5644                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5645                         if test x$mono_native_ios_sim = xyes; then
5646                                 mono_native_ios_target=tvos-simulator
5647                                 mono_native_text="AppleTV Simulator"
5648                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5649                         else
5650                                 mono_native_ios_target=tvos
5651                                 mono_native_text="AppleTV Device"
5652                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5653                         fi
5654                         mono_native_unified_version="10.0"
5655                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5656                 ], [
5657                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5658                                 if test x$mono_native_ios_sim = xyes; then
5659                                         mono_native_ios_target=watchos-simulator
5660                                         mono_native_text="Apple Watch Simulator"
5661                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5662                                 else
5663                                         mono_native_ios_target=watchos
5664                                         mono_native_text="Apple Watch Device"
5665                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5666                                 fi
5667                                 mono_native_unified_version="5.0"
5668                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5669                         ], [
5670                                 AC_MSG_ERROR([Unknown iOS Target])
5671                         ])
5672                 ])
5673         ])
5675         AC_MSG_CHECKING([Mono.Native support])
5676         AC_MSG_RESULT([$mono_native_ios_target])
5678         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5680         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5681         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5683         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5685         mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5686         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5687         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5688         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5689         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5690         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5691         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5693         if test x$mono_native_compat = xyes; then
5694                 mono_native_text="$mono_native_text (compat+unified)"
5695                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5696                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5697                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5698                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5699         fi
5701         mono_native=yes
5702         MONO_NATIVE_PLATFORM=ios
5703 elif test x$host_linux = xyes; then
5704         mono_native_text="Linux"
5705         MONO_NATIVE_CC=$CC
5706         MONO_NATIVE_CXX=$CXX
5707         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5708         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5709         MONO_NATIVE_CFLAGS=$CFLAGS
5710         MONO_NATIVE_LDFLAGS=$LDFLAGS
5712         mono_native=yes
5713         mono_native_compat=no
5714         MONO_NATIVE_PLATFORM=linux
5715         AC_MSG_CHECKING([Mono.Native support])
5716         AC_MSG_RESULT(linux)
5718         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5719 else
5720         mono_native=no
5721         mono_native_text="no"
5722         AC_MSG_CHECKING([Mono.Native support])
5723         AC_MSG_RESULT(no)
5726 if test x$mono_native_compat = xyes; then
5727         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5728 else
5729         MONO_NATIVE_LIBRARY_NAME=libmono-native
5732 AC_SUBST(MONO_NATIVE_PLATFORM)
5733 AC_SUBST(MONO_NATIVE_CC)
5734 AC_SUBST(MONO_NATIVE_CXX)
5735 AC_SUBST(MONO_NATIVE_CPPFLAGS)
5736 AC_SUBST(MONO_NATIVE_CXXFLAGS)
5737 AC_SUBST(MONO_NATIVE_CFLAGS)
5738 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
5739 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
5740 AC_SUBST(MONO_NATIVE_LDFLAGS)
5741 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
5742 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
5743 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
5745 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
5746 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
5747 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
5748 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
5749 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
5751 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
5752 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
5753 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
5754 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
5755 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
5757 # Update all submodules recursively to ensure everything is checked out
5758 (cd $srcdir && scripts/update_submodules.sh)
5760 AC_OUTPUT([
5761 Makefile
5762 mono-uninstalled.pc
5763 acceptance-tests/Makefile
5764 llvm/Makefile
5765 scripts/mono-find-provides
5766 scripts/mono-find-requires
5767 mk/Makefile
5768 mono/Makefile
5769 mono/btls/Makefile
5770 mono/native/Makefile
5771 mono/utils/Makefile
5772 mono/utils/jemalloc/Makefile
5773 mono/metadata/Makefile
5774 mono/dis/Makefile
5775 mono/cil/Makefile
5776 mono/arch/Makefile
5777 mono/arch/x86/Makefile
5778 mono/arch/amd64/Makefile
5779 mono/arch/ppc/Makefile
5780 mono/arch/sparc/Makefile
5781 mono/arch/s390x/Makefile
5782 mono/arch/arm/Makefile
5783 mono/arch/arm64/Makefile
5784 mono/arch/mips/Makefile
5785 mono/sgen/Makefile
5786 mono/native/platform-type.c
5787 mono/native/platform-type-compat.c
5788 mono/native/platform-type-unified.c
5789 mono/tests/Makefile
5790 mono/tests/assembly-load-reference/Makefile
5791 mono/tests/tests-config
5792 mono/tests/gc-descriptors/Makefile
5793 mono/tests/testing_gac/Makefile
5794 mono/unit-tests/Makefile
5795 mono/benchmark/Makefile
5796 mono/mini/Makefile
5797 mono/profiler/Makefile
5798 mono/eglib/Makefile
5799 mono/eglib/eglib-config.h
5800 mono/eglib/test/Makefile
5801 m4/Makefile
5802 ikvm-native/Makefile
5803 scripts/Makefile
5804 man/Makefile
5805 docs/Makefile
5806 data/Makefile
5807 data/net_2_0/Makefile
5808 data/net_4_0/Makefile
5809 data/net_4_5/Makefile
5810 data/net_2_0/Browsers/Makefile
5811 data/net_4_0/Browsers/Makefile
5812 data/net_4_5/Browsers/Makefile
5813 data/mint.pc
5814 data/mono-2.pc
5815 data/monosgen-2.pc
5816 data/mono.pc
5817 data/mono-cairo.pc
5818 data/mono-nunit.pc
5819 data/mono-options.pc
5820 data/mono-lineeditor.pc
5821 data/monodoc.pc
5822 data/dotnet.pc
5823 data/dotnet35.pc
5824 data/wcf.pc
5825 data/cecil.pc
5826 data/system.web.extensions_1.0.pc
5827 data/system.web.extensions.design_1.0.pc
5828 data/system.web.mvc.pc
5829 data/system.web.mvc2.pc
5830 data/system.web.mvc3.pc
5831 data/aspnetwebstack.pc
5832 data/reactive.pc
5833 samples/Makefile
5834 support/Makefile
5835 data/config
5836 tools/Makefile
5837 tools/locale-builder/Makefile
5838 tools/sgen/Makefile
5839 tools/monograph/Makefile
5840 tools/pedump/Makefile
5841 runtime/Makefile
5842 msvc/Makefile
5843 po/Makefile
5846 if test x$host_win32 = xyes; then
5847    # Get rid of 'cyg' prefixes in library names
5848    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5849    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5850    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5851    # executable doesn't work...
5852    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5855 if test x$host_darwin = xyes; then
5856    # This doesn't seem to be required and it slows down parallel builds
5857    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5861   case $prefix in
5862   NONE) prefix=$ac_default_prefix ;;
5863   esac
5864   case $exec_prefix in
5865   NONE) exec_prefix='${prefix}' ;;
5866   esac
5868   #
5869   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5870   # any existing config.make.  This allows people to share the same source tree
5871   # with different build directories, one native and one cross
5872   #
5873   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5875     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5877     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5878     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5879     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5880     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5881     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5882     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5883     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5884     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5885     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5887     case $INSTALL in
5888     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5889     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5890     esac
5892     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5894     export VERSION
5895     [myver=$($AWK 'BEGIN {
5896       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5897       if(length(vsplit [1]) > 4) {
5898         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5899       }
5900       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5901     }')]
5903     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5904     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5906     if test x$host_darwin = xyes; then
5907       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
5908       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
5909       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5910     elif test x$host_win32 = xyes; then
5911       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5912       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5913       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5914     elif test x$host_linux = xyes; then
5915       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5916       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5917       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5918     else
5919       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
5920       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5921       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5922     fi
5924     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5925       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5926     fi
5928         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5929            enable_system_aot=yes
5930         fi
5932     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5933       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5934     fi
5936     if test x$DISABLE_MCS_DOCS = xyes; then
5937       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5938     fi
5940     if test x$has_extension_module != xno; then
5941         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5942     fi
5943     
5944     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5945     
5946     if test "x$test_bcl_opt" = "xyes"; then    
5947       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5948     fi
5950     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5952     if test $csc_compiler = mcs; then
5953       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5954     fi
5956     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5957       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5958       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5959       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5960     fi
5962     if test "x$AOT_MODE" != "x" ; then
5963       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5964     fi
5966     if test "x$enable_btls" = "xyes"; then
5967       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5968     fi
5970     if test "x$mono_native" = "xyes"; then
5971       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
5972     else
5973       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
5974     fi
5976     if test x$mono_native_compat = xyes; then
5977       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
5978     else
5979       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
5980     fi
5982     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
5983     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
5985   fi
5989 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5991 btls_platform_string=
5992 if test x$enable_btls = xyes; then
5993         if test x$btls_android = xyes; then
5994                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5995         else
5996                 btls_platform_string=" ($BTLS_PLATFORM)"
5997         fi
6000 thread_suspend_msg=
6001 if test x$buildsgen = xyes; then
6002         if test x$enable_cooperative_suspend != xno; then
6003                 thread_suspend_msg="Suspend:       Cooperative"
6004         elif test x$enable_hybrid_suspend != xno; then
6005                 thread_suspend_msg="Suspend:       Hybrid"
6006         else
6007                 thread_suspend_msg="Suspend:       Preemptive"
6008         fi
6010         
6011 echo "
6012         mcs source:    $mcsdir
6013         C# Compiler:   $csc_compiler
6015    Engine:
6016         Host:          $host
6017         Target:        $target
6018         GC:            $gc_msg 
6019         $thread_suspend_msg
6020         TLS:           $with_tls
6021         SIGALTSTACK:   $with_sigaltstack
6022         Engine:        $jit_status
6023         BigArrays:     $enable_big_arrays
6024         DTrace:        $enable_dtrace
6025         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
6026         Spectre:       $spectre_mitigation_status
6027         Mono.Native:   $mono_native_text
6029    Libraries:
6030         .NET 4.x:        $with_profile4_x
6031         Xamarin.Android: $with_monodroid
6032         Xamarin.iOS:     $with_monotouch
6033         Xamarin.WatchOS: $with_monotouch_watch
6034         Xamarin.TVOS:    $with_monotouch_tv
6035         Xamarin.Mac:     $with_xammac
6036         Windows AOT:     $with_winaot
6037         Orbis:           $with_orbis
6038         Unreal:          $with_unreal
6039         WebAssembly:     $with_wasm
6040         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6041         JNI support:     $jdk_headers_found
6042         libgdiplus:      $libgdiplus_msg
6043         zlib:            $zlib_msg
6044         BTLS:            $enable_btls$btls_platform_string
6045         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6046         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6047         $disabled
6049 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6050    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)