[csproj] Update project files
[mono-project.git] / configure.ac
blobfa7a2d939ad2d06649ec2e51ea85bc18a2f78cf9
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=109afe51-a298-4c14-a076-cfc83a5e755a
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_full_interp,  [  --with-testing_aot_full_interp=yes,no    If you want to build the testing_aot_full_interp assemblies (defaults to no)],   [], [with_testing_aot_full_interp=default])
1066 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])
1067 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])
1068 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1069 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1070 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1071 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1074 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal,fullaotinterp  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1075 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])
1076 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])
1077 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])
1080 dnl Spectre compiler mitigation flag checks
1082 if test "x$with_spectre_mitigation" = "xyes"; then
1083    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1084    SPECTRE_CFLAGS=
1085    SPECTRE_INDIRECT_BRANCH_KIND=
1086    case "x$with_spectre_indirect_branch_choice" in
1087        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1088        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1089        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1090        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1091        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1092    esac
1094    SPECTRE_FUNCTION_RETURN_KIND=""
1095    case "x$with_spectre_function_return_choice" in
1096        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1097        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1098        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1099        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1100        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1101    esac
1103    AX_CHECK_COMPILE_FLAG(
1104         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1105         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1106    )
1108    AX_CHECK_COMPILE_FLAG(
1109         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1110         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1111    )
1113    if test "x$SPECTRE_CFLAGS" != "x" ; then
1114         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1115         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1116         spectre_mitigation_status="mitigation enabled"
1117    fi
1118 else
1119         spectre_mitigation_status="no mitigation"
1123 dnl Profile defaults
1125 TEST_PROFILE=default
1126 enable_llvm_default=no
1128 with_profile4_x_default=no
1129 with_monodroid_default=no
1130 with_monotouch_default=no
1131 with_monotouch_watch_default=no
1132 with_monotouch_tv_default=no
1133 with_xammac_default=no
1134 with_testing_aot_full_interp_default=no
1135 with_testing_aot_hybrid_default=no
1136 with_testing_aot_full_default=no
1137 with_winaot_default=no
1138 with_orbis_default=no
1139 with_unreal_default=no
1140 with_wasm_default=no
1142 with_bitcode_default=no
1143 enable_cooperative_suspend_default=no
1144 enable_hybrid_suspend_default=no
1146 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1148 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1150 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1151    DISABLE_MCS_DOCS_default=yes
1152 elif test x$with_runtime_preset = xnet_4_x; then
1153    with_profile4_x_default=yes
1154 elif test x$with_runtime_preset = xall; then
1155    with_profile4_x_default=yes
1156    with_monodroid_default=yes
1157    with_monotouch_default=yes
1158    with_monotouch_watch_default=yes
1159    with_monotouch_tv_default=yes
1160    with_xammac_default=yes
1161    with_winaot_default=yes
1162    with_orbis_default=yes
1163    with_unreal_default=yes
1164    with_wasm_default=yes
1165    with_testing_aot_full_interp_default=yes
1166    with_testing_aot_hybrid_default=yes
1167    with_testing_aot_full_default=yes
1168 elif test x$with_runtime_preset = xbitcode; then
1169    DISABLE_MCS_DOCS_default=yes
1170    with_testing_aot_full_default=yes
1171    with_bitcode_default=yes
1172    enable_cooperative_suspend_default=yes
1173    TEST_PROFILE=testing_aot_full
1174    enable_llvm_default=yes
1176    mono_feature_disable_com='yes'
1177    mono_feature_disable_remoting='yes'
1178    mono_feature_disable_reflection_emit_save='yes'
1179    mono_feature_disable_reflection_emit='yes'
1180    mono_feature_disable_appdomains='yes'
1182    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1183    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1184    AOT_MODE="llvmonly"
1185 elif test x$with_runtime_preset = xfullaot; then
1186    DISABLE_MCS_DOCS_default=yes
1187    with_testing_aot_full_default=yes
1188    TEST_PROFILE=testing_aot_full
1190    mono_feature_disable_com='yes'
1191    mono_feature_disable_remoting='yes'
1192    mono_feature_disable_reflection_emit_save='yes'
1193    mono_feature_disable_reflection_emit='yes'
1194    mono_feature_disable_appdomains='yes'
1196    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1197    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1198    AOT_MODE="full"
1199 elif test x$with_runtime_preset = xfullaot_llvm; then
1200    DISABLE_MCS_DOCS_default=yes
1201    with_testing_aot_full_default=yes
1202    TEST_PROFILE=testing_aot_full
1204    mono_feature_disable_com='yes'
1205    mono_feature_disable_remoting='yes'
1206    mono_feature_disable_reflection_emit_save='yes'
1207    mono_feature_disable_reflection_emit='yes'
1208    mono_feature_disable_appdomains='yes'
1210    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1211    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1212    AOT_MODE="full"
1213 elif test x$with_runtime_preset = xhybridaot; then
1214    DISABLE_MCS_DOCS_default=yes
1215    with_testing_aot_hybrid_default=yes
1216    TEST_PROFILE=testing_aot_hybrid 
1218    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1219    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1220 elif test x$with_runtime_preset = xhybridaot_llvm; then
1221    DISABLE_MCS_DOCS_default=yes
1222    with_testing_aot_hybrid_default=yes
1223    TEST_PROFILE=testing_aot_hybrid
1225    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1226    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1227 elif test x$with_runtime_preset = xfullaotinterp; then
1228    with_testing_aot_full_interp_default=yes
1229    TEST_PROFILE=testing_aot_full_interp
1231    # mscorlib.dll aot compilation crashes
1232    mono_feature_disable_com='yes'
1234    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1235    AOT_RUN_FLAGS="--full-aot-interp"
1236 elif test x$with_runtime_preset = xaot; then
1237    with_profile4_x_default=yes
1239    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1240    AOT_RUN_FLAGS=""
1242    DISABLE_MCS_DOCS_default=yes
1243 elif test x$with_runtime_preset = xaot_llvm; then
1244    with_profile4_x_default=yes
1246    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1247    AOT_RUN_FLAGS=""
1249    DISABLE_MCS_DOCS_default=yes
1250 elif test x$with_runtime_preset = xwinaot; then
1251    DISABLE_MCS_DOCS_default=yes
1252    with_winaot_default=yes
1253    TEST_PROFILE=winaot
1255    mono_feature_disable_com='yes'
1256    mono_feature_disable_remoting='yes'
1257    mono_feature_disable_reflection_emit_save='yes'
1258    mono_feature_disable_reflection_emit='yes'
1259    mono_feature_disable_appdomains='yes'
1261    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1262    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1263    AOT_MODE="llvmonly"
1264 elif test x$with_runtime_preset = xorbis; then
1265    DISABLE_MCS_DOCS_default=yes
1266    with_orbis_default=yes
1267    TEST_PROFILE=orbis
1269    mono_feature_disable_com='yes'
1270    mono_feature_disable_remoting='yes'
1271    mono_feature_disable_reflection_emit_save='yes'
1272    mono_feature_disable_reflection_emit='yes'
1273    mono_feature_disable_appdomains='yes'
1275    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1276    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1277    AOT_MODE="full"
1278 elif test x$with_runtime_preset = xunreal; then
1279    DISABLE_MCS_DOCS_default=yes
1280    with_unreal_default=yes
1281    TEST_PROFILE=unreal
1283    mono_feature_disable_com='yes'
1284    mono_feature_disable_remoting='yes'
1285    mono_feature_disable_appdomains='no'
1287    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1288    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1289 elif test x$with_runtime_preset = xwasm; then
1290    DISABLE_MCS_DOCS_default=yes
1291    with_wasm_default=yes
1292    TEST_PROFILE=wasm
1294    mono_feature_disable_com='yes'
1295    mono_feature_disable_remoting='yes'
1296    mono_feature_disable_reflection_emit_save='yes'
1297    mono_feature_disable_reflection_emit='yes'
1298    mono_feature_disable_appdomains='yes'
1300    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1301    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1302 else
1303    with_profile4_x_default=yes
1306 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1307    AC_SUBST(AOT_BUILD_FLAGS)
1308    AC_SUBST(AOT_RUN_FLAGS)
1309    # For llvmonlycheck + fullaotcheck
1310    AC_SUBST(INVARIANT_AOT_OPTIONS)
1313 AC_SUBST(TEST_PROFILE)
1315 if test "x$with_profile4_x" = "xdefault"; then
1316    with_profile4_x=$with_profile4_x_default
1318 if test "x$with_monodroid" = "xdefault"; then
1319    with_monodroid=$with_monodroid_default
1321 if test "x$with_monotouch" = "xdefault"; then
1322    with_monotouch=$with_monotouch_default
1324 if test "x$with_monotouch_watch" = "xdefault"; then
1325    with_monotouch_watch=$with_monotouch_watch_default
1327 if test "x$with_monotouch_tv" = "xdefault"; then
1328    with_monotouch_tv=$with_monotouch_tv_default
1330 if test "x$with_bitcode" = "xdefault"; then
1331    with_bitcode=$with_bitcode_default
1333 if test "x$with_xammac" = "xdefault"; then
1334    with_xammac=$with_xammac_default
1336 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1337    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1339 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1340    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1342 if test "x$with_testing_aot_full" = "xdefault"; then
1343    with_testing_aot_full=$with_testing_aot_full_default
1345 if test "x$with_winaot" = "xdefault"; then
1346    with_winaot=$with_winaot_default
1348 if test "x$with_orbis" = "xdefault"; then
1349    with_orbis=$with_orbis_default
1351 if test "x$with_unreal" = "xdefault"; then
1352    with_unreal=$with_unreal_default
1354 if test "x$with_wasm" = "xdefault"; then
1355    with_wasm=$with_wasm_default
1359 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1360 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1361 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1362 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1363 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1364 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1365 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1366 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1367 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1368 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1369 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1370 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1371 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1372 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1373 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"])
1374 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1375 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1377 default_profile=net_4_x
1378 if test -z "$INSTALL_MONODROID_TRUE"; then :
1379    default_profile=monodroid
1381 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1382    default_profile=monotouch
1384 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1385    default_profile=xammac
1387 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1388    default_profile=testing_aot_full_interp
1390 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1391    default_profile=testing_aot_hybrid
1393 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1394    default_profile=testing_aot_full
1396 if test -z "$INSTALL_WINAOT_TRUE"; then :
1397    default_profile=winaot
1399 if test -z "$INSTALL_ORBIS_TRUE"; then :
1400    default_profile=orbis
1402 if test -z "$INSTALL_UNREAL_TRUE"; then :
1403    default_profile=unreal
1405 if test -z "$INSTALL_WASM_TRUE"; then :
1406    default_profile=wasm
1408 if test -z "$INSTALL_4_x_TRUE"; then :
1409    default_profile=net_4_x
1411 DEFAULT_PROFILE=$default_profile
1412 AC_SUBST(DEFAULT_PROFILE)
1415 # End build profile configuration
1418 if test x$USE_NLS = xprofile_default; then
1420         AC_MSG_CHECKING([NLS used])
1422         # We make the default value for USE_NLS
1423         # "no" on OSX because it isn't available on most
1424         # default OSX installs. The most common configurations will
1425         # all disable it, so this saves us typing.
1426         if test x$host_darwin = xyes; then
1427                 USE_NLS=no;
1428         else
1429                 USE_NLS=yes;
1430         fi
1432         AC_SUBST([USE_NLS])
1433         AC_MSG_RESULT([$USE_NLS])
1436 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1437      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1438      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1439          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1441         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1442                 eval "mono_feature_disable_$feature='yes'"
1443         done
1444         DISABLED_FEATURES=$enable_minimal
1445         disabled="Disabled:      $enable_minimal"
1446 ],[])
1448 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1450 if test "x$mono_feature_disable_aot" = "xyes"; then
1451         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1452         enable_system_aot=no
1453         AC_MSG_NOTICE([Disabled AOT compiler])
1456 if test "x$mono_feature_disable_profiler" = "xyes"; then
1457         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1458         AC_MSG_NOTICE([Disabled support for the profiler])
1460 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1462 if test "x$mono_feature_disable_decimal" = "xyes"; then
1463         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1464         AC_MSG_NOTICE([Disabled support for decimal])
1467 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1468         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1469         AC_MSG_NOTICE([Disabled support for P/Invoke])
1472 if test "x$mono_feature_disable_debug" = "xyes"; then
1473         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1474         AC_MSG_NOTICE([Disabled support for runtime debugging])
1477 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1478         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1479         mono_feature_disable_reflection_emit_save=yes
1480         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1483 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1484         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1485         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1488 if test "x$mono_feature_disable_large_code" = "xyes"; then
1489         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1490         AC_MSG_NOTICE([Disabled support for large assemblies])
1493 if test "x$mono_feature_disable_logging" = "xyes"; then
1494         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1495         AC_MSG_NOTICE([Disabled support for logging])
1498 if test "x$mono_feature_disable_com" = "xyes"; then
1499         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1500         AC_MSG_NOTICE([Disabled COM support])
1503 if test "x$mono_feature_disable_ssa" = "xyes"; then
1504         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1505         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1508 if test "x$mono_feature_disable_generics" = "xyes"; then
1509         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1510         AC_MSG_NOTICE([Disabled Generics Support])
1513 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1514         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1515         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1518 if test "x$mono_feature_disable_portability" = "xyes"; then
1519         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1520         AC_MSG_NOTICE([Disabled IO Portability layer])
1523 if test "x$mono_feature_disable_attach" = "xyes"; then
1524         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1525         AC_MSG_NOTICE([Disabled agent attach])
1528 if test "x$mono_feature_disable_verifier" = "xyes"; then
1529         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1530         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1533 if test "x$mono_feature_disable_jit" = "xyes"; then
1534         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1535         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1538 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1540 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1541         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1542         AC_MSG_NOTICE([Disabled the interpreter])
1545 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1547 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1548         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1551 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1553 if test "x$mono_feature_disable_simd" = "xyes"; then
1554         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1555         AC_MSG_NOTICE([Disabled SIMD support])
1558 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1559         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1560         AC_MSG_NOTICE([Disabled Soft Debugger.])
1563 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1565 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1566         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1567         AC_MSG_NOTICE([Disabled Performance Counters.])
1569 if test "x$mono_feature_disable_normalization" = "xyes"; then
1570         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1571         AC_MSG_NOTICE([Disabled String normalization support.])
1574 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1575 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1576         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1577         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1580 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1581         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1582         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1585 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1586         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1587         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1590 if test "x$mono_feature_disable_remoting" = "xyes"; then
1591         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1592         AC_MSG_NOTICE([Disabled remoting])
1595 if test "x$mono_feature_disable_security" = "xyes"; then
1596         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1597         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1600 if test "x$mono_feature_disable_lldb" = "xyes"; then
1601         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1602         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1605 if test "x$mono_feature_disable_mdb" = "xyes"; then
1606         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1607         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1610 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1611         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1612         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1616 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1617         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1618         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1621 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1622         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1623         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1626 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1627         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1628         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1631 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1632 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1634 has_extension_module=no
1635 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1637         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1638                 if test x$extension = xdefault ; then
1639                         has_extension_module=yes;
1640                 fi
1641         done
1642         if test x$enable_extension_module = xyes; then
1643                 has_extension_module=yes;
1644         fi
1645 ], [])
1647 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1649 if test x$has_extension_module != xno ; then
1650         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1651         AC_MSG_NOTICE([Enabling mono extension module.])
1654 # Deprecated
1655 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1657 AC_MSG_CHECKING(for visibility __attribute__)
1658 AC_COMPILE_IFELSE([
1659         AC_LANG_SOURCE([[
1660                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1661                 int main () { doit (); return 0; }
1662         ]])
1663 ], [
1664    have_visibility_hidden=yes
1665    AC_MSG_RESULT(yes)
1666 ], [
1667    have_visibility_hidden=no
1668    AC_MSG_RESULT(no)
1672 dnl Boehm GC configuration
1675 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1677 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1678 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1680 if test "x$support_boehm" = "xyes"; then
1682         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1683         if test x$enable_parallel_mark = xyes; then
1684                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1685         fi
1687         gc_msg=""
1688         LIBGC_CPPFLAGS=
1689         LIBGC_LIBS=
1690         LIBGC_STATIC_LIBS=
1691         libgc_dir=
1692         case "x$libgc" in
1693                 xincluded)
1694                         if test "x$support_boehm" = "xyes"; then
1695                                 libgc_dir=libgc
1696                         fi
1698                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1699                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1700                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1702                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1704                         if test x$target_win32 = xyes; then
1705                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1706                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1707                         fi
1709                         gc_msg="Included Boehm GC with typed GC"
1710                         if test x$enable_parallel_mark = xyes; then
1711                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1712                                 gc_msg="$gc_msg and parallel mark"
1713                         else
1714                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1715                         fi
1716                         ;;
1718                 xboehm|xbohem|xyes)
1719                         AC_MSG_WARN("External Boehm is no longer supported")
1720                         ;;
1722                 xsgen)
1723                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1724                         ;;
1726                 xnone)
1727                         AC_MSG_WARN("Compiling mono without GC.")
1728                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1729                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1730                         gc_msg="none"
1731                         ;;
1732                 *)
1733                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1734                         ;;
1735         esac
1737         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])
1738         if test "x$large_heap" = "xyes"; then
1739            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1740         fi
1742         AC_SUBST(LIBGC_CPPFLAGS)
1743         AC_SUBST(LIBGC_LIBS)
1744         AC_SUBST(LIBGC_STATIC_LIBS)
1745         AC_SUBST(libgc_dir)
1746         AC_SUBST(BOEHM_DEFINES)
1749 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1752 dnl End of Boehm GC Configuration
1755 dnl *************************************
1756 dnl *** Checks for zero length arrays ***
1757 dnl *************************************
1758 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1759 AC_TRY_COMPILE([
1760         struct s {
1761                 int  length;
1762                 char data [0];
1763         };
1764 ], [], [
1765         AC_MSG_RESULT(yes)
1766         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1767 ], [
1768         AC_MSG_RESULT(no)
1769         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1772 dnl ***********************************
1773 dnl *** Checks for signals
1774 dnl ***********************************
1775 AC_CHECK_HEADERS(signal.h)
1776 AC_CHECK_FUNCS(sigaction)
1777 AC_CHECK_FUNCS(kill)
1778 AC_CHECK_FUNCS(signal)
1780 # signal() is declared inline in Android headers
1781 # so we need to workaround it by overriding the check.
1782 if test x$platform_android = xyes; then
1783         AC_DEFINE(HAVE_SIGNAL,1)
1786 dnl ***********************************
1787 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1788 dnl ***********************************
1789 enable_gss=no;
1790 AC_MSG_CHECKING(for GSS/GSS.h)
1791 AC_TRY_COMPILE([
1792     #include <GSS/GSS.h>
1793 ], [
1795     AC_MSG_RESULT(yes)
1796     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1797     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1798     enable_gss=yes
1799 ], [
1800     AC_MSG_RESULT(no)
1803 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1804 AC_TRY_COMPILE([
1805     #include <gssapi/gssapi_ext.h>
1806 ], [
1808     AC_MSG_RESULT(yes)
1809     enable_gss=yes
1810 ], [
1811     AC_MSG_RESULT(no)
1814 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1815 AC_TRY_COMPILE([
1816     #include <gssapi/gssapi_ext.h>
1817     #include <gssapi/gssapi_krb5.h>
1818     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1819 ], [
1821     AC_MSG_RESULT(yes)
1822     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1823 ], [
1824     AC_MSG_RESULT(no)
1827 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1829 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1830 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1832 if test x$host_win32 = xno; then
1833         dnl *************************************
1834         dnl *** Checks for time capabilities ***
1835         dnl *************************************
1837         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1838         AC_TRY_COMPILE([#include <time.h>], [
1839                 const int foo = CLOCK_MONOTONIC;
1840         ],[
1841                 AC_MSG_RESULT(yes)
1842                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1843         ], [
1844                 AC_MSG_RESULT(no)
1845         ])
1847         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1848         AC_TRY_COMPILE([#include <time.h>], [
1849                 const int foo = CLOCK_MONOTONIC_COARSE;
1850         ],[
1851                 AC_MSG_RESULT(yes)
1852                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1853         ], [
1854                 AC_MSG_RESULT(no)
1855         ])
1857         AC_MSG_CHECKING(for CLOCK_REALTIME)
1858         AC_TRY_COMPILE([#include <time.h>], [
1859                 const int foo = CLOCK_REALTIME;
1860         ],[
1861                 AC_MSG_RESULT(yes)
1862                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1863         ], [
1864                 AC_MSG_RESULT(no)
1865         ])
1867         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1868         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1869         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1870         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1871         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1872         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1874         dnl hires monotonic clock support
1875         AC_SEARCH_LIBS(clock_gettime, rt)
1876         AC_CHECK_FUNCS(clock_nanosleep)
1878         dnl dynamic loader support
1879         AC_CHECK_FUNC(dlopen, DL_LIB="",
1880                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1881         )
1882         if test x$dl_support = xno; then
1883                 AC_MSG_WARN([No dynamic loading support available])
1884         else
1885                 LIBS="$LIBS $DL_LIB"
1886                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1887                 dnl from glib's configure.ac
1888                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1889                         mono_cv_uscore,[
1890                         AC_TRY_RUN([#include <dlfcn.h>
1891                         int mono_underscore_test (void) { return 42; }
1892                         int main() {
1893                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1894                           handle = dlopen ((void*)0, 0);
1895                           if (handle) {
1896                             f1 = dlsym (handle, "mono_underscore_test");
1897                             f2 = dlsym (handle, "_mono_underscore_test");
1898                           } return (!f2 || f1);
1899                         }],
1900                                 [mono_cv_uscore=yes],
1901                                 [mono_cv_uscore=no],
1902                         [])
1903                 ])
1904                 if test "x$mono_cv_uscore" = "xyes"; then
1905                         MONO_DL_NEED_USCORE=1
1906                 else
1907                         MONO_DL_NEED_USCORE=0
1908                 fi
1909                 AC_SUBST(MONO_DL_NEED_USCORE)
1910                 AC_CHECK_FUNC(dlerror)
1911         fi
1913         dnl ******************************************************************
1914         dnl *** Checks for the IKVM JNI interface library                  ***
1915         dnl ******************************************************************
1916         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])
1918         ikvm_native_dir=
1919         if test x$with_ikvm_native = xyes; then
1920                 ikvm_native_dir=ikvm-native
1921                 jdk_headers_found="IKVM Native"
1922         fi
1924         AC_SUBST(ikvm_native_dir)
1926         AC_CHECK_HEADERS(execinfo.h)
1928         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1930         AC_CHECK_FUNCS(getgrgid_r)
1931         AC_CHECK_FUNCS(getgrnam_r)
1932         AC_CHECK_FUNCS(getresuid)
1933         AC_CHECK_FUNCS(setresuid)
1934         AC_CHECK_FUNCS(kqueue)
1935         AC_CHECK_FUNCS(backtrace_symbols)
1936         AC_CHECK_FUNCS(mkstemp)
1937         AC_CHECK_FUNCS(mmap)
1938         AC_CHECK_FUNCS(madvise)
1939         AC_CHECK_FUNCS(getrusage)
1940         AC_CHECK_FUNCS(getpriority)
1941         AC_CHECK_FUNCS(setpriority)
1942         AC_CHECK_FUNCS(dl_iterate_phdr)
1943         AC_CHECK_FUNCS(dladdr)
1944         AC_CHECK_FUNCS(sysconf)
1945         AC_CHECK_FUNCS(getrlimit)
1946         AC_CHECK_FUNCS(prctl)
1947         AC_CHECK_FUNCS(arc4random)
1948         AC_CHECK_FUNCS(nl_langinfo)
1950         AC_CHECK_FUNCS(sched_getaffinity)
1951         AC_CHECK_FUNCS(sched_setaffinity)
1952         AC_CHECK_FUNCS(sched_getcpu)
1954         if test x$platform_android != xyes; then
1955                 AC_CHECK_FUNCS(getpwnam_r)
1956                 AC_CHECK_FUNCS(getpwuid_r)
1957         fi
1959         AC_FUNC_STRERROR_R()
1961         dnl ****************************************************************
1962         dnl *** Check for sched_setaffinity from glibc versions before   ***
1963         dnl *** 2.3.4. The older versions of the function only take 2    ***
1964         dnl *** parameters, not 3.                                       ***
1965         dnl ***                                                          ***
1966         dnl *** Because the interface change was not made in a minor     ***
1967         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1968         dnl *** won't always indicate the interface sched_affinity has.  ***
1969         dnl ****************************************************************
1970         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1971         AC_TRY_COMPILE([#include <sched.h>], [
1972             int mask = 1; 
1973             sched_setaffinity(0, &mask);
1974         ], [
1975                 # Yes, we have it...
1976                 AC_MSG_RESULT(yes)
1977                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1978         ], [
1979                 # We have the new, three-parameter version
1980                 AC_MSG_RESULT(no)
1981         ])
1982         AC_TRY_COMPILE([#include <sched.h>], [
1983              CPU_COUNT((void *) 0);
1984         ], [
1985                 AC_MSG_RESULT(yes)
1986                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1987         ], [
1988                 # We have the new, three-parameter version
1989                 AC_MSG_RESULT(no)
1990         ])
1992         dnl ******************************************************************
1993         dnl *** Check for large file support                               ***
1994         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1995         dnl ******************************************************************
1996         
1997         # Check that off_t can represent 2**63 - 1 correctly, working around
1998         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1999         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2000         large_offt=no
2001         AC_DEFUN([LARGE_FILES], [
2002                 large_CPPFLAGS=$CPPFLAGS
2003                 CPPFLAGS="$CPPFLAGS $1"
2004                 AC_TRY_COMPILE([
2005                         #include <sys/types.h>
2006                         #include <limits.h>
2007                 ], [
2008                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2009                         #define COMPILE_TIME_ASSERT(pred) \
2010                                 switch(0){case 0:case pred:;}
2011                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2012                 ], [
2013                         AC_MSG_RESULT(ok)
2014                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2015                         large_CPPFLAGS="$large_CPPFLAGS $1"
2016                         large_offt=yes
2017                 ], [
2018                         AC_MSG_RESULT(no)
2019                 ])
2020                 CPPFLAGS=$large_CPPFLAGS
2021         ])
2023         AC_MSG_CHECKING(if off_t is 64 bits wide)
2024         LARGE_FILES("")
2025         if test $large_offt = no; then
2026                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2027                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2028         fi
2029         if test $large_offt = no; then
2030                 AC_MSG_WARN([No 64 bit file size support available])
2031         fi
2032         
2033         dnl *****************************
2034         dnl *** Checks for libsocket  ***
2035         dnl *****************************
2036         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2038         case "$host" in
2039                 *-*-*freebsd*)
2040                         dnl *****************************
2041                         dnl *** Checks for libinotify ***
2042                         dnl *****************************
2043                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2044         esac
2046         dnl *******************************
2047         dnl *** Checks for MSG_NOSIGNAL ***
2048         dnl *******************************
2049         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2050         AC_TRY_COMPILE([#include <sys/socket.h>], [
2051                 int f = MSG_NOSIGNAL;
2052         ], [
2053                 # Yes, we have it...
2054                 AC_MSG_RESULT(yes)
2055                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2056         ], [
2057                 # We'll have to use signals
2058                 AC_MSG_RESULT(no)
2059         ])
2061         dnl *****************************
2062         dnl *** Checks for IPPROTO_IP ***
2063         dnl *****************************
2064         AC_MSG_CHECKING(for IPPROTO_IP)
2065         AC_TRY_COMPILE([#include <netinet/in.h>], [
2066                 int level = IPPROTO_IP;
2067         ], [
2068                 # Yes, we have it...
2069                 AC_MSG_RESULT(yes)
2070                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2071         ], [
2072                 # We'll have to use getprotobyname
2073                 AC_MSG_RESULT(no)
2074         ])
2076         dnl *******************************
2077         dnl *** Checks for IPPROTO_IPV6 ***
2078         dnl *******************************
2079         AC_MSG_CHECKING(for IPPROTO_IPV6)
2080         AC_TRY_COMPILE([#include <netinet/in.h>], [
2081                 int level = IPPROTO_IPV6;
2082         ], [
2083                 # Yes, we have it...
2084                 AC_MSG_RESULT(yes)
2085                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2086         ], [
2087                 # We'll have to use getprotobyname
2088                 AC_MSG_RESULT(no)
2089         ])
2091         dnl ******************************
2092         dnl *** Checks for IPPROTO_TCP ***
2093         dnl ******************************
2094         AC_MSG_CHECKING(for IPPROTO_TCP)
2095         AC_TRY_COMPILE([#include <netinet/in.h>], [
2096                 int level = IPPROTO_TCP;
2097         ], [
2098                 # Yes, we have it...
2099                 AC_MSG_RESULT(yes)
2100                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2101         ], [
2102                 # We'll have to use getprotobyname
2103                 AC_MSG_RESULT(no)
2104         ])
2106         dnl *****************************
2107         dnl *** Checks for SOL_IP     ***
2108         dnl *****************************
2109         AC_MSG_CHECKING(for SOL_IP)
2110         AC_TRY_COMPILE([#include <netdb.h>], [
2111                 int level = SOL_IP;
2112         ], [
2113                 # Yes, we have it...
2114                 AC_MSG_RESULT(yes)
2115                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2116         ], [
2117                 # We'll have to use getprotobyname
2118                 AC_MSG_RESULT(no)
2119         ])
2121         dnl *****************************
2122         dnl *** Checks for SOL_IPV6     ***
2123         dnl *****************************
2124         AC_MSG_CHECKING(for SOL_IPV6)
2125         AC_TRY_COMPILE([#include <netdb.h>], [
2126                 int level = SOL_IPV6;
2127         ], [
2128                 # Yes, we have it...
2129                 AC_MSG_RESULT(yes)
2130                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2131         ], [
2132                 # We'll have to use getprotobyname
2133                 AC_MSG_RESULT(no)
2134         ])
2136         dnl *****************************
2137         dnl *** Checks for SOL_TCP    ***
2138         dnl *****************************
2139         AC_MSG_CHECKING(for SOL_TCP)
2140         AC_TRY_COMPILE([#include <netdb.h>], [
2141                 int level = SOL_TCP;
2142         ], [
2143                 # Yes, we have it...
2144                 AC_MSG_RESULT(yes)
2145                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2146         ], [
2147                 # We'll have to use getprotobyname
2148                 AC_MSG_RESULT(no)
2149         ])
2151         dnl *****************************
2152         dnl *** Checks for IP_PKTINFO ***
2153         dnl *****************************
2154         AC_MSG_CHECKING(for IP_PKTINFO)
2155         AC_TRY_COMPILE([#include <linux/in.h>], [
2156                 int level = IP_PKTINFO;
2157         ], [
2158                 # Yes, we have it...
2159                 AC_MSG_RESULT(yes)
2160                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2161         ], [
2162                 AC_MSG_RESULT(no)
2163         ])
2165         dnl *****************************
2166         dnl *** Checks for IPV6_PKTINFO ***
2167         dnl *****************************
2168         AC_MSG_CHECKING(for IPV6_PKTINFO)
2169         AC_TRY_COMPILE([#include <netdb.h>], [
2170                 int level = IPV6_PKTINFO;
2171         ], [
2172                 # Yes, we have it...
2173                 AC_MSG_RESULT(yes)
2174                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2175         ], [
2176                 AC_MSG_RESULT(no)
2177         ])
2179         dnl **********************************
2180         dnl *** Checks for IP_DONTFRAG     ***
2181         dnl **********************************
2182         AC_MSG_CHECKING(for IP_DONTFRAG)
2183         AC_TRY_COMPILE([#include <netinet/in.h>], [
2184                 int level = IP_DONTFRAG;
2185         ], [
2186                 # Yes, we have it...
2187                 AC_MSG_RESULT(yes)
2188                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2189         ], [
2190                 AC_MSG_RESULT(no)
2191         ])
2193         dnl **********************************
2194         dnl *** Checks for IP_DONTFRAGMENT ***
2195         dnl **********************************
2196         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2197         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2198                 int level = IP_DONTFRAGMENT;
2199         ], [
2200                 # Yes, we have it...
2201                 AC_MSG_RESULT(yes)
2202                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2203         ], [
2204                 AC_MSG_RESULT(no)
2205         ])
2207         dnl **********************************
2208         dnl *** Checks for IP_MTU_DISCOVER ***
2209         dnl **********************************
2210         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2211         AC_TRY_COMPILE([#include <linux/in.h>], [
2212                 int level = IP_MTU_DISCOVER;
2213         ], [
2214                 # Yes, we have it...
2215                 AC_MSG_RESULT(yes)
2216                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2217         ], [
2218                 AC_MSG_RESULT(no)
2219         ])
2221         dnl **********************************
2222         dnl *** Checks for  IP_PMTUDISC_DO ***
2223         dnl **********************************
2224         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2225         AC_TRY_COMPILE([#include <linux/in.h>], [
2226                 int level = IP_PMTUDISC_DO;
2227         ], [
2228                 # Yes, we have it...
2229                 AC_MSG_RESULT(yes)
2230                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2231         ], [
2232                 AC_MSG_RESULT(no)
2233         ])
2235         dnl *********************************
2236         dnl *** Check for struct ip_mreqn ***
2237         dnl *********************************
2238         AC_MSG_CHECKING(for struct ip_mreqn)
2239         AC_TRY_COMPILE([#include <netinet/in.h>], [
2240                 struct ip_mreqn mreq;
2241                 mreq.imr_address.s_addr = 0;
2242         ], [
2243                 # Yes, we have it...
2244                 AC_MSG_RESULT(yes)
2245                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2246         ], [
2247                 # We'll just have to try and use struct ip_mreq
2248                 AC_MSG_RESULT(no)
2249                 AC_MSG_CHECKING(for struct ip_mreq)
2250                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2251                         struct ip_mreq mreq;
2252                         mreq.imr_interface.s_addr = 0;
2253                 ], [
2254                         # Yes, we have it...
2255                         AC_MSG_RESULT(yes)
2256                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2257                 ], [
2258                         # No multicast support
2259                         AC_MSG_RESULT(no)
2260                 ])
2261         ])
2262         
2263         dnl **********************************
2264         dnl *** Check for getaddrinfo ***
2265         dnl **********************************
2266         AC_MSG_CHECKING(for getaddrinfo)
2267                 AC_TRY_LINK([
2268                 #include <stdio.h>
2269                 #include <netdb.h>
2270         ], [
2271                 getaddrinfo(NULL,NULL,NULL,NULL);
2272         ], [
2273                 # Yes, we have it...
2274                 AC_MSG_RESULT(yes)
2275                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2276         ], [
2277                 AC_MSG_RESULT(no)
2278         ])
2280         dnl **********************************
2281         dnl *** Check for gethostbyname2_r ***
2282         dnl **********************************
2283         AC_MSG_CHECKING(for gethostbyname2_r)
2284                 AC_TRY_LINK([
2285                 #include <stdio.h>
2286                 #include <netdb.h>
2287         ], [
2289                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2290         ], [
2291                 # Yes, we have it...
2292                 AC_MSG_RESULT(yes)
2293                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2294         ], [
2295                 AC_MSG_RESULT(no)
2296         ])
2298         dnl **********************************
2299         dnl *** Check for gethostbyname2 ***
2300         dnl **********************************
2301         AC_MSG_CHECKING(for gethostbyname2)
2302                 AC_TRY_LINK([
2303                 #include <stdio.h>
2304                 #include <netdb.h>
2305         ], [
2306                 gethostbyname2(NULL,0);
2307         ], [
2308                 # Yes, we have it...
2309                 AC_MSG_RESULT(yes)
2310                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2311         ], [
2312                 AC_MSG_RESULT(no)
2313         ])
2315         dnl **********************************
2316         dnl *** Check for gethostbyname ***
2317         dnl **********************************
2318         AC_MSG_CHECKING(for gethostbyname)
2319                 AC_TRY_LINK([
2320                 #include <stdio.h>
2321                 #include <netdb.h>
2322         ], [
2323                 gethostbyname(NULL);
2324         ], [
2325                 # Yes, we have it...
2326                 AC_MSG_RESULT(yes)
2327                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2328         ], [
2329                 AC_MSG_RESULT(no)
2330         ])
2332         dnl **********************************
2333         dnl *** Check for getprotobyname ***
2334         dnl **********************************
2335         AC_MSG_CHECKING(for getprotobyname)
2336                 AC_TRY_LINK([
2337                 #include <stdio.h>
2338                 #include <netdb.h>
2339         ], [
2340                 getprotobyname(NULL);
2341         ], [
2342                 # Yes, we have it...
2343                 AC_MSG_RESULT(yes)
2344                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2345         ], [
2346                 AC_MSG_RESULT(no)
2347         ])
2349         dnl **********************************
2350         dnl *** Check for getprotobyname_r ***
2351         dnl **********************************
2352         AC_MSG_CHECKING(for getprotobyname_r)
2353                 AC_TRY_LINK([
2354                 #include <stdio.h>
2355                 #include <netdb.h>
2356         ], [
2357                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2358         ], [
2359                 # Yes, we have it...
2360                 AC_MSG_RESULT(yes)
2361                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2362         ], [
2363                 AC_MSG_RESULT(no)
2364         ])
2366         dnl **********************************
2367         dnl *** Check for getnameinfo ***
2368         dnl **********************************
2369         AC_MSG_CHECKING(for getnameinfo)
2370                 AC_TRY_LINK([
2371                 #include <stdio.h>
2372                 #include <netdb.h>
2373         ], [
2374                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2375         ], [
2376                 # Yes, we have it...
2377                 AC_MSG_RESULT(yes)
2378                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2379         ], [
2380                 AC_MSG_RESULT(no)
2381         ])
2384         dnl **********************************
2385         dnl *** Check for inet_ntop ***
2386         dnl **********************************
2387         AC_MSG_CHECKING(for inet_ntop)
2388                 AC_TRY_LINK([
2389                 #include <stdio.h>
2390                 #include <arpa/inet.h>
2391         ], [
2392                 inet_ntop (0, NULL, NULL, 0);
2393         ], [
2394                 # Yes, we have it...
2395                 AC_MSG_RESULT(yes)
2396                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2397         ], [
2398                 AC_MSG_RESULT(no)
2399         ])
2401         dnl *****************************
2402         dnl *** Checks for libnsl     ***
2403         dnl *****************************
2404         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2406         AC_CHECK_FUNCS(inet_pton inet_aton)
2408         dnl *****************************
2409         dnl *** Checks for libxnet    ***
2410         dnl *****************************
2411         case "${host}" in
2412                 *solaris* )
2413                         AC_MSG_CHECKING(for Solaris XPG4 support)
2414                         if test -f /usr/lib/libxnet.so; then
2415                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2416                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2417                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2418                                 LIBS="$LIBS -lxnet"
2419                                 AC_MSG_RESULT(yes)
2420                         else
2421                                 AC_MSG_RESULT(no)
2422                         fi
2424                         if test "$GCC" = "yes"; then
2425                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2426                         fi
2427                 ;;
2428         esac
2430         dnl *****************************
2431         dnl *** Checks for libpthread ***
2432         dnl *****************************
2433 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2434 # and libpthread does not exist
2436         case "${host}" in
2437                 *-*-*haiku*)
2438                         dnl Haiku has pthread in libroot (libc equiv)
2439                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2440                 ;;
2441                 *-*-*freebsd*)
2442                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2443                 ;;
2444                 *-*-*openbsd*)
2445                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2446                 ;;
2447                 *)
2448                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2449                 ;;
2450         esac
2451         AC_CHECK_HEADERS(pthread.h)
2452         AC_CHECK_HEADERS(pthread_np.h)
2453         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2454         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2455         AC_CHECK_FUNCS(pthread_kill)
2456         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2457         AC_TRY_COMPILE([ #include <pthread.h>], [
2458                 pthread_mutexattr_t attr;
2459                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2460         ], [
2461                 AC_MSG_RESULT(ok)
2462         ], [
2463                 AC_MSG_RESULT(no)
2464                 AC_ERROR(Posix system lacks support for recursive mutexes)
2465         ])
2466         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2467         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2468         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2469         AC_CHECK_FUNCS(mincore mlock munlock)
2471         dnl ***********************************
2472         dnl *** Checks for working __thread ***
2473         dnl ***********************************
2474         AC_MSG_CHECKING(for working __thread)
2475         if test "x$with_tls" != "x__thread"; then
2476                 AC_MSG_RESULT(disabled)
2477         elif test "x$cross_compiling" = "xyes"; then
2478                 AC_MSG_RESULT(cross compiling, assuming yes)
2479         else
2480                 AC_TRY_RUN([
2481                         #if defined(__APPLE__) && defined(__clang__)
2482                         #error "__thread does not currently work with clang on Mac OS X"
2483                         #endif
2484                         
2485                         #include <pthread.h>
2486                         __thread int i;
2487                         static int res1, res2;
2489                         void thread_main (void *arg)
2490                         {
2491                                 i = arg;
2492                                 sleep (1);
2493                                 if (arg == 1)
2494                                         res1 = (i == arg);
2495                                 else
2496                                         res2 = (i == arg);
2497                         }
2499                         int main () {
2500                                 pthread_t t1, t2;
2502                                 i = 5;
2504                                 pthread_create (&t1, NULL, thread_main, 1);
2505                                 pthread_create (&t2, NULL, thread_main, 2);
2507                                 pthread_join (t1, NULL);
2508                                 pthread_join (t2, NULL);
2510                                 return !(res1 + res2 == 2);
2511                         }
2512                 ], [
2513                                 AC_MSG_RESULT(yes)
2514                 ], [
2515                                 AC_MSG_RESULT(no)
2516                                 with_tls=pthread
2517                 ])
2518         fi
2520         dnl **************************************
2521         dnl *** Checks for working sigaltstack ***
2522         dnl **************************************
2523         AC_MSG_CHECKING(for working sigaltstack)
2524         if test "x$with_sigaltstack" != "xyes"; then
2525                 AC_MSG_RESULT(disabled)
2526         elif test "x$cross_compiling" = "xyes"; then
2527                 AC_MSG_RESULT(cross compiling, assuming yes)
2528         else
2529                 AC_TRY_RUN([
2530                         #include <stdio.h>
2531                         #include <stdlib.h>
2532                         #include <unistd.h>
2533                         #include <signal.h>
2534                         #include <pthread.h>
2535                         #include <sys/wait.h>
2536                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2537                         #define SA_STACK SA_ONSTACK
2538                         #endif
2539                         static void
2540                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2541                         {
2542                                 exit (0);
2543                         }
2545                         volatile char*__ptr = NULL;
2546                         static void *
2547                         loop (void *ignored)
2548                         {
2549                                 *__ptr = 0;
2550                                 return NULL;
2551                         }
2553                         static void
2554                         child ()
2555                         {
2556                                 struct sigaction sa;
2557                                 stack_t sas;
2558                                 pthread_t id;
2559                                 pthread_attr_t attr;
2561                                 sa.sa_sigaction = sigsegv_signal_handler;
2562                                 sigemptyset (&sa.sa_mask);
2563                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2564                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2565                                         perror ("sigaction");
2566                                         return;
2567                                 }
2569                                 /* x86 darwin deliver segfaults using SIGBUS */
2570                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2571                                         perror ("sigaction");
2572                                         return;
2573                                 }
2574                                 sas.ss_sp = malloc (SIGSTKSZ);
2575                                 sas.ss_size = SIGSTKSZ;
2576                                 sas.ss_flags = 0;
2577                                 if (sigaltstack (&sas, NULL) == -1) {
2578                                         perror ("sigaltstack");
2579                                         return;
2580                                 }
2582                                 pthread_attr_init (&attr);
2583                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2584                                         printf ("pthread_create\n");
2585                                         return;
2586                                 }
2588                                 sleep (100);
2589                         }
2591                         int
2592                         main ()
2593                         {
2594                                 pid_t son;
2595                                 int status;
2596                                 int i;
2598                                 son = fork ();
2599                                 if (son == -1) {
2600                                         return 1;
2601                                 }
2603                                 if (son == 0) {
2604                                         child ();
2605                                         return 0;
2606                                 }
2608                                 for (i = 0; i < 300; ++i) {
2609                                         waitpid (son, &status, WNOHANG);
2610                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2611                                                 return 0;
2612                                         usleep (10000);
2613                                 }
2615                                 kill (son, SIGKILL);
2616                                 return 1;
2617                         }
2619                 ], [
2620                                 AC_MSG_RESULT(yes)
2621                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2622                 ], [
2623                                 with_sigaltstack=no
2624                                 AC_MSG_RESULT(no)
2625                 ])
2626         fi
2628         dnl ********************************
2629         dnl *** Checks for semaphore lib ***
2630         dnl ********************************
2631         # 'Real Time' functions on Solaris
2632         # posix4 on Solaris 2.6
2633         # pthread (first!) on Linux
2634         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2636         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2637         AC_CHECK_FUNCS(shm_open)
2639         dnl ********************************
2640         dnl *** Checks for timezone stuff **
2641         dnl ********************************
2642         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2643                 AC_TRY_COMPILE([
2644                         #include <time.h>
2645                         ], [
2646                         struct tm tm;
2647                         tm.tm_gmtoff = 1;
2648                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2649         if test $ac_cv_struct_tm_gmtoff = yes; then
2650                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2651         else
2652                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2653                         AC_TRY_COMPILE([
2654                                 #include <time.h>
2655                         ], [
2656                                 timezone = 1;
2657                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2658                 if test $ac_cv_var_timezone = yes; then
2659                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2660                 else
2661                         AC_ERROR(unable to find a way to determine timezone)
2662                 fi
2663         fi
2665         dnl *********************************
2666         dnl *** Checks for math functions ***
2667         dnl *********************************
2668         AC_SEARCH_LIBS(sqrtf, m)
2670         dnl ****************************************************************
2671         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2672         dnl *** have it in the library (duh))                            ***
2673         dnl ****************************************************************
2674         AC_CHECK_FUNCS(poll)
2676         dnl **********************************
2677         dnl *** epoll                      ***
2678         dnl **********************************
2679         AC_CHECK_HEADERS(sys/epoll.h)
2680         haveepoll=no
2681         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2682         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2683                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2684         fi
2686         havekqueue=no
2688         AC_CHECK_HEADERS(sys/event.h)
2689         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2691         dnl **************************************
2692         dnl * Darwin has a race that prevents us from using reliably:
2693         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2694         dnl * Since kqueue is mostly used for scaling large web servers, 
2695         dnl * and very few folks run Mono on large web servers on OSX, falling
2696         dnl * back 
2697         dnl **************************************
2698         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2699                 if test "x$host_darwin" = "xno"; then
2700                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2701                 fi
2702         fi
2704         dnl ******************************
2705         dnl *** Checks for SIOCGIFCONF ***
2706         dnl ******************************
2707         AC_CHECK_HEADERS(sys/ioctl.h)
2708         AC_CHECK_HEADERS(net/if.h, [], [],
2709            [
2710            #ifdef HAVE_SYS_TYPES_H
2711            # include <sys/types.h>
2712            #endif
2713            #ifdef HAVE_SYS_SOCKET_H
2714            # include <sys/socket.h>
2715            #endif
2716            ])
2717         AC_MSG_CHECKING(for ifreq)
2718         AC_TRY_COMPILE([
2719                 #include <stdio.h>
2720                 #include <sys/ioctl.h>
2721                 #include <net/if.h>
2722                 ], [
2723                 struct ifconf ifc;
2724                 struct ifreq *ifr;
2725                 void *x;
2726                 ifc.ifc_len = 0;
2727                 ifc.ifc_buf = NULL;
2728                 x = (void *) &ifr->ifr_addr;
2729                 ],[
2730                         AC_MSG_RESULT(yes)
2731                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2732                 ], [
2733                         AC_MSG_RESULT(no)
2734                 ])
2735         dnl **********************************
2736         dnl ***     Checks for sin_len     ***
2737         dnl **********************************
2738         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2739         AC_TRY_COMPILE([
2740                 #include <netinet/in.h>
2741                 ], [
2742                 struct sockaddr_in saddr;
2743                 saddr.sin_len = sizeof (saddr);
2744                 ],[
2745                         AC_MSG_RESULT(yes)
2746                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2747                 ], [
2748                         AC_MSG_RESULT(no)
2749                 ])      
2750         dnl **********************************
2751         dnl ***    Checks for sin6_len     ***
2752         dnl **********************************
2753         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2754         AC_TRY_COMPILE([
2755                 #include <netinet/in.h>
2756                 ], [
2757                 struct sockaddr_in6 saddr6;
2758                 saddr6.sin6_len = sizeof (saddr6);
2759                 ],[
2760                         AC_MSG_RESULT(yes)
2761                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2762                 ], [
2763                         AC_MSG_RESULT(no)
2764                 ])
2765         dnl **********************************
2766         dnl *** Check for getifaddrs       ***
2767         dnl **********************************
2768         AC_MSG_CHECKING(for getifaddrs)
2769                 AC_TRY_LINK([
2770                 #include <stdio.h>
2771                 #include <sys/types.h>
2772                 #include <sys/socket.h>
2773                 #include <ifaddrs.h>
2774         ], [
2775                 getifaddrs(NULL);
2776         ], [
2777                 # Yes, we have it...
2778                 AC_MSG_RESULT(yes)
2779                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2780         ], [
2781                 AC_MSG_RESULT(no)
2782         ])
2783         dnl **********************************
2784         dnl *** Check for if_nametoindex   ***
2785         dnl **********************************
2786         AC_MSG_CHECKING(for if_nametoindex)
2787                 AC_TRY_LINK([
2788                 #include <stdio.h>
2789                 #include <sys/types.h>
2790                 #include <sys/socket.h>
2791                 #include <net/if.h>
2792         ], [
2793                 if_nametoindex(NULL);
2794         ], [
2795                 # Yes, we have it...
2796                 AC_MSG_RESULT(yes)
2797                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2798         ], [
2799                 AC_MSG_RESULT(no)
2800         ])
2801         dnl **********************************
2802         dnl *** Check for access ***
2803         dnl **********************************
2804         AC_MSG_CHECKING(for access)
2805                 AC_TRY_LINK([
2806                 #include <unistd.h>
2807         ], [
2808                 access(NULL,0);
2809         ], [
2810                 # Yes, we have it...
2811                 AC_MSG_RESULT(yes)
2812                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2813         ], [
2814                 AC_MSG_RESULT(no)
2815         ])
2816                         
2817         dnl **********************************
2818         dnl *** Checks for proclib         ***
2819         dnl **********************************
2820         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.)])
2821         dnl **********************************
2822         dnl *** Checks for MonoPosixHelper ***
2823         dnl **********************************
2824         AC_CHECK_HEADERS(checklist.h)
2825         AC_CHECK_HEADERS(pathconf.h)
2826         AC_CHECK_HEADERS(fstab.h)
2827         AC_CHECK_HEADERS(attr/xattr.h)
2828         AC_CHECK_HEADERS(sys/extattr.h)
2829         AC_CHECK_HEADERS(sys/sendfile.h)
2830         AC_CHECK_HEADERS(sys/statvfs.h)
2831         AC_CHECK_HEADERS(sys/statfs.h)
2832         AC_CHECK_HEADERS(sys/vfstab.h)
2833         AC_CHECK_HEADERS(sys/xattr.h)
2834         AC_CHECK_HEADERS(sys/mman.h)
2835         AC_CHECK_HEADERS(sys/param.h)
2836         AC_CHECK_HEADERS(sys/mount.h, [], [],
2837                 [
2838                 #ifdef HAVE_SYS_PARAM_H
2839                 # include <sys/param.h>
2840                 #endif
2841                 ])
2842         AC_CHECK_HEADERS(sys/mount.h)
2843         AC_CHECK_FUNCS(confstr)
2844         AC_CHECK_FUNCS(seekdir telldir)
2845         AC_CHECK_FUNCS(getdomainname)
2846         AC_CHECK_FUNCS(setdomainname)
2847         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2848         AC_CHECK_FUNCS(setgroups)
2849         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2850         AC_CHECK_FUNCS(getfsstat)
2851         AC_CHECK_FUNCS(lutimes futimes)
2852         AC_CHECK_FUNCS(mremap)
2853         AC_CHECK_FUNCS(remap_file_pages)
2854         AC_CHECK_FUNCS(posix_fadvise)
2855         AC_CHECK_FUNCS(posix_fallocate)
2856         AC_CHECK_FUNCS(posix_madvise)
2857         AC_CHECK_FUNCS(vsnprintf)
2858         AC_CHECK_FUNCS(sendfile)
2859         AC_CHECK_FUNCS(gethostid sethostid)
2860         AC_CHECK_FUNCS(sethostname)
2861         AC_CHECK_FUNCS(statfs)
2862         AC_CHECK_FUNCS(fstatfs)
2863         AC_CHECK_FUNCS(statvfs)
2864         AC_CHECK_FUNCS(fstatvfs)
2865         AC_CHECK_FUNCS(stime)
2866         AC_CHECK_FUNCS(ttyname_r)
2867         AC_CHECK_FUNCS(psignal)
2868         AC_CHECK_FUNCS(getlogin_r)
2869         AC_CHECK_FUNCS(lockf)
2870         AC_CHECK_FUNCS(swab)
2871         AC_CHECK_FUNCS(setusershell endusershell)
2872         AC_CHECK_FUNCS(futimens utimensat)
2873         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2874         AC_CHECK_FUNCS(readv writev preadv pwritev)
2875         AC_CHECK_FUNCS(setpgid)
2876         AC_CHECK_FUNCS(system)
2877         AC_CHECK_FUNCS(fork execv execve)
2878         AC_CHECK_FUNCS(accept4)
2879         AC_CHECK_FUNCS(localtime_r)
2880         AC_CHECK_FUNCS(mkdtemp)
2881         AC_CHECK_SIZEOF(size_t)
2882         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2883                 [#include <sys/types.h>
2884                  #include <sys/stat.h>
2885                  #include <unistd.h>])
2886         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2887                 [#include <sys/types.h>
2888                  #include <sys/stat.h>
2889                  #include <unistd.h>])
2890         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2891                 [#include <sys/time.h>])
2892         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2893                 [#include <sys/socket.h>])
2894         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2895                 [#include <unistd.h>
2896                  #include <fcntl.h>])
2897         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2898                 [#include <sys/uio.h>])
2899         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2900                 [#include <sys/socket.h>])
2901         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2902                 [#include <sys/poll.h>])
2903         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2904                 [#include <sys/socket.h>])
2905         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2906                 [#include <sys/socket.h>])
2907         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2908                 [#include <netinet/in.h>])
2909         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2910                 [#include <netinet/in.h>])
2911         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2912                 [#include <sys/un.h>])
2913         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2914                 [#include <sys/types.h>
2915                  #include <sys/stat.h>
2916                  #include <unistd.h>])
2917         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2918                 [#include <time.h>])
2919         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2920                 [#include <sys/time.h>
2921                  #include <sys/types.h>
2922                  #include <utime.h>])
2923         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2924                 [#include <sys/time.h>])
2925         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2926                 [#include <sys/types.h>
2927                  #include <utime.h>])
2928         AC_CHECK_MEMBERS(
2929                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2930                 [#include <sys/types.h>
2931                  #include <dirent.h>])
2932         AC_CHECK_MEMBERS(
2933                 [struct passwd.pw_gecos],,, 
2934                 [#include <sys/types.h>
2935                  #include <pwd.h>])
2936         AC_CHECK_MEMBERS(
2937                 [struct statfs.f_flags],,, 
2938                 [#include <sys/types.h>
2939                  #include <sys/vfs.h>])
2940         AC_CHECK_MEMBERS(
2941                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2942                 [#include <sys/types.h>
2943                  #include <sys/stat.h>
2944                  #include <unistd.h>])
2946         dnl Favour xattr through glibc, but use libattr if we have to
2947         AC_CHECK_FUNC(lsetxattr, ,
2948                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2949         )
2950         AC_SUBST(XATTR_LIB)
2952         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2953         AC_CHECK_MEMBERS(
2954                 [struct kinfo_proc.kp_proc],,, 
2955                 [#include <sys/types.h>
2956                  #include <sys/param.h>
2957                  #include <sys/sysctl.h>
2958                  #include <sys/proc.h>
2959                  ])
2961         dnl *********************************
2962         dnl *** Checks for Windows compilation ***
2963         dnl *********************************
2964         AC_CHECK_HEADERS(sys/time.h)
2965         AC_CHECK_HEADERS(sys/param.h)
2966         AC_CHECK_HEADERS(dirent.h)
2968         dnl ******************************************
2969         dnl *** Checks for OSX and iOS compilation ***
2970         dnl ******************************************
2971         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2973         dnl *********************************
2974         dnl *** Check for Console 2.0 I/O ***
2975         dnl *********************************
2976         AC_CHECK_HEADERS([curses.h])
2977         AC_CHECK_HEADERS([term.h], [], [],
2978         [#if HAVE_CURSES_H
2979          #include <curses.h>
2980          #endif
2981         ])
2982         AC_CHECK_HEADERS([termios.h])
2984         dnl *********************************
2985         dnl *** Checks for random         ***
2986         dnl *********************************
2987         if test x$host_darwin = xno; then
2988                 AC_CHECK_HEADERS(sys/random.h)
2989                 AC_CHECK_FUNCS(getrandom getentropy)
2990         fi
2992         dnl *********************************
2993         dnl *** Checks for Mono.Native  ***
2994         dnl *********************************
2996         AC_MSG_CHECKING(for linux/in.h)
2997         AC_TRY_COMPILE([
2998                 #include <sys/socket.h>
2999                 #include <linux/in.h>
3000         ], [
3001         ],[
3002                 AC_MSG_RESULT(yes)
3003                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3004         ], [
3005                 AC_MSG_RESULT(no)
3006         ])
3008         AC_MSG_CHECKING(for struct in_pktinfo)
3009         AC_TRY_COMPILE([
3010                 #ifdef HAVE_LINUX_IN_H
3011                 #include <sys/socket.h>
3012                 #include <linux/in.h>
3013                 #else
3014                 #include <netinet/in.h>
3015                 #endif
3016         ], [
3017                 struct in_pktinfo pktinfo;
3018         ],[
3019                 AC_MSG_RESULT(yes)
3020                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3021         ], [
3022                 AC_MSG_RESULT(no)
3023         ])
3025         AC_MSG_CHECKING(for struct ip_mreqn)
3026         AC_TRY_COMPILE([
3027                 #if HAVE_LINUX_IN_H
3028                 #include <sys/socket.h>
3029                 #include <linux/in.h>
3030                 #else
3031                 #include <netinet/in.h>
3032                 #endif
3033         ], [
3034                 struct ip_mreqn mreqn;
3035         ],[
3036                 AC_MSG_RESULT(yes)
3037                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3038         ], [
3039                 AC_MSG_RESULT(no)
3040         ])
3042         if test x$host_darwin = xno; then
3043                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3044         fi
3046         if test x$mono_native_platform_ios = xno; then
3047                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3048                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3049                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3050         fi
3052         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3053         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3054         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3055         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3056         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3057         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3058         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3059         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3060         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3061         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3062         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3063         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3064         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3065         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3066         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3067         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3068         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3069         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3070         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3072         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3073         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3075         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>]])
3076         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>]])
3077         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>]])
3078         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>]])
3079         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3080         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3081         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3083         AC_MSG_CHECKING(for struct statfs)
3084         AC_TRY_COMPILE([
3085                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3086                 #include <sys/mount.h>
3087                 #else
3088                 #include <sys/statfs.h>
3089                 #endif
3090         ], [
3091                 struct statfs;
3092         ],[
3093                 AC_MSG_RESULT(yes)
3094                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3095         ], [
3096                 AC_MSG_RESULT(no)
3097         ])
3099         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3100                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3101         fi
3103         AC_MSG_CHECKING(for readdir_r)
3104         AC_TRY_COMPILE([
3105                 #include <dirent.h>
3106         ], [
3107                 DIR* dir;
3108                 struct dirent* entry;
3109                 struct dirent* result;
3110                 readdir_r(dir, entry, &result);
3111         ],[
3112                 AC_MSG_RESULT(yes)
3113                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3114         ], [
3115                 AC_MSG_RESULT(no)
3116         ])
3118         AC_MSG_CHECKING(for kevent with void *data)
3119         AC_TRY_COMPILE([
3120                 #include <sys/types.h>
3121                 #include <sys/event.h>
3122         ], [
3123                 struct kevent event;
3124                 void* data;
3125                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3126         ],[
3127                 AC_MSG_RESULT(yes)
3128                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3129         ], [
3130                 AC_MSG_RESULT(no)
3131         ])
3133         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3134         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3136         AC_MSG_CHECKING(for sendfile with 4 arguments)
3137         AC_TRY_COMPILE([
3138                 #include <sys/sendfile.h>
3139         ], [
3140                 int result = sendfile(0, 0, 0, 0);
3141         ],[
3142                 AC_MSG_RESULT(yes)
3143                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3144         ], [
3145                 AC_MSG_RESULT(no)
3146         ])
3148         AC_MSG_CHECKING(for sendfile with 6 arguments)
3149         AC_TRY_LINK([
3150                 #include <stdlib.h>
3151                 #include <sys/types.h>
3152                 #include <sys/socket.h>
3153                 #include <sys/uio.h>
3154         ], [
3155                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3156         ],[
3157                 AC_MSG_RESULT(yes)
3158                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3159         ], [
3160                 AC_MSG_RESULT(no)
3161         ])
3163         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3164         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3165         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3166         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3168         ORIG_CFLAGS="$CFLAGS"
3169         CFLAGS="-Werror -Wsign-conversion"
3171         AC_MSG_CHECKING(for getnameinfo with signed flags)
3172         AC_TRY_COMPILE([
3173                 #include <sys/types.h>
3174                 #include <netdb.h>
3175         ], [
3176                 const struct sockaddr *addr;
3177                 socklen_t addrlen;
3178                 char *host;
3179                 socklen_t hostlen;
3180                 char *serv;
3181                 socklen_t servlen;
3182                 int flags;
3183                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3184         ],[
3185                 AC_MSG_RESULT(yes)
3186                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3187         ], [
3188                 AC_MSG_RESULT(no)
3189         ])
3191         CFLAGS="$ORIG_CFLAGS"
3193         if test "x$host_linux" = "xyes"; then
3194                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3195         else
3196                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3197         fi
3199         ORIG_CFLAGS="$CFLAGS"
3200         CFLAGS="-Werror -Wsign-conversion"
3202         AC_MSG_CHECKING(for bind with unsigned addrlen)
3203         AC_TRY_COMPILE([
3204                 #include <sys/socket.h>
3205         ], [
3206                 int fd;
3207                 struct sockaddr* addr;
3208                 socklen_t addrLen;
3209                 bind(fd, addr, addrLen);
3210         ],[
3211                 AC_MSG_RESULT(yes)
3212                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3213         ], [
3214                 AC_MSG_RESULT(no)
3215         ])
3217         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3218         AC_TRY_COMPILE([
3219                 #include <netinet/in.h>
3220                 #include <netinet/tcp.h>
3221         ], [
3222                 struct ipv6_mreq opt;
3223                 unsigned int index = 0;
3224                 opt.ipv6mr_interface = index;
3225         ],[
3226                 AC_MSG_RESULT(yes)
3227                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3228         ], [
3229                 AC_MSG_RESULT(no)
3230         ])
3232         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3233         AC_TRY_COMPILE([
3234                 #include <sys/inotify.h>
3235         ], [
3236                 intptr_t fd;
3237                 uint32_t wd;
3238                 int result = inotify_rm_watch(fd, wd);
3239         ],[
3240                 AC_MSG_RESULT(yes)
3241                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3242         ], [
3243                 AC_MSG_RESULT(no)
3244         ])
3246         CFLAGS="$ORIG_CFLAGS"
3248         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3249         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3250                 AC_MSG_RESULT(no)
3251         else
3252                 AC_TRY_RUN([
3253                         #include <sys/mman.h>
3254                         #include <fcntl.h>
3255                         #include <unistd.h>
3257                         int main ()
3258                         {
3259                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3260                                 if (fd == -1)
3261                                         return -1;
3263                                 shm_unlink("/mono_configure_shm_open");
3265                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3266                                 //       on at least the current version of Mac OS X
3268                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3269                                         return -1;
3271                                 return 0;
3272                         }
3273                 ],[
3274                         AC_MSG_RESULT(yes)
3275                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3276                 ], [
3277                         AC_MSG_RESULT(no)
3278                 ])
3279         fi
3281         AC_MSG_CHECKING(for getpriority with int who)
3282         AC_TRY_COMPILE([
3283                 #include <sys/resource.h>
3284         ], [
3285                 int which;
3286                 int who;
3287                 int result = getpriority(which, who);
3288         ],[
3289                 AC_MSG_RESULT(yes)
3290                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3291         ], [
3292                 AC_MSG_RESULT(no)
3293         ])
3295         AC_MSG_CHECKING(for kevent with int parameters)
3296         AC_TRY_COMPILE([
3297                 #include <sys/types.h>
3298                 #include <sys/event.h>
3299         ], [
3300                 int kg;
3301                 const struct kevent* chagelist;
3302                 int nchanges;
3303                 struct kevent* eventlist;
3304                 int nevents;
3305                 const struct timespec* timeout;
3306                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3307         ],[
3308                 AC_MSG_RESULT(yes)
3309                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3310         ], [
3311                 AC_MSG_RESULT(no)
3312         ])
3314         ORIG_CFLAGS="$CFLAGS"
3315         CFLAGS="-Werror -Wimplicit-function-declaration"
3317         AC_MSG_CHECKING(for mkstemps)
3318         AC_TRY_COMPILE([
3319                 #include <stdlib.h>
3320                 #include <unistd.h>
3321                 #include <string.h>
3322         ], [
3323                 char *template;
3324                 int suffixlen;
3325                 int result = mkstemps(template, suffixlen);
3326         ],[
3327                 AC_MSG_RESULT(yes)
3328                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3329                 have_mkstemps=yes
3330         ], [
3331                 AC_MSG_RESULT(no)
3332         ])
3334         CFLAGS="$ORIG_CFLAGS"
3336         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3337                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3338         fi
3340         AC_MSG_CHECKING(for tcp/var.h)
3341         AC_TRY_COMPILE([
3342                 #include <sys/types.h>
3343                 #include <sys/socketvar.h>
3344                 #include <netinet/ip.h>
3345                 #include <netinet/tcp.h>
3346                 #include <netinet/tcp_var.h>
3347         ], [
3348         ],[
3349                 AC_MSG_RESULT(yes)
3350                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3351         ], [
3352                 AC_MSG_RESULT(no)
3353         ])
3355         AC_CHECK_HEADERS([sys/cdefs.h])
3357         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3358         AC_TRY_COMPILE([
3359                 #ifdef HAVE_SYS_CDEFS_H
3360                 #include <sys/cdefs.h>
3361                 #endif
3362                 #include <netinet/tcp.h>
3363         ], [
3364                 int result = TCP_ESTABLISHED;
3365         ],[
3366                 AC_MSG_RESULT(yes)
3367                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3368         ], [
3369                 AC_MSG_RESULT(no)
3370         ])
3372         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3374         AC_MSG_CHECKING(for struct rt_msghdr)
3375         AC_TRY_COMPILE([
3376                 #include <sys/types.h>
3377                 #include <net/route.h>
3378         ], [
3379                 struct rt_msghdr;
3380         ],[
3381                 AC_MSG_RESULT(yes)
3382                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3383         ], [
3384                 AC_MSG_RESULT(no)
3385         ])
3387         AC_CHECK_HEADERS([sys/sysctl.h])
3388         AC_CHECK_HEADERS([linux/rtnetlink.h])
3390         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3391         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3392         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3394         ORIG_CFLAGS="$CFLAGS"
3395         CFLAGS="-Werror -Weverything"
3397         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3398         AC_TRY_COMPILE([
3399                 #include <unistd.h>
3400         ], [
3401                 size_t namelen = 20;
3402                 char name[20];
3403                 int result = getdomainname(name, namelen);
3404         ],[
3405                 AC_MSG_RESULT(yes)
3406                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3407         ], [
3408                 AC_MSG_RESULT(no)
3409         ])
3411         CFLAGS="$ORIG_CFLAGS"
3413         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3414         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3415         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3417         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
3418                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3419         elif test "x$host_linux" = "xyes"; then
3420                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3421         fi
3423         AC_CHECK_HEADERS([crt_externs.h])
3425         AC_MSG_CHECKING(for _NSGetEnviron)
3426         AC_TRY_COMPILE([
3427                 #include <crt_externs.h>
3428         ], [
3429                 char **result = *(_NSGetEnviron());
3430         ],[
3431                 AC_MSG_RESULT(yes)
3432                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3433         ], [
3434                 AC_MSG_RESULT(no)
3435         ])
3437         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3439 else
3440         dnl *********************************
3441         dnl *** Checks for Windows compilation ***
3442         dnl *********************************
3443         AC_CHECK_HEADERS(winternl.h)
3445         jdk_headers_found=no
3446         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3447         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3448         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3449         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3450         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3451         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3452         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3454         dnl *********************************
3455         dnl *** Check for struct ip_mreqn ***
3456         dnl *********************************
3457         AC_MSG_CHECKING(for struct ip_mreqn)
3458         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3459                 struct ip_mreqn mreq;
3460                 mreq.imr_address.s_addr = 0;
3461         ], [
3462                 # Yes, we have it...
3463                 AC_MSG_RESULT(yes)
3464                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3465         ], [
3466                 # We'll just have to try and use struct ip_mreq
3467                 AC_MSG_RESULT(no)
3468                 AC_MSG_CHECKING(for struct ip_mreq)
3469                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3470                         struct ip_mreq mreq;
3471                         mreq.imr_interface.s_addr = 0;
3472                 ], [
3473                         # Yes, we have it...
3474                         AC_MSG_RESULT(yes)
3475                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3476                 ], [
3477                         # No multicast support
3478                         AC_MSG_RESULT(no)
3479                 ])
3480         ])
3482         dnl **********************************
3483         dnl *** Check for getaddrinfo ***
3484         dnl **********************************
3485         AC_MSG_CHECKING(for getaddrinfo)
3486                 AC_TRY_LINK([
3487                 #include <stdio.h>
3488                 #include <winsock2.h>
3489                 #include <ws2tcpip.h>
3490         ], [
3491                 getaddrinfo(NULL,NULL,NULL,NULL);
3492         ], [
3493                 # Yes, we have it...
3494                 AC_MSG_RESULT(yes)
3495                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3496         ], [
3497                 AC_MSG_RESULT(no)
3498         ])
3500         dnl **********************************
3501         dnl *** Check for gethostbyname ***
3502         dnl **********************************
3503         AC_MSG_CHECKING(for gethostbyname)
3504                 AC_TRY_LINK([
3505                 #include <stdio.h>
3506                 #include <winsock2.h>
3507                 #include <ws2tcpip.h>
3508         ], [
3509                 gethostbyname(NULL);
3510         ], [
3511                 # Yes, we have it...
3512                 AC_MSG_RESULT(yes)
3513                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3514         ], [
3515                 AC_MSG_RESULT(no)
3516         ])
3518         dnl **********************************
3519         dnl *** Check for getprotobyname ***
3520         dnl **********************************
3521         AC_MSG_CHECKING(for getprotobyname)
3522                 AC_TRY_LINK([
3523                 #include <stdio.h>
3524                 #include <winsock2.h>
3525                 #include <ws2tcpip.h>
3526         ], [
3527                 getprotobyname(NULL);
3528         ], [
3529                 # Yes, we have it...
3530                 AC_MSG_RESULT(yes)
3531                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3532         ], [
3533                 AC_MSG_RESULT(no)
3534         ])
3536         dnl **********************************
3537         dnl *** Check for getnameinfo ***
3538         dnl **********************************
3539         AC_MSG_CHECKING(for getnameinfo)
3540                 AC_TRY_LINK([
3541                 #include <stdio.h>
3542                 #include <winsock2.h>
3543                 #include <ws2tcpip.h>
3544         ], [
3545                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3546         ], [
3547                 # Yes, we have it...
3548                 AC_MSG_RESULT(yes)
3549                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3550         ], [
3551                 AC_MSG_RESULT(no)
3552         ])
3554         dnl **********************************
3555         dnl *** Check for inet_ntop ***
3556         dnl **********************************
3557         AC_MSG_CHECKING(for inet_ntop)
3558                 AC_TRY_LINK([
3559                 #include <stdio.h>
3560                 #include <winsock2.h>
3561                 #include <ws2tcpip.h>
3562         ], [
3563                 inet_ntop (0, NULL, NULL, 0);
3564         ], [
3565                 # Yes, we have it...
3566                 AC_MSG_RESULT(yes)
3567                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3568         ], [
3569                 AC_MSG_RESULT(no)
3570         ])
3572         dnl **********************************
3573         dnl *** Check for inet_pton ***
3574         dnl **********************************
3575         AC_MSG_CHECKING(for inet_pton)
3576                 AC_TRY_LINK([
3577                 #include <stdio.h>
3578                 #include <winsock2.h>
3579                 #include <ws2tcpip.h>
3580         ], [
3581                 #ifndef inet_pton
3582                 (void) inet_pton;
3583                 #endif
3584                 inet_pton (0, NULL, NULL);
3585         ], [
3586                 # Yes, we have it...
3587                 AC_MSG_RESULT(yes)
3588                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3589         ], [
3590                 AC_MSG_RESULT(no)
3591         ])
3593         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3594         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3595         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3596         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3597         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3598         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3599         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3602 dnl socklen_t check
3603 AC_MSG_CHECKING(for socklen_t)
3604 AC_TRY_COMPILE([
3605 #include <sys/types.h>
3606 #include <sys/socket.h>
3608   socklen_t foo;
3610 ac_cv_c_socklen_t=yes
3611         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3612         AC_MSG_RESULT(yes)
3614         AC_MSG_RESULT(no)
3617 AC_CHECK_FUNCS(execvp)
3619 dnl ****************************
3620 dnl *** Look for /dev/random ***
3621 dnl ****************************
3623 AC_MSG_CHECKING([if usage of random device is requested])
3624 AC_ARG_ENABLE(dev-random,
3625 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3626 try_dev_random=$enableval, try_dev_random=yes)
3628 AC_MSG_RESULT($try_dev_random)
3630 case "{$build}" in
3632 dnl IBM i does not have /dev/random, use unblocking only
3634     *-*-os400*)
3635     NAME_DEV_RANDOM="/dev/urandom"
3636     ;;
3638 dnl Win32 does not have /dev/random, they have their own method...
3640     *-mingw*|*-*-cygwin*)
3641     ac_cv_have_dev_random=no
3642     ;;
3644 dnl Everywhere else, it's /dev/random
3646     *)
3647     NAME_DEV_RANDOM="/dev/random"
3648     ;;
3649 esac
3651 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3653 dnl Now check if the device actually exists
3655 if test "x$try_dev_random" = "xyes"; then
3656     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3657     [if test -r "$NAME_DEV_RANDOM" ; then
3658         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3659     if test "x$ac_cv_have_dev_random" = "xyes"; then
3660         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3661     fi
3662 else
3663     AC_MSG_CHECKING(for random device)
3664     ac_cv_have_dev_random=no
3665     AC_MSG_RESULT(has been disabled)
3668 if test "x$host_win32" = "xyes"; then
3669     AC_DEFINE(HAVE_CRYPT_RNG)
3672 if test "x$ac_cv_have_dev_random" = "xno" \
3673     && test "x$host_win32" = "xno"; then
3674     AC_MSG_WARN([[
3676 *** A system-provided entropy source was not found on this system.
3677 *** Because of this, the System.Security.Cryptography random number generator
3678 *** will throw a NotImplemented exception.
3680 *** If you are seeing this message, and you know your system DOES have an
3681 *** entropy collection in place, please report an issue on GitHub and
3682 *** provide information about the system and how to access the random device.
3684 *** Otherwise you can install either egd or prngd and set the environment
3685 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3686 ***]])
3689 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)
3691 AC_MSG_CHECKING([if big-arrays are to be enabled])
3692 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)
3693 if test "x$enable_big_arrays" = "xyes" ; then
3694     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3695         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3696     else
3697         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3698     fi
3700 AC_MSG_RESULT($enable_big_arrays)
3702 dnl **************
3703 dnl *** DTRACE ***
3704 dnl **************
3706 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3708 if test "x$enable_dtrace" = "xyes"; then
3709    if test "x$has_dtrace" = "xno"; then
3710           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3711    fi
3712    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3713    if test "x$DTRACE" = "xno"; then
3714           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3715           enable_dtrace=no
3716    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3717           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3718           enable_dtrace=no
3719    fi
3722 dtrace_g=no
3723 if test "x$enable_dtrace" = "xyes"; then
3724         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3725         DTRACEFLAGS=
3726         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3727                 case "$host" in
3728                         powerpc-*-darwin*)
3729                         DTRACEFLAGS="-arch ppc64"
3730                         ;;
3731                         i*86-*-darwin*)
3732                         DTRACEFLAGS="-arch x86_64"
3733                         ;;
3734                         *)
3735                         DTRACEFLAGS=-64
3736                         ;;
3737                 esac
3738         else
3739                 case "$host" in
3740                         powerpc-*-darwin*)
3741                         DTRACEFLAGS="-arch ppc"
3742                         ;;
3743                         i*86-*-darwin*)
3744                         DTRACEFLAGS="-arch i386"
3745                         ;;
3746                         *)
3747                         DTRACEFLAGS=-32
3748                         ;;
3749                 esac
3750         fi
3751         AC_SUBST(DTRACEFLAGS)
3752         case "$host" in
3753                 *-*-solaris*)
3754                 dtrace_g=yes
3755                 ;;
3756         esac
3757         AC_CHECK_HEADERS([sys/sdt.h])
3759 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3760 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3762 dnl **************************
3763 dnl *** AOT cross offsets  ***
3764 dnl **************************
3766 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3767     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3769 dnl **************
3770 dnl ***  LLVM  ***
3771 dnl **************
3773 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3774 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3775 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)
3776 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3777 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3779 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3781 if test "x$enable_llvm" = "xdefault"; then
3782    enable_llvm=$enable_llvm_default
3785 internal_llvm="no"
3786 if test "x$enable_llvm" = "xyes"; then
3787         if test "x$with_llvm" != "x"; then
3788                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3789                 if test x$host_win32 = xyes; then
3790                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3791                 fi
3792                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3793                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3794                 fi
3795         else
3796                 if test x$host_win32 = xyes; then
3797                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3798                 else
3799                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3800                 fi
3801                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3802                         internal_llvm=yes
3803                 fi
3804         fi
3806         LLVM_CODEGEN_LIBS="x86codegen"
3807         case "$target" in
3808         arm*)
3809                 LLVM_CODEGEN_LIBS="armcodegen"
3810                 ;;
3811         aarch64*)
3812                 LLVM_CODEGEN_LIBS="aarch64codegen"
3813                 ;;
3814         powerpc*)
3815                 LLVM_CODEGEN_LIBS="powerpccodegen"
3816                 ;;
3817         esac
3818         if test "x$host" != "x$target"; then
3819                 # No need for jit libs
3820                 LLVM_CODEGEN_LIBS=
3821         fi
3823         AC_SUBST(LLVM_CODEGEN_LIBS)
3824         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3825         
3826         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3827 fi # ENABLE_LLVM
3829 # AC_DEFINE necessary for correct restore behavior on Linux
3830 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3831 if test "x$internal_llvm" != "xno"; then
3832    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3835 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3836 if test "x$enable_llvm_asserts" != "xno"; then
3837    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3840 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3842 if test "x$enable_loadedllvm" = "xyes"; then
3843    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3845 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3847 if test "x$enable_llvm" = "xyes"; then
3848    enable_llvm_runtime=yes
3850 if test "x$enable_llvm_runtime" = "xyes"; then
3851    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3853 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3855 TARGET="unknown"
3856 ACCESS_UNALIGNED="yes"
3858 LIBC="libc.so.6"
3859 INTL="libc.so.6"
3860 SQLITE="libsqlite.so.0"
3861 SQLITE3="libsqlite3.so.0"
3862 X11="libX11.so"
3863 GDKX11="libgdk-x11-2.0.so.0"
3864 GTKX11="libgtk-x11-2.0.so.0"
3865 XINERAMA="libXinerama.so.1"
3867 sizeof_register="SIZEOF_VOID_P"
3869 jit_wanted=true
3870 boehm_supported=true
3871 BTLS_SUPPORTED=no
3872 BTLS_PLATFORM=
3874 case "$host" in
3875         wasm32*)
3876                 TARGET=WASM
3877                 arch_target=wasm
3878                 BTLS_SUPPORTED=no
3879                 ACCESS_UNALIGNED="no"
3880                 with_tls=pthread
3881                 ;;
3882         mips*)
3883                 TARGET=MIPS;
3884                 arch_target=mips;
3885                 with_tls=pthread;
3886                 ACCESS_UNALIGNED="no"
3888                 AC_MSG_CHECKING(for mips n32)
3889                 AC_TRY_COMPILE([],[
3890                 #if _MIPS_SIM != _ABIN32
3891                 #error Not mips n32
3892                 #endif
3893                 ],[
3894                 AC_MSG_RESULT(yes)
3895                 sizeof_register=8
3896                 ],[
3897                 AC_MSG_RESULT(no)
3898                 ])
3899                 ;;
3900         i*86-*-*)
3901                 TARGET=X86;
3902                 arch_target=x86;
3903                 case $host_os in
3904                   solaris*)
3905                         LIBC="libc.so"
3906                         INTL="libintl.so"
3907                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3908                                 TARGET=AMD64
3909                                 arch_target=amd64
3910                         fi
3912                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3913                         # int astruct __attribute__ ((visibility ("hidden")));
3914                         # void foo ()
3915                         # {
3916                         #       void *p = &astruct;
3917                         # }
3918                         # gcc -fPIC --shared -o libfoo.so foo.c
3919                         # yields:
3920                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3921                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3922                         have_visibility_hidden=no
3923                         ;;
3924                   mingw*|cygwin*)
3925                         have_visibility_hidden=no
3926                         BTLS_SUPPORTED=no
3927                         BTLS_PLATFORM=i386
3928                         ;;
3929                   haiku*)
3930                         LIBC=libroot.so
3931                         ;;
3932                   linux*)
3933                         AOT_SUPPORTED="yes"
3934                         BTLS_SUPPORTED=yes
3935                         BTLS_PLATFORM=i386
3936                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3937                         ;;
3938                   darwin*)
3939                         AOT_SUPPORTED="yes"
3940                         BTLS_SUPPORTED=yes
3941                         BTLS_PLATFORM=i386
3942                         ;;
3943                   openbsd*|freebsd*|kfreebsd-gnu*)
3944                         AOT_SUPPORTED="yes"
3945                         BTLS_SUPPORTED=yes
3946                         BTLS_PLATFORM=i386
3947                         ;;
3948                 esac
3949                 ;;
3950         x86_64-*-* | amd64-*-*)
3951                 TARGET=AMD64;
3952                 arch_target=amd64;
3953                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3954                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3955                         sizeof_register=8
3956                 fi
3957                 case $host_os in
3958                   linux*)
3959                         AOT_SUPPORTED="yes"
3960                         BTLS_SUPPORTED=yes
3961                         BTLS_PLATFORM=x86_64
3962                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3963                         ;;
3964                   darwin*)
3965                         AOT_SUPPORTED="yes"
3966                         BTLS_SUPPORTED=yes
3967                         BTLS_PLATFORM=x86_64
3968                         boehm_supported=false
3969                         ;;
3970                   openbsd*|freebsd*|kfreebsd-gnu*)
3971                         AOT_SUPPORTED="yes"
3972                         BTLS_SUPPORTED=yes
3973                         BTLS_PLATFORM=x86_64
3974                         ;;
3975                   mingw*|cygwin*)
3976                         BTLS_SUPPORTED=no
3977                         BTLS_PLATFORM=x86_64
3978                         ;;
3979                 esac
3980                 ;;
3981         sparc*-*-*)
3982                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3983                    TARGET=SPARC64
3984                 else
3985                         TARGET=SPARC
3986                 fi
3987                 arch_target=sparc;
3988                 ACCESS_UNALIGNED="no"
3989                 case $host_os in
3990                   linux*) ;;
3991                   *)
3992                         LIBC="libc.so"
3993                         INTL="libintl.so"
3994                 esac
3995                 if test x"$GCC" = xyes; then
3996                         # We don't support v8 cpus
3997                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3998                 fi
3999                 if test x"$AR" = xfalse; then
4000                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4001                 fi
4002                 ;;
4003         *-mingw*|*-*-cygwin*)
4004                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4005                 have_visibility_hidden=no
4006                 INTL="intl"
4007                 ;;
4008         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4009         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4010         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4011                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4012                         TARGET=POWERPC64;
4013                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4014                         if ! (echo $CC | grep -q -- 'clang'); then
4015                                 CFLAGS="$CFLAGS -mminimal-toc"
4016                         fi
4017                 else
4018                         TARGET=POWERPC;
4019                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4020                 fi
4021                 arch_target=ppc;
4022                 case $host_os in
4023                   aix*|os400*)
4024                         BTLS_SUPPORTED=yes
4025                         BTLS_PLATFORM=powerpc
4026                         dnl on AIX/PASE, shared libraries can be inside archives
4027                         dnl if they are, we specify them by lib.a(lib.so)
4028                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4029                         LIBC="libc.a(shr_64.o)"
4030                         INTL="libintl.a(libintl.so.8)"
4031                         ;;
4032                   linux*)
4033                         BTLS_SUPPORTED=yes
4034                         BTLS_PLATFORM=powerpc
4035                         ;;
4036                 esac
4037                 ;;
4038         armv7k-*-darwin*)
4039                 TARGET=ARM;
4040                 TARGET_SYS=WATCHOS
4041                 arch_target=arm;
4042                 arm_fpu=VFP_HARD
4043                 ACCESS_UNALIGNED="no"
4044                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4045                 ;;
4047         arm*-darwin*)
4048                 TARGET=ARM;
4049                 arch_target=arm;
4050                 ACCESS_UNALIGNED="no"
4051                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4052                 ;;
4053         arm*-linux*)
4054                 TARGET=ARM;
4055                 arch_target=arm;
4056                 ACCESS_UNALIGNED="no"
4057                 AOT_SUPPORTED="yes"
4058                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4059                 BTLS_SUPPORTED=yes
4060                 BTLS_PLATFORM=arm
4061                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4062                 case "$target" in
4063                 arm*-linux*-gnueabi)
4064                         BTLS_PLATFORM=armsoft
4065                         ;;
4066                 esac
4067                 ;;
4068         arm*-netbsd*-eabi*)
4069                 TARGET=ARM;
4070                 arch_target=arm;
4071                 ACCESS_UNALIGNED="no"
4072                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4073                 ;;
4074         aarch64-*)
4075                 # https://lkml.org/lkml/2012/7/15/133
4076                 TARGET=ARM64
4077                 arch_target=arm64
4078                 boehm_supported=false
4079                 AOT_SUPPORTED="yes"
4080                 BTLS_SUPPORTED=yes
4081                 BTLS_PLATFORM=aarch64
4082                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4083                 ;;
4084         s390x-*-linux*)
4085                 TARGET=S390X;
4086                 arch_target=s390x;
4087                 ACCESS_UNALIGNED="yes"
4088                 BTLS_SUPPORTED=yes
4089                 BTLS_PLATFORM=s390x
4090                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4091                 ;;
4092 esac
4094 HOST=$TARGET
4096 if test "x$host" != "x$target"; then
4097    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4098    enable_mcs_build=no
4099    enable_support_build=no
4100    BTLS_SUPPORTED=no
4101    # Can't use tls, since it depends on the runtime detection of tls offsets
4102    # in mono-compiler.h
4103    with_tls=pthread
4104    target_mach=no
4105    case "$target" in
4106    wasm32*)
4107                 TARGET=WASM
4108                 arch_target=wasm
4109                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4110                 ;;
4111    arm*-darwin*)
4112                 TARGET=ARM;
4113                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4114                 case "$target" in
4115                 armv7k-*)
4116                         arm_fpu=VFP_HARD
4117                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4118                         ;;
4119                 esac            
4120                 ;;
4121    powerpc64-ps3-linux-gnu)
4122                 TARGET=POWERPC64
4123                 arch_target=powerpc64
4124                 AC_DEFINE(TARGET_PS3, 1, [...])
4125                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4126                 # uses this define
4127                 AC_DEFINE(__mono_ppc64__, 1, [...])
4128                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
4129                 sizeof_register=8
4130                 target_byte_order=G_BIG_ENDIAN
4131                 ;;
4132    powerpc64-xbox360-linux-gnu)
4133                 TARGET=POWERPC64
4134                 arch_target=powerpc64
4135                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4136                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4137                 # uses this define
4138                 sizeof_register=8
4139                 target_byte_order=G_BIG_ENDIAN
4140                 ;;
4141    arm*-linux-*)
4142                 TARGET=ARM;
4143                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4144                 ;;
4145    arm*-netbsd*-eabi*)
4146                 TARGET=ARM;
4147                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4148                 ;;
4149    i686*-linux-*)
4150                 TARGET=X86;
4151                 ;;
4152    i*86-apple-*)
4153                 TARGET=X86;
4154                 ;;
4155    x86_64*-linux-*)
4156                 TARGET=AMD64;
4157                 ;;
4158    x86_64-ps4-freebsd)
4159                 TARGET=AMD64;
4160                 AC_DEFINE(TARGET_PS4, 1, [...])
4161                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4162                 CPPFLAGS="$CPPFLAGS"
4163                 target_win32=no
4164                 ;;
4165    aarch64*-linux-*)
4166                 TARGET=ARM64;
4167                 ;;
4168         aarch64-*)
4169                 TARGET=ARM64
4170                 ;;
4171         *)
4172                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4173         esac
4175         case "$target" in
4176         *-darwin*)
4177                 target_mach=yes
4178                 ;;
4179         *-linux-android*)
4180                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4181                 ;;
4182         esac
4185 case "$TARGET" in
4186 WASM)
4187         AC_DEFINE(TARGET_WASM, 1, [...])
4188         arch_target=wasm
4189         target_sizeof_void_p=4
4190         ;;
4191 X86)
4192         AC_DEFINE(TARGET_X86, 1, [...])
4193         arch_target=x86
4194         target_sizeof_void_p=4
4195         ;;
4196 AMD64)
4197         AC_DEFINE(TARGET_AMD64, 1, [...])
4198         arch_target=amd64
4199         ;;
4200 ARM)
4201         AC_DEFINE(TARGET_ARM, 1, [...])
4202         arch_target=arm
4203         ACCESS_UNALIGNED="no"
4204         target_sizeof_void_p=4
4205         ;;
4206 ARM64)
4207         AC_DEFINE(TARGET_ARM64, 1, [...])
4208         arch_target=arm64
4209         ;;
4210 POWERPC)
4211         AC_DEFINE(TARGET_POWERPC, 1, [...])
4212         ;;
4213 POWERPC64)
4214         AC_DEFINE(TARGET_POWERPC, 1, [...])
4215         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4216         ;;
4217 S390X)
4218         AC_DEFINE(TARGET_S390X, 1, [...])
4219         ;;
4220 MIPS)
4221         AC_DEFINE(TARGET_MIPS, 1, [...])
4222         ;;
4223 SPARC)
4224         AC_DEFINE(TARGET_SPARC, 1, [...])
4225         ;;
4226 SPARC64)
4227         AC_DEFINE(TARGET_SPARC64, 1, [...])
4228         ;;
4229 esac
4231 case "$HOST" in
4232 WASM)
4233         AC_DEFINE(HOST_WASM, 1, [...])
4234         ;;
4235 X86)
4236         AC_DEFINE(HOST_X86, 1, [...])
4237         ;;
4238 AMD64)
4239         AC_DEFINE(HOST_AMD64, 1, [...])
4240         ;;
4241 ARM)
4242         AC_DEFINE(HOST_ARM, 1, [...])
4243         ;;
4244 ARM64)
4245         AC_DEFINE(HOST_ARM64, 1, [...])
4246         ;;
4247 POWERPC)
4248         AC_DEFINE(HOST_POWERPC, 1, [...])
4249         ;;
4250 POWERPC64)
4251         AC_DEFINE(HOST_POWERPC, 1, [...])
4252         AC_DEFINE(HOST_POWERPC64, 1, [...])
4253         ;;
4254 S390X)
4255         AC_DEFINE(HOST_S390X, 1, [...])
4256         ;;
4257 MIPS)
4258         AC_DEFINE(HOST_MIPS, 1, [...])
4259         ;;
4260 SPARC)
4261         AC_DEFINE(HOST_SPARC, 1, [...])
4262         ;;
4263 SPARC64)
4264         AC_DEFINE(HOST_SPARC64, 1, [...])
4265         ;;
4266 esac
4268 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4269 case "$HOST" in
4270 X86 | AMD64 | ARM | ARM64)
4271         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4272         ;;
4273 esac
4275 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4276 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4278 dnl *************
4279 dnl *** VTUNE ***
4280 dnl *************
4282 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4283 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4285 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4287 if test "x$enable_vtune" = "xyes"; then
4288         if test "x$with_vtune" = "x"; then
4289                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4290         else
4291                 VTUNE_PATH=$with_vtune
4292         fi
4293         VTUNE_INCLUDE=$VTUNE_PATH/include
4294         case "$TARGET" in
4295         X86)
4296                 VTUNE_LIB=$VTUNE_PATH/lib32
4297                 ;;
4298         AMD64)
4299                 VTUNE_LIB=$VTUNE_PATH/lib64
4300                 ;;
4301         *)
4302                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4303                 ;;
4304         esac
4305         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4306                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4307         fi
4308         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4309                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4310         fi
4312         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4313         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4315         AC_SUBST(VTUNE_LIBS)
4316         AC_SUBST(VTUNE_CFLAGS)
4318 dnl Use GCC atomic ops if they work on the target.
4319 if test x$GCC = "xyes"; then
4320         case $TARGET in
4321         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
4322                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4323                 ;;
4324         esac
4327 if test "x$target_mach" = "xyes"; then
4329    if test "x$TARGET_SYS" = "xWATCHOS"; then
4330           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4331           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4332           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4333           BTLS_SUPPORTED=no
4334    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4335           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4336           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4337           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4338           BTLS_SUPPORTED=no
4339           target_ios=yes
4340    else
4341        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4342        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4343        #error fail this for ios
4344        #endif
4345        ], [
4346                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4347           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4348           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4349           target_osx=yes
4350        ], [
4351           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4352           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4353           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4354           BTLS_SUPPORTED=no
4355                   target_ios=yes
4356        ])
4357         fi
4358    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4361 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4363 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4365 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4366    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4367 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4368    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4369 else
4370    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4373 if test "x$target_sizeof_void_p" != "x"; then
4374    AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4375    # This is true for all the current cross-compiling targets
4376    AC_DEFINE(SIZEOF_REGISTER,TARGET_SIZEOF_VOID_P,[size of target machine integer registers])
4377 else
4378    AC_DEFINE(TARGET_SIZEOF_VOID_P,SIZEOF_VOID_P,[wordsize of target])
4379    if test "x$sizeof_register" = "x4"; then
4380       AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4381    elif test "x$sizeof_register" = "x8"; then
4382       AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4383    else
4384       AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of target machine integer registers])
4385    fi
4388 if test "x$have_visibility_hidden" = "xyes"; then
4389    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4392 if test "x$have_deprecated" = "xyes"; then
4393    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4396 dnl 
4397 dnl Simple Generational checks (sgen)
4399 SGEN_DEFINES=
4400 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4401 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4402 if test x$buildsgen = xyes; then
4403    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4404    SGEN_DEFINES="-DHAVE_SGEN_GC"
4406         conc_gc_msg=""
4407    if test x$with_sgen_default_concurrent != xno; then
4408        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4409            conc_gc_msg=" (concurrent by default)"
4410    fi
4412    if test "x$gc_msg" = "x"; then
4413       gc_msg="sgen$conc_gc_msg"
4414    else
4415       gc_msg="sgen$conc_gc_msg and $gc_msg"
4416    fi
4418 AC_SUBST(SGEN_DEFINES)
4419 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4421 jit_status="Building and using the JIT"
4423 libsuffix=".so"
4425 case "$host" in
4426      *-*-darwin*)
4427         libsuffix=".dylib"
4428         LIBC="libc.dylib"
4429         INTL="libintl.dylib"
4430         SQLITE="libsqlite.0.dylib"
4431         SQLITE3="libsqlite3.0.dylib"
4432         X11="libX11.dylib"
4433         GDKX11="libgdk-x11-2.0.dylib"
4434         GTKX11="libgtk-x11-2.0.dylib"
4435         ;;
4436      *-*-*netbsd*)
4437         LIBC="libc.so"
4438         INTL="libintl.so"
4439         SQLITE="libsqlite.so"
4440         SQLITE3="libsqlite3.so"
4441         ;;
4442      *-*-kfreebsd*-gnu)
4443         LIBC="libc.so.0.1"
4444         INTL="libc.so.0.1"
4445         X11="libX11.so.6"
4446         ;;
4447     *-*-*freebsd*)
4448         LIBC="libc.so.7"
4449         INTL="libintl.so"
4450         SQLITE="libsqlite.so"
4451         SQLITE3="libsqlite3.so"
4452         ;;
4453     *-*-*openbsd*)
4454         LIBC="libc.so"
4455         INTL="libintl.so"
4456         SQLITE="libsqlite.so"
4457         SQLITE3="libsqlite3.so"
4458         ;;
4459     *-*-*linux*)
4460         AC_PATH_X
4461         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4462         AC_MSG_CHECKING(for the soname of libX11.so)
4463         for i in $x_libraries $dlsearch_path; do
4464                 for r in 4 5 6; do
4465                         if test -f $i/libX11.so.$r; then
4466                                 X11=libX11.so.$r
4467                                 AC_MSG_RESULT($X11)
4468                         fi
4469                 done
4470         done
4471         
4472         if test "x$X11" = "xlibX11.so"; then
4473                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4474                 X11=libX11.so.6
4475         fi
4476         ;;
4477 esac
4479 AC_SUBST(libsuffix)
4481 ######################################
4482 # EGLIB CHECKS
4483 ######################################
4485 GNUC_PRETTY=
4486 GNUC_UNUSED=
4487 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4488 if test x$GCC = xyes; then
4489    GNUC_UNUSED='__attribute__((__unused__))'
4490    GNUC_NORETURN='__attribute__((__noreturn__))'
4491    case $host_cpu in
4492      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4493    esac
4495 AC_SUBST(GNUC_PRETTY)
4496 AC_SUBST(GNUC_UNUSED)
4497 AC_SUBST(GNUC_NORETURN)
4498 AC_SUBST(BREAKPOINT)
4500 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4502 case $host in
4503 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4504     PATHSEP='\\'
4505     SEARCHSEP=';'
4506     OS="WIN32"
4507     PIDTYPE='void *'
4508     ;;
4510     PATHSEP='/'
4511     SEARCHSEP=':'
4512     OS="UNIX"
4513     PIDTYPE='int'
4514     ;;
4515 esac
4517 case $host in
4518         *-*-solaris*)
4519         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4520         ;;
4521 esac
4523 case $target in
4524 arm*-darwin*|aarch64*-*)
4525     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4526     ;;
4527 i*86-*-darwin*)
4528     ORDER=G_LITTLE_ENDIAN
4529     ;;
4530 *-*-haiku*)
4531     LDFLAGS="$LDFLAGS -ltextencoding"
4532     ;;
4533 *-*-openbsd*)
4534     CFLAGS="$CFLAGS -pthread"
4535     LDFLAGS="$LDFLAGS -pthread"
4536     ;;
4537 esac
4539 AC_SUBST(ORDER)
4540 AC_SUBST(CFLAGS)
4541 AC_SUBST(PATHSEP)
4542 AC_SUBST(SEARCHSEP)
4543 AC_SUBST(OS)
4544 AC_SUBST(PIDTYPE)
4546 # Defined for all targets/platforms using classic Windows API support.
4547 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4548 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4550 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4551 AC_CHECK_FUNCS(getrlimit)
4552 AC_CHECK_FUNCS(fork execv execve)
4554 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4556 if test x$with_overridable_allocators = xyes; then
4557         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4558   AC_MSG_NOTICE([Overridable allocator support enabled])
4559 else
4560   AC_MSG_NOTICE([Overridable allocator support disabled])
4564 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4565 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4566 # removed once support for 10.6 is dropped.
4568 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4570 if test x$target_osx = xyes; then
4571 AC_CHECK_FUNCS(getpwuid_r)
4572 elif test x$target_ios = xno; then
4573 AC_CHECK_FUNCS(strndup getpwuid_r)
4576 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4578 AC_SEARCH_LIBS(sqrtf, m)
4580 # nanosleep may not be part of libc, also search it in other libraries
4581 AC_SEARCH_LIBS(nanosleep, rt)
4583 AC_SEARCH_LIBS(dlopen, dl)
4584 old_ldflags="${LDFLAGS}"
4585 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4586 if test $lt_cv_prog_gnu_ld = yes; then
4587         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4588 else
4589         case $host in
4590         *-*-aix*|*-*-os400*)
4591                 ;;
4592         *)
4593                 dnl Try to use export-dynamic anyways
4594                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4595                 ;;
4596         esac
4598 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4599 if test $found_export_dynamic = no; then
4600         LDFLAGS="${old_ldflags}"
4603 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4604 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4605 AC_CHECK_LIB(iconv, iconv_open)
4606 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4607 AC_SUBST(HAVE_ALLOCA_H)
4609 # Get the exact type of size_t, not just its size.
4610 # This is so we can find an exact printf format among u, lu, llu, I64u.
4611 # To avoid warnings about slight mismatches.
4612 # C99 runtime "zu" dependency is being avoided here.
4614 # We have to compile as C++ because C is too lenient
4615 # and lets the wrong thing compile, with warnings.
4617 # Note: "zu" or ifdef <something> have the advantage
4618 # of producing installable "biarch" headers. i.e. one Mac header
4619 # for Mac/x86 and Mac/amd64.
4621 AC_LANG_PUSH(C++)
4623 # Check long before int because it is the overwhelming Unix answer,
4624 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4626 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4628 AC_MSG_CHECKING(if size_t is unsigned long)
4629 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4630         #include <stddef.h>
4631         unsigned long *a = (size_t*)0;
4632 ])], [
4633         AC_MSG_RESULT(yes)
4634         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4635 ], [
4636         AC_MSG_RESULT(no)
4637         AC_MSG_CHECKING(if size_t is unsigned int)
4638         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4639                 #include <stddef.h>
4640                 unsigned *a = (size_t*)0;
4641         ])], [
4642                 AC_MSG_RESULT(yes)
4643                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4644         ], [
4645 # At this point the majority of systems have their answer,
4646 # and we descend into non-standard or new-standard territory.
4648 # Check __int64 first because I64 on some systems predates ll, enabling
4649 # new compiler/old runtime interop, and the types always have the same size.
4650                 AC_MSG_RESULT(no)
4651                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4652                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4653                         #include <stddef.h>
4654                         unsigned __int64 *a = (size_t*)0;
4655                 ])], [
4656                         AC_MSG_RESULT(yes)
4657                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4658                 ], [
4659                         AC_MSG_RESULT(no)
4660                         AC_MSG_CHECKING(if size_t is unsigned long long)
4661                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4662                                 #include <stddef.h>
4663                                 unsigned long long *a = (size_t*)0;
4664                         ])], [
4665                                 AC_MSG_RESULT(yes)
4666                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4667                         ], [
4668                                 AC_MSG_RESULT(no)
4669                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4670                         ] )
4671                 ] )
4672         ] )
4673 ] )
4675 AC_LANG_POP
4677 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4678 # This provides for an exact match with functions that
4679 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4680 # uintptr_t is not necessarily the same.
4682 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4683 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4685 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4686    GSIZE="size_t"
4687    GSSIZE="ptrdiff_t"
4688 else
4689    GSIZE="uintptr_t"
4690    GSSIZE="intptr_t"
4693 AC_SUBST(GSIZE)
4694 AC_SUBST(GSSIZE)
4695 AC_SUBST(GSIZE_FORMAT)
4698 # END OF EGLIB CHECKS
4701 AC_ARG_WITH([libgdiplus],
4702         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4703         [], [with_libgdiplus=installed])
4705 # default install location
4706 libgdiplus_install_loc=libgdiplus${libsuffix}
4707 case "$host" in
4708     *-*-*linux*)
4709     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4710     ;;
4711 esac
4713 case $with_libgdiplus in
4714     no)
4715     libgdiplus_loc=
4716     ;;
4718     installed)
4719     libgdiplus_loc=
4720     if test x$cross_compiling = xno; then
4721         if test x$host_darwin = xyes; then
4722             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4723             if test -x $a; then
4724               libgdiplus_install_loc=$a
4725               libgdiplus_loc=$a
4726             fi
4727         fi
4728     fi
4729     ;;
4731     yes|sibling)
4732     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4733     ;;
4735     /*) # absolute path, assume it is an install location
4736     libgdiplus_loc=$with_libgdiplus
4737     libgdiplus_install_loc=$with_libgdiplus
4738     ;;
4740     *)
4741     libgdiplus_loc=`pwd`/$with_libgdiplus
4742     ;;
4743 esac
4744 AC_SUBST(libgdiplus_loc)
4745 AC_SUBST(libgdiplus_install_loc)
4747 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)
4748 if test "x$icall_symbol_map" = "xyes"; then
4749    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4752 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4753 if test "x$icall_export" = "xyes"; then
4754    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4757 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4758 if test "x$icall_tables" = "xno"; then
4759    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4762 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4764 if test "x$with_tls" = "x__thread"; then
4765         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4766         # Pass the information to libgc
4767         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4768         AC_MSG_CHECKING(if the tls_model attribute is supported)
4769         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4770                 ], [
4771                         AC_MSG_RESULT(yes)
4772                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4773                 ], [
4774                         AC_MSG_RESULT(no)
4775         ])
4778 if test ${TARGET} = ARM; then
4779         dnl ******************************************
4780         dnl *** Check to see what FPU is available ***
4781         dnl ******************************************
4782         AC_MSG_CHECKING(which FPU to use)
4784         #
4785         # This is a bit tricky:
4786         #
4787         # if (__ARM_PCS_VFP) {
4788         #       /* mfloat-abi=hard == VFP with hard ABI */
4789         # } elif (!__SOFTFP__) {
4790         #       /* mfloat-abi=softfp == VFP with soft ABI */
4791         # } else {
4792         #       /* mfloat-abi=soft == no VFP */
4793         # }
4794         #
4795         # The exception is iOS (w/ GCC) where none of the above
4796         # are defined (but iOS always uses the 'softfp' ABI).
4797         #
4798         # No support for FPA.
4799         #
4801         fpu=NONE
4803         # iOS GCC always uses the 'softfp' ABI.
4804         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4805                 fpu=VFP
4806         fi
4808         # Are we using the 'hard' ABI?
4809         if test x$fpu = xNONE; then
4810                 AC_TRY_COMPILE([], [
4811                         #ifndef __ARM_PCS_VFP
4812                         #error "Float ABI is not 'hard'"
4813                         #endif
4814                 ], [
4815                         fpu=VFP_HARD
4816                 ], [
4817                         fpu=NONE
4818                 ])
4819         fi
4821         # No 'hard' ABI. 'soft' or 'softfp'?
4822         if test x$fpu = xNONE; then
4823                 AC_TRY_COMPILE([], [
4824                         #ifdef __SOFTFP__
4825                         #error "Float ABI is not 'softfp'"
4826                         #endif
4827                 ], [
4828                         fpu=VFP
4829                 ], [
4830                         fpu=NONE
4831                 ])
4832         fi
4834         if test x$arm_fpu != x; then
4835            fpu=$arm_fpu
4836         fi
4838         AC_MSG_RESULT($fpu)
4839         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4840         unset fpu
4842         dnl *********************************************
4843         dnl *** Check which ARM version(s) we can use ***
4844         dnl *********************************************
4845         AC_MSG_CHECKING(which ARM version to use)
4847         AC_TRY_COMPILE([], [
4848                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4849                 #error Not on ARM v5.
4850                 #endif
4851         ], [
4852                 arm_v5=yes
4854                 arm_ver=ARMv5
4855         ], [])
4857         AC_TRY_COMPILE([], [
4858                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4859                 #error Not on ARM v6.
4860                 #endif
4861         ], [
4862                 arm_v5=yes
4863                 arm_v6=yes
4865                 arm_ver=ARMv6
4866         ], [])
4868         AC_TRY_COMPILE([], [
4869                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4870                 #error Not on ARM v7.
4871                 #endif
4872         ], [
4873                 arm_v5=yes
4874                 arm_v6=yes
4875                 arm_v7=yes
4877                 arm_ver=ARMv7
4878         ], [])
4880         AC_MSG_RESULT($arm_ver)
4882         if test x$arm_v5 = xyes; then
4883                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4884                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4885         fi
4887         if test x$arm_v6 = xyes; then
4888                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4889                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4890         fi
4892         if test x$arm_v7 = xyes; then
4893                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4894                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4895         fi
4898 if test ${TARGET} = unknown; then
4899         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4900         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4903 if test "x$platform_android" = "xyes"; then
4904         case "x${TARGET}" in
4905         xARM)
4906                 case "x$arm_ver" in
4907                 xARMv5)
4908                         BTLS_SUPPORTED=yes
4909                         BTLS_PLATFORM=android-armv5
4910                         ;;
4911                 xARMv6)
4912                         BTLS_SUPPORTED=yes
4913                         BTLS_PLATFORM=android-armv6
4914                         ;;
4915                 xARMv7)
4916                         BTLS_SUPPORTED=yes
4917                         BTLS_PLATFORM=android-armv7
4918                         ;;
4919                 *)
4920                         BTLS_SUPPORTED=no
4921                         ;;
4922                 esac
4923                 ;;
4924         xARM64)
4925                 BTLS_SUPPORTED=yes
4926                 BTLS_PLATFORM=android-v8a
4927                 ;;
4928         xX86)
4929                 BTLS_SUPPORTED=yes
4930                 BTLS_PLATFORM=android-x86
4931                 ;;
4932         xAMD64)
4933                 BTLS_SUPPORTED=yes
4934                 BTLS_PLATFORM=android-x64
4935                 ;;
4936         *)
4937                 BTLS_SUPPORTED=no
4938                 ;;
4939         esac
4942 if test ${ACCESS_UNALIGNED} = no; then
4943         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4946 if test x$host_darwin = xyes; then
4947         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4948         AS_IF(
4949                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4950                 [AC_MSG_RESULT([no])],
4951                 [
4952                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4953                         AR_FLAGS="Scru"
4954                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4955                         AC_MSG_RESULT([yes])
4956                 ]
4957         )
4960 case "x$libgc" in
4961         xincluded)
4962                 # Pass CPPFLAGS to libgc configure
4963                 # We should use a separate variable for this to avoid passing useless and
4964                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4965                 # This should be executed late so we pick up the final version of CPPFLAGS
4966                 # The problem with this approach, is that during a reconfigure, the main
4967                 # configure scripts gets invoked with these arguments, so we use separate
4968                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4969                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4970                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4971                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4972                 fi
4973                 # Don't pass -finstrument-for-thread-suspension in, 
4974                 # if these are instrumented it will be very bad news 
4975                 # (infinite recursion, undefined parking behavior, etc)
4976                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4977                 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\""
4978                 if test "x$support_boehm" = "xyes"; then
4979                         AC_CONFIG_SUBDIRS(libgc)
4980                 fi
4981                 ;;
4982 esac
4984 MALLOC_MEMPOOLS=no
4985 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4986         if test x$with_malloc_mempools = xyes; then
4987                 MALLOC_MEMPOOLS=yes
4988                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4989         fi
4993 DISABLE_MCS_DOCS=default
4994 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4995         if test x$with_mcs_docs != xyes; then
4996                 DISABLE_MCS_DOCS=yes
4997         fi
4999 if test -n "$INSTALL_4_x_TRUE"; then :
5000         DISABLE_MCS_DOCS=yes
5002 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5003    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5006 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)],[
5007         if test x$with_lazy_gc_thread_creation != xno ; then
5008                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5009         fi
5010 ], [with_lazy_gc_thread_creation=no])
5012 dnl *****************************
5013 dnl *** Thread suspend policy ***
5014 dnl *****************************
5016 dnl Set a default hybrid or cooperative suspend on some platforms
5018 dnl Coop default is set by the bitcode preset.
5020 dnl If coop isn't on by default, maybe hybrid should be?
5021 if test x$enable_cooperative_suspend_default != xyes; then
5022         case $HOST in
5023         X86 | AMD64)
5024                 dnl Some host/target confusion, there's no host_osx (and
5025                 dnl host_darwin would be true on iOS not just macOS).
5026                 if test x$target_osx = xyes; then
5027                         enable_hybrid_suspend_default=yes
5028                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5029                         enable_hybrid_suspend_default=yes
5030                 fi
5031                 ;;
5032         esac
5035 dnl Now check if there were flags overriding the defaults
5037 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])
5038 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5040 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5041         enable_cooperative_suspend=$with_cooperative_gc
5044 if test x$enable_cooperative_suspend = xdefault; then
5045         enable_cooperative_suspend=$enable_cooperative_suspend_default
5048 if test x$enable_cooperative_suspend != xno; then
5049         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5052 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5054 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])
5056 if test x$enable_hybrid_suspend = xdefault; then
5057    enable_hybrid_suspend=$enable_hybrid_suspend_default
5060 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5061         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5064 if test x$enable_hybrid_suspend != xno ; then
5065         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5068 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5070 dnl End of thread suspend policy
5072 dnl ***************************
5073 dnl *** feature experiments ***
5074 dnl ***************************
5076 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5077 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5079         if test x$enable_experiment != x ; then
5080                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5081         fi
5082         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5083                 eval "mono_experiment_test_enable_$feature='yes'"
5084         done
5086         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5087                 eval "mono_experiment_test_enable_null='yes'"
5088                 true
5089         fi
5091         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5092                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5093         fi
5094 ],[])
5096 dnl **********************
5097 dnl *** checked builds ***
5098 dnl **********************
5100 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],[
5102         if test x$enable_checked_build != x ; then
5103                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5104         fi
5105         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5106                 eval "mono_checked_build_test_enable_$feature='yes'"
5107         done
5109         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5110                 eval "mono_checked_build_test_enable_gc='yes'"
5111                 eval "mono_checked_build_test_enable_metadata='yes'"
5112                 eval "mono_checked_build_test_enable_thread='yes'"
5113                 eval "mono_checked_build_test_enable_private_types='yes'"
5114         fi
5116         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5117                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5118         fi
5120         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5121                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5122         fi
5124         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5125                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5126         fi
5128         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5129                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5130         fi
5131 ], [])
5133 dnl End of checked builds
5135 AC_CHECK_HEADER([malloc.h], 
5136                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5137                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5139 if test x"$GCC" = xyes; then
5140         # Implicit function declarations are not 64 bit safe
5141         # Do this late, since this causes lots of configure tests to fail
5142         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5143         # jay has a lot of implicit declarations
5144         JAY_CFLAGS="-Wno-implicit-function-declaration"
5147 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5148 # instead of libmono-static.a
5149 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5150    LIBMONO_LA=libmini-static.la
5151 else
5152    if test x$buildsgen = xyes; then
5153       LIBMONO_LA=libmonosgen-$API_VER.la
5154    else
5155       LIBMONO_LA=libmonoboehm-$API_VER.la
5156    fi
5158 AC_SUBST(LIBMONO_LA)
5160 dnl **************
5161 dnl ***  Btls  ***
5162 dnl **************
5164 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5165 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5166 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5168 if test "x$enable_btls" = "xno"; then
5169    enable_btls_lib=no
5172 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5174 btls_android=no
5175 if test "x$enable_btls" = "xyes"; then
5176         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5177         if test "x$CMAKE" = "xno"; then
5178                 AC_MSG_ERROR("cmake not found")
5179         fi
5181         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5182         AC_SUBST(BTLS_ROOT)
5184         btls_arch=
5185         btls_cflags=
5186         BTLS_CMAKE_ARGS=
5188         if test "x$host_win32" = "xyes"; then
5189                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5190         fi
5192         case "$BTLS_PLATFORM" in
5193         i386)
5194                 btls_arch=i386
5195                 btls_cflags="-m32"
5196                 case $host_os in
5197                         darwin*)
5198                                 btls_cflags="$btls_cflags -arch i386"
5199                                 ;;
5200                         mingw*|cygwin*)
5201                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5202                                 if test "x$HAVE_YASM" != "xyes"; then
5203                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5204                                 fi
5205                                 ;;
5206                 esac
5207                 ;;
5208         x86_64)
5209                 btls_arch=x86_64
5210                 case $host_os in
5211                         mingw*|cygwin*)
5212                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5213                                 if test "x$HAVE_YASM" != "xyes"; then
5214                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5215                                 fi
5216                                 ;;
5217                 esac
5218                 ;;
5219         arm)
5220                 btls_arch=arm
5221                 btls_cflags="-DOPENSSL_NO_ASM=1"
5222                 ;;
5223         armsoft)
5224                 btls_arch=arm
5225                 btls_cflags="-DOPENSSL_NO_ASM=1"
5226                 ;;
5227         aarch64)
5228                 btls_arch=aarch64
5229                 btls_cflags="-march=armv8-a+crypto"
5230                 ;;
5231         s390x)
5232                 btls_arch=s390x
5233                 ;;
5234         powerpc)
5235                 btls_arch=powerpc
5236                 case $host_os in
5237                         aix*|os400*)
5238                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5239                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5240                 esac
5241                 ;;
5242         android-armv5)
5243                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5244                 ;;
5245         android-armv6)
5246                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5247                 ;;
5248         android-armv7)
5249                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5250                 ;;
5251         android-v8a)
5252                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5253                 ;;
5254         android-x86)
5255                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5256                 ;;
5257         android-x64)
5258                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5259                 ;;
5260         *)
5261                 AC_MSG_ERROR(Invalid BTLS platform)
5262         esac
5264         if test "x$platform_android" = "xyes"; then
5265                 btls_android=yes
5266                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5267                 if test "x$with_btls_android_ndk" != "x"; then
5268                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5269                 else
5270                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5271                 fi
5272         fi
5274         if test "x$btls_arch" != "x"; then
5275                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5276         fi
5278         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5279         AC_SUBST(BTLS_ARCH)
5280         AC_SUBST(BTLS_CFLAGS)
5281         AC_SUBST(BTLS_PLATFORM)
5282         AC_SUBST(BTLS_CMAKE_ARGS)
5284         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5285 else
5286         enable_btls=no
5289 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5291 if test x$DISABLE_MCS_DOCS = xyes; then
5292    docs_dir=""
5293 else
5294    docs_dir=docs
5296 AC_SUBST(docs_dir)
5298 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5299 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5300 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5302 libmono_ldflags="$libmono_ldflags $LIBS"
5304 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5305 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5306 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5307 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5308 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5309 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5310 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5311 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5312 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5313 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5314 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5315 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5316 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5317 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5318 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5319 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5320 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5321 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5323 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5325 AC_SUBST(LIBC)
5326 AC_SUBST(INTL)
5327 AC_SUBST(SQLITE)
5328 AC_SUBST(SQLITE3)
5329 AC_SUBST(X11)
5330 AC_SUBST(GDKX11)
5331 AC_SUBST(GTKX11)
5332 AC_SUBST(XINERAMA)
5333 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5334 AC_SUBST(arch_target)
5335 AC_SUBST(CFLAGS)
5336 AC_SUBST(CPPFLAGS)
5337 AC_SUBST(LDFLAGS)
5339 #This must always be defined when building the runtime
5340 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5342 mono_build_root=`pwd`
5343 AC_SUBST(mono_build_root)
5345 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5346 if test x$host_win32 = xno; then
5347         if test x$enable_msvc = xyes; then
5348                 echo "Error, --enable-msvc only supported for Windows builds."
5349                 exit 1
5350         fi
5352 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5354 if test "x$enable_msvc" = "xyes"; then
5355         if test "x$support_boehm" = "xyes"; then
5356                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5357                 exit 1
5358         fi
5359         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5360         if test "x$host_cpu" = "xi686"; then
5361                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5362                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5363                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5364         else
5365                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5366                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5367                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5368         fi
5369         AC_SUBST(mono_msvc_build_dir)
5370         AC_SUBST(mono_msvc_build_lib_dir)
5371         AC_SUBST(mono_msvc_build_bin_dir)
5372 else
5373         mono_runtime=mono/mini/mono
5376 AC_SUBST(mono_runtime)
5378 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5380 if test $csc_compiler = mcs; then
5381   CSC=$mcs_topdir/class/lib/build/mcs.exe
5382 else
5383   CSC=$CSC_LOCATION
5386 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5388 mono_cfg_root=$mono_build_root/runtime
5389 if test x$host_win32 = xyes; then
5390   if test "x$cross_compiling" = "xno"; then
5391     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5392     CSC=`cygpath -m -a $CSC`
5393     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5394   else
5395     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5396   fi
5397 else
5398   mono_cfg_dir=$mono_cfg_root/etc
5400 AC_SUBST(mono_cfg_dir)
5402 AC_SUBST(CSC)
5404 AC_CONFIG_FILES([po/mcs/Makefile.in])
5406 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5407 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5409 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5410 [   depth=../../../..
5411     case $srcdir in
5412     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5413     .) reldir=$depth ;;
5414     *) reldir=$depth/$srcdir ;;
5415     esac
5416     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5417     cd runtime/etc/mono/1.0
5418     rm -f machine.config
5419     $LN_S $reldir/data/net_1_1/machine.config machine.config
5420     cd $depth
5421 ],[LN_S='$LN_S'])
5423 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5424 [   depth=../../../..
5425     case $srcdir in
5426     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5427     .) reldir=$depth ;;
5428     *) reldir=$depth/$srcdir ;;
5429     esac
5430     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5431     cd runtime/etc/mono/2.0
5432     rm -f machine.config
5433     $LN_S $reldir/data/net_2_0/machine.config machine.config
5434     cd $depth
5435 ],[LN_S='$LN_S'])
5437 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5438 [   depth=../../../..
5439     case $srcdir in
5440     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5441     .) reldir=$depth ;;
5442     *) reldir=$depth/$srcdir ;;
5443     esac
5444     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5445     cd runtime/etc/mono/2.0
5446     rm -f web.config
5447     $LN_S $reldir/data/net_2_0/web.config web.config
5448     cd $depth
5449 ],[LN_S='$LN_S'])
5451 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5452 [   depth=../../..
5453     case $srcdir in
5454     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5455     .) reldir=$depth ;;
5456     *) reldir=$depth/$srcdir ;;
5457     esac
5458     $ac_aux_dir/install-sh -d runtime/etc/mono/
5459     cd runtime/etc/mono/
5460     rm -f browscap.ini
5461     $LN_S $reldir/data/browscap.ini browscap.ini
5462     cd $depth
5463 ],[LN_S='$LN_S'])
5465 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5466 [   depth=../../../../..
5467     case $srcdir in
5468     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5469     .) reldir=$depth ;;
5470     *) reldir=$depth/$srcdir ;;
5471     esac
5472     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5473     cd runtime/etc/mono/2.0/Browsers
5474     rm -f Compat.browser
5475     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5476     cd $depth
5477 ],[LN_S='$LN_S'])
5479 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5480 [   depth=../../../../..
5481     case $srcdir in
5482     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5483     .) reldir=$depth ;;
5484     *) reldir=$depth/$srcdir ;;
5485     esac
5486     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5487     cd runtime/etc/mono/4.0/Browsers
5488     rm -f Compat.browser
5489     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5490     cd $depth
5491 ],[LN_S='$LN_S'])
5493 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5494 [   depth=../../../../..
5495     case $srcdir in
5496     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5497     .) reldir=$depth ;;
5498     *) reldir=$depth/$srcdir ;;
5499     esac
5500     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5501     cd runtime/etc/mono/4.5/Browsers
5502     rm -f Compat.browser
5503     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5504     cd $depth
5505 ],[LN_S='$LN_S'])
5507 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5508 [   depth=../../../..
5509     case $srcdir in
5510     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5511     .) reldir=$depth ;;
5512     *) reldir=$depth/$srcdir ;;
5513     esac
5514     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5515     cd runtime/etc/mono/4.0
5516     rm -f machine.config
5517     $LN_S $reldir/data/net_4_0/machine.config machine.config
5518     cd $depth
5519 ],[LN_S='$LN_S'])
5521 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5522 [   depth=../../../..
5523     case $srcdir in
5524     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5525     .) reldir=$depth ;;
5526     *) reldir=$depth/$srcdir ;;
5527     esac
5528     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5529     cd runtime/etc/mono/4.0
5530     rm -f web.config
5531     $LN_S $reldir/data/net_4_0/web.config web.config
5532     cd $depth
5533 ],[LN_S='$LN_S'])
5535 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5536 [   depth=../../../..
5537     case $srcdir in
5538     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5539     .) reldir=$depth ;;
5540     *) reldir=$depth/$srcdir ;;
5541     esac
5542     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5543     cd runtime/etc/mono/4.5
5544     rm -f machine.config
5545     $LN_S $reldir/data/net_4_5/machine.config machine.config
5546     cd $depth
5547 ],[LN_S='$LN_S'])
5549 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5550 [   depth=../../../..
5551     case $srcdir in
5552     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5553     .) reldir=$depth ;;
5554     *) reldir=$depth/$srcdir ;;
5555     esac
5556     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5557     cd runtime/etc/mono/4.5
5558     rm -f web.config
5559     $LN_S $reldir/data/net_4_5/web.config web.config
5560     cd $depth
5561 ],[LN_S='$LN_S'])
5563 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])
5564 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])
5565 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5567 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5568 if test x"$GCC" = xyes; then
5570         # incompatible-pointer-types requires gcc circa 5.x
5572         ORIG_CFLAGS=$CFLAGS
5573         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5574         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5575         AC_TRY_COMPILE([],[
5576         ], [
5577                 AC_MSG_RESULT(yes)
5578                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5579         ], [
5580                 AC_MSG_RESULT(no)
5581                 CFLAGS=$ORIG_CFLAGS
5582         ])
5586 # Mono.Native Support
5587 # -------------------
5588 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5589 # It is built as a stand-alone shared library and not bundled with the runtime because we
5590 # may need to build two different versions of it.
5592 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5593 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5595 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5596 # implementation accordingly.  We build a single `libmono_native` shared library.
5598 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5600 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5601 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5602 # depending on platform.
5604 # We build two versions of the shared library:
5605 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5606 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5608 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5609 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5610 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5612 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5613 # to verify that it's the correct version of it.
5616 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5617 if test x$target_osx = xyes; then
5618         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5619         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5620         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5621         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5622         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5623         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5624         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5625         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5626         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5628         mono_native=yes
5629         MONO_NATIVE_PLATFORM=macos
5630         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5631         AC_MSG_CHECKING([Mono.Native support])
5632         AC_MSG_RESULT(macos)
5634         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5635                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5637         if test x$mono_native_compat = xyes; then
5638                 mono_native_compat=yes
5639                 mono_native_text="Mac OSX (compat+unified)"
5640                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5641                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5642                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5643                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5644         else
5645                 mono_native_compat=no
5646                 mono_native_text="Mac OSX"
5647         fi
5648 elif test x$mono_native_platform_ios = xyes; then
5649         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5651         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5652                 if test x$mono_native_ios_sim = xyes; then
5653                         mono_native_ios_target=ios-simulator
5654                         mono_native_text="iOS Simulator"
5655                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5656                 else
5657                         mono_native_ios_target=iphoneos
5658                         mono_native_text="iOS Device"
5659                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5660                 fi
5661                 mono_native_unified_version="10.0"
5662                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5663         ], [
5664                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5665                         if test x$mono_native_ios_sim = xyes; then
5666                                 mono_native_ios_target=tvos-simulator
5667                                 mono_native_text="AppleTV Simulator"
5668                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5669                         else
5670                                 mono_native_ios_target=tvos
5671                                 mono_native_text="AppleTV Device"
5672                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5673                         fi
5674                         mono_native_unified_version="10.0"
5675                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5676                 ], [
5677                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5678                                 if test x$mono_native_ios_sim = xyes; then
5679                                         mono_native_ios_target=watchos-simulator
5680                                         mono_native_text="Apple Watch Simulator"
5681                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5682                                 else
5683                                         mono_native_ios_target=watchos
5684                                         mono_native_text="Apple Watch Device"
5685                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5686                                 fi
5687                                 mono_native_unified_version="5.0"
5688                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5689                         ], [
5690                                 AC_MSG_ERROR([Unknown iOS Target])
5691                         ])
5692                 ])
5693         ])
5695         AC_MSG_CHECKING([Mono.Native support])
5696         AC_MSG_RESULT([$mono_native_ios_target])
5698         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5700         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5701         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5703         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5705         if test x$with_bitcode = xyes; then
5706                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5707                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5708         else
5709                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
5710         fi
5712         if test x$enable_gss = xyes; then
5713                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
5714         fi
5716         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5717         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5718         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5719         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5720         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5721         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5723         if test x$mono_native_compat = xyes; then
5724                 mono_native_text="$mono_native_text (compat+unified)"
5725                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5726                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5727                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5728                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5729         fi
5731         mono_native=yes
5732         MONO_NATIVE_PLATFORM=ios
5733 elif test x$host_linux = xyes; then
5734         mono_native_text="Linux"
5735         MONO_NATIVE_CC=$CC
5736         MONO_NATIVE_CXX=$CXX
5737         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5738         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5739         MONO_NATIVE_CFLAGS=$CFLAGS
5740         MONO_NATIVE_LDFLAGS=$LDFLAGS
5742         mono_native=yes
5743         mono_native_compat=no
5744         MONO_NATIVE_PLATFORM=linux
5745         AC_MSG_CHECKING([Mono.Native support])
5746         AC_MSG_RESULT(linux)
5748         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5749 else
5750         mono_native=no
5751         mono_native_text="no"
5752         AC_MSG_CHECKING([Mono.Native support])
5753         AC_MSG_RESULT(no)
5756 if test x$mono_native_compat = xyes; then
5757         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5758 else
5759         MONO_NATIVE_LIBRARY_NAME=libmono-native
5762 AC_SUBST(MONO_NATIVE_PLATFORM)
5763 AC_SUBST(MONO_NATIVE_CC)
5764 AC_SUBST(MONO_NATIVE_CXX)
5765 AC_SUBST(MONO_NATIVE_CPPFLAGS)
5766 AC_SUBST(MONO_NATIVE_CXXFLAGS)
5767 AC_SUBST(MONO_NATIVE_CFLAGS)
5768 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
5769 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
5770 AC_SUBST(MONO_NATIVE_LDFLAGS)
5771 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
5772 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
5773 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
5774 AC_SUBST(MONO_NATIVE_LIBADD)
5776 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
5777 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
5778 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
5779 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
5780 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
5782 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
5783 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
5784 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
5785 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
5786 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
5788 # Update all submodules recursively to ensure everything is checked out
5789 (cd $srcdir && scripts/update_submodules.sh)
5791 AC_OUTPUT([
5792 Makefile
5793 mono-uninstalled.pc
5794 acceptance-tests/Makefile
5795 llvm/Makefile
5796 scripts/mono-find-provides
5797 scripts/mono-find-requires
5798 mk/Makefile
5799 mono/Makefile
5800 mono/btls/Makefile
5801 mono/native/Makefile
5802 mono/utils/Makefile
5803 mono/utils/jemalloc/Makefile
5804 mono/metadata/Makefile
5805 mono/dis/Makefile
5806 mono/cil/Makefile
5807 mono/arch/Makefile
5808 mono/arch/x86/Makefile
5809 mono/arch/amd64/Makefile
5810 mono/arch/ppc/Makefile
5811 mono/arch/sparc/Makefile
5812 mono/arch/s390x/Makefile
5813 mono/arch/arm/Makefile
5814 mono/arch/arm64/Makefile
5815 mono/arch/mips/Makefile
5816 mono/sgen/Makefile
5817 mono/native/platform-type.c
5818 mono/native/platform-type-compat.c
5819 mono/native/platform-type-unified.c
5820 mono/tests/Makefile
5821 mono/tests/assembly-load-reference/Makefile
5822 mono/tests/tests-config
5823 mono/tests/gc-descriptors/Makefile
5824 mono/tests/testing_gac/Makefile
5825 mono/unit-tests/Makefile
5826 mono/benchmark/Makefile
5827 mono/mini/Makefile
5828 mono/profiler/Makefile
5829 mono/eglib/Makefile
5830 mono/eglib/eglib-config.h
5831 mono/eglib/test/Makefile
5832 m4/Makefile
5833 ikvm-native/Makefile
5834 scripts/Makefile
5835 man/Makefile
5836 docs/Makefile
5837 data/Makefile
5838 data/net_2_0/Makefile
5839 data/net_4_0/Makefile
5840 data/net_4_5/Makefile
5841 data/net_2_0/Browsers/Makefile
5842 data/net_4_0/Browsers/Makefile
5843 data/net_4_5/Browsers/Makefile
5844 data/mint.pc
5845 data/mono-2.pc
5846 data/monosgen-2.pc
5847 data/mono.pc
5848 data/mono-cairo.pc
5849 data/mono-nunit.pc
5850 data/mono-options.pc
5851 data/mono-lineeditor.pc
5852 data/monodoc.pc
5853 data/dotnet.pc
5854 data/dotnet35.pc
5855 data/wcf.pc
5856 data/cecil.pc
5857 data/system.web.extensions_1.0.pc
5858 data/system.web.extensions.design_1.0.pc
5859 data/system.web.mvc.pc
5860 data/system.web.mvc2.pc
5861 data/system.web.mvc3.pc
5862 data/aspnetwebstack.pc
5863 data/reactive.pc
5864 samples/Makefile
5865 support/Makefile
5866 data/config
5867 tools/Makefile
5868 tools/locale-builder/Makefile
5869 tools/sgen/Makefile
5870 tools/monograph/Makefile
5871 tools/pedump/Makefile
5872 runtime/Makefile
5873 msvc/Makefile
5874 po/Makefile
5877 if test x$host_win32 = xyes; then
5878    # Get rid of 'cyg' prefixes in library names
5879    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5880    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5881    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5882    # executable doesn't work...
5883    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5886 if test x$host_darwin = xyes; then
5887    # This doesn't seem to be required and it slows down parallel builds
5888    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5892   case $prefix in
5893   NONE) prefix=$ac_default_prefix ;;
5894   esac
5895   case $exec_prefix in
5896   NONE) exec_prefix='${prefix}' ;;
5897   esac
5899   #
5900   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5901   # any existing config.make.  This allows people to share the same source tree
5902   # with different build directories, one native and one cross
5903   #
5904   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5906     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5908     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5909     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5910     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5911     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5912     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5913     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5914     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5915     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5916     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5918     case $INSTALL in
5919     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5920     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5921     esac
5923     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5925     export VERSION
5926     [myver=$($AWK 'BEGIN {
5927       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5928       if(length(vsplit [1]) > 4) {
5929         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5930       }
5931       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5932     }')]
5934     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5935     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5937     if test x$host_darwin = xyes; then
5938       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
5939       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
5940       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5941     elif test x$host_win32 = xyes; then
5942       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5943       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5944       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5945     elif test x$host_linux = xyes; then
5946       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5947       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5948       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5949     else
5950       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
5951       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5952       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5953     fi
5955     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5956       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5957     fi
5959         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5960            enable_system_aot=yes
5961         fi
5963     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5964       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5965     fi
5967     if test x$DISABLE_MCS_DOCS = xyes; then
5968       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5969     fi
5971     if test x$has_extension_module != xno; then
5972         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5973     fi
5974     
5975     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5976     
5977     if test "x$test_bcl_opt" = "xyes"; then    
5978       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5979     fi
5981     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5983     if test $csc_compiler = mcs; then
5984       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5985     fi
5987     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5988       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5989       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5990       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5991     fi
5993     if test "x$AOT_MODE" != "x" ; then
5994       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5995     fi
5997     if test "x$enable_btls" = "xyes"; then
5998       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5999     fi
6001     if test "x$mono_native" = "xyes"; then
6002       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6003     else
6004       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6005     fi
6007     if test x$mono_native_compat = xyes; then
6008       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6009     else
6010       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6011     fi
6013     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6014     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6016   fi
6020 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6022 btls_platform_string=
6023 if test x$enable_btls = xyes; then
6024         if test x$btls_android = xyes; then
6025                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6026         else
6027                 btls_platform_string=" ($BTLS_PLATFORM)"
6028         fi
6031 thread_suspend_msg=
6032 if test x$buildsgen = xyes; then
6033         if test x$enable_cooperative_suspend != xno; then
6034                 thread_suspend_msg="Suspend:       Cooperative"
6035         elif test x$enable_hybrid_suspend != xno; then
6036                 thread_suspend_msg="Suspend:       Hybrid"
6037         else
6038                 thread_suspend_msg="Suspend:       Preemptive"
6039         fi
6041         
6042 echo "
6043         mcs source:    $mcsdir
6044         C# Compiler:   $csc_compiler
6046    Engine:
6047         Host:          $host
6048         Target:        $target
6049         GC:            $gc_msg 
6050         $thread_suspend_msg
6051         TLS:           $with_tls
6052         SIGALTSTACK:   $with_sigaltstack
6053         Engine:        $jit_status
6054         BigArrays:     $enable_big_arrays
6055         DTrace:        $enable_dtrace
6056         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
6057         Spectre:       $spectre_mitigation_status
6058         Mono.Native:   $mono_native_text
6060    Libraries:
6061         .NET 4.x:        $with_profile4_x
6062         Xamarin.Android: $with_monodroid
6063         Xamarin.iOS:     $with_monotouch
6064         Xamarin.WatchOS: $with_monotouch_watch
6065         Xamarin.TVOS:    $with_monotouch_tv
6066         Xamarin.Mac:     $with_xammac
6067         Windows AOT:     $with_winaot
6068         Orbis:           $with_orbis
6069         Unreal:          $with_unreal
6070         WebAssembly:     $with_wasm
6071         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6072         JNI support:     $jdk_headers_found
6073         libgdiplus:      $libgdiplus_msg
6074         zlib:            $zlib_msg
6075         BTLS:            $enable_btls$btls_platform_string
6076         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6077         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6078         $disabled
6080 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6081    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)