Remove three seemingly unused functions:
[mono-project.git] / configure.ac
blob2a826657743545c13ac6466ff4cb5b81b88032a9
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 # This line is parsed by tools besides autoconf, such as msvc/mono.winconfig.targets.
5 # It should remain in the format they expect.
7 AC_INIT(mono, [6.5.0],
8         [https://github.com/mono/mono/issues/new])
10 AC_CONFIG_SRCDIR([README.md])
11 AC_CONFIG_MACRO_DIR([m4])
12 AC_CANONICAL_SYSTEM
13 AC_CANONICAL_HOST
15 # Gross hack to enable 'make dist' on automake 1.9+tar 1.14.
16 # The extra brackets are to foil regex-based scans.
17 m4_ifdef([_A][M_PROG_TAR],[_A][M_SET_OPTION([tar-ustar])])
19 AM_INIT_AUTOMAKE([1.9 dist-xz tar-ustar no-dist-gzip foreign subdir-objects]
20                  m4_esyscmd([case `automake --version | head -n 1` in    # parallel-tests is default in automake 1.13+, we need to explicitly enable it
21                              *1.11*|*1.12*) echo parallel-tests;;        # for 1.11 and 1.12 but not below as those versions don't recognize the flag
22                              esac]))                                     # TODO: remove this hack once we require automake 1.11+
24 AC_CONFIG_HEADERS([config.h])
25 AM_MAINTAINER_MODE
26 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test]))
27 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test-bundle]))
29 API_VER=2.0
30 AC_SUBST(API_VER)
32 AC_PROG_LN_S
34 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
36 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
37 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
38 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
41 # This is the version of the corlib-runtime interface. When
42 # making changes to this interface (by changing the layout
43 # of classes the runtime knows about, changing icall signature or
44 # semantics etc), change this variable.
46 # This must be unique relative to corlib interface and semantics.
48 # If you change corlib such that a runtime change is required, or
49 # vice versa, change this string. Examples include removing icalls,
50 # adding icalls, changing icall signatures, and changing type layouts
51 # that both sides know.
53 # It is an arbitrary string and should be parsed as such.
54 # A guid works and is encouraged.
56 # Generate it with uuidgen. For example:
57 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
59 # There is no ordering of corlib versions, no old or new,
60 # an exact match is required between corlib and runtime.
62 # This line is parsed by tools besides autoconf, such as msvc/mono.winconfig.targets.
63 # It should remain in the format they expect.
65 MONO_CORLIB_VERSION=62731146-81CF-4D61-826D-9A8DDED14432
68 # Put a quoted #define in config.h.
69 # Substitute @MONO_CORLIB_VERSION@ unquoted.
71 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,"$MONO_CORLIB_VERSION",[Version of the corlib-runtime interface])
72 AC_SUBST(MONO_CORLIB_VERSION)
74 case $host_os in
75 *cygwin* )
76                  echo "Run configure using ./configure --host=i686-w64-mingw32 or --host=x86_64-w64-mingw32"
77                  exit 1
78 esac
80 # In case of cygwin, override LN_S, irrespective of what it determines.
81 # The build uses cygwin, but the actual runtime doesn't.
82 case $host_os in
83 *cygwin* ) LN_S='cp -p';;
84 esac
87 # libgc defaults
89 libgc_configure_args=
91 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
92 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
93 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
94 CFLAGS_FOR_LIBGC=$CFLAGS
95 CPPFLAGS_FOR_BTLS=$CPPFLAGS
96 CFLAGS_FOR_BTLS=$CFLAGS
98 # libgc uses some deprecated APIs
99 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
102 # These are the flags that need to be stored in the mono.pc file for 
103 # compiling code that will embed Mono
105 libmono_cflags=""
106 libmono_ldflags=""
107 AC_SUBST(libmono_cflags)
108 AC_SUBST(libmono_ldflags)
110 # Variable to have relocatable .pc files (lib, or lib64)
111 # realpath isn't always available, and requires that all but the tip of the provided
112 # path exists. Fall back to the old behaviour, but realpath allows depth >1
113 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
114 # too deep for the old method to work
115 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
116 AC_SUBST(reloc_libdir)
118 # Set to yes if Unix sockets cannot be created in an anonymous namespace
119 need_link_unlink=no
121 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
122 extra_runtime_ldflags=""
124 # Thread configuration inspired by sleepycat's db
125 AC_MSG_CHECKING([host platform characteristics])
127 libgc_threads=no
128 has_dtrace=no
129 parallel_mark=yes
130 ikvm_native=yes
132 host_win32=no
133 target_win32=no
134 target_wasm=no
135 platform_android=no
136 platform_tizen=no
137 platform_ios=no
138 host_darwin=no
139 host_linux=no
141 case "$host" in
142         wasm32*)
143                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
144                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
145                 libdl="-ldl"
146                 libgc_threads=pthreads
147                 platform_wasm=yes
148                 ;;
149         *-mingw*|*-*-cygwin*)
150                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
151                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
152                 host_win32=yes
153                 mono_cv_clang=no
154                 if test "x$cross_compiling" = "xno"; then
155                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
156                                 target_win32=yes
157                         fi
158                 else
159                         if test "x$host" = "x$target"; then
160                                 target_win32=yes
161                         fi
162                 fi
163                 HOST_CC="gcc"
164                 RID="win-x86"
165                 CORETARGETS="-p:TargetsWindows=true"
166                 COREARCH="x86"
167                 # Boehm not supported on 64-bit Windows.
168                 case "$host" in
169                 x86_64-*-* | amd64-*-*)
170                         support_boehm=no
171                         with_gc=sgen
172                         RID="win-x64"
173                         COREARCH="x64"
174                         ;;
175                 esac
177                 # Windows 7 or later is required
178                 WIN32_CPPFLAGS="-DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
179                 CPPFLAGS="$CPPFLAGS $WIN32_CPPFLAGS"
180                 WIN32_LDFLAGS="-lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi -static-libgcc"
181                 LDFLAGS="$LDFLAGS $WIN32_LDFLAGS"
182                 libmono_cflags="-mms-bitfields -mwindows"
183                 libmono_ldflags="-mms-bitfields -mwindows"
184                 libdl=
185                 libgc_threads=win32
186                 with_sigaltstack=no
187                 with_tls=pthread
188                 with_sgen_default_concurrent=yes
189                 LN_S=cp
191                 # This forces libgc to use the DllMain based thread registration code on win32
192                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
193                 ;;
194         *-*-*netbsd*)
195                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
196                 libmono_cflags="-D_REENTRANT"
197                 LDFLAGS="$LDFLAGS -pthread"
198                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
199                 libmono_ldflags="-pthread"
200                 need_link_unlink=yes
201                 libdl="-ldl"
202                 libgc_threads=pthreads
203                 with_sigaltstack=no
204                 use_sigposix=yes
205                 with_sgen_default_concurrent=yes
206                 ;;
207         *-*-kfreebsd*-gnu)
208                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
209                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
210                 libmono_ldflags="-lpthread -pthread"
211                 libdl="-ldl"
212                 libgc_threads=pthreads
213                 need_link_unlink=yes
214                 with_sigaltstack=no
215                 use_sigposix=yes
216                 with_sgen_default_concurrent=yes
217                 ;;
218         *-*-*freebsd*)
219                 dnl For close_my_fds
220                 LDFLAGS="$LDFLAGS -lutil"
221                 if test "x$PTHREAD_CFLAGS" = "x"; then
222                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
223                         libmono_cflags=
224                 else
225                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
226                         libmono_cflags="$PTHREAD_CFLAGS"
227                 fi
228                 if test "x$PTHREAD_LIBS" = "x"; then
229                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
230                         libmono_ldflags="-pthread"
231                 else
232                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
233                         libmono_ldflags="$PTHREAD_LIBS"
234                 fi
235                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
236                 need_link_unlink=yes
237                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
238                 libdl=
239                 libgc_threads=pthreads
240                 use_sigposix=yes
241                 has_dtrace=yes
242                 case "$host" in
243                 aarch64-*)
244                         support_boehm=no
245                         with_gc=sgen
246                         ;;
247                 riscv*)
248                         support_boehm=no
249                         with_gc=sgen
250                         ;;
251                 esac
252                 with_sgen_default_concurrent=yes
253                 ;;
254         *-*-*openbsd*)
255                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
256                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
257                 if test "x$disable_munmap" != "xyes"; then
258                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
259                 fi
260                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
261                 LDFLAGS="$LDFLAGS -pthread"
262                 need_link_unlink=yes
263                 AC_DEFINE(PTHREAD_POINTER_ID)
264                 libdl=
265                 libgc_threads=pthreads
266                 with_tls=pthread
267                 with_sigaltstack=no
268                 use_sigposix=yes
269                 with_sgen_default_concurrent=yes
270                 ;;
271         *-*-linux-android*)
272                 platform_android=yes
273                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
274                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
276                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
277                 if test "x$disable_munmap" != "xyes"; then
278                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
279                 fi
280                 libmono_cflags="-D_REENTRANT"
281                 libdl="-ldl"
282                 libgc_threads=pthreads
283                 use_sigposix=yes
285                 with_tls=pthread
286                 with_sigaltstack=no
287                 with_static_mono=no
289                 # Android doesn't support boehm, as it's missing <link.h>
290                 support_boehm=no
291                 with_gc=sgen
293                 # isinf(3) requires -lm
294                 LDFLAGS="$LDFLAGS -lm"
296                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
297                 # PAGE_SIZE; breaks mono/io-layer/collection.c
298                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
299                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
300                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
302                 # to bypass the underscore linker check, can't work when cross-compiling
303                 mono_cv_uscore=yes
304                 mono_cv_clang=no
305                 ;;
306         *-*-linux*)
307                 host_linux=yes
308                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
309                 if test "x$disable_munmap" != "xyes"; then
310                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
311                 fi
312                 libmono_cflags="-D_REENTRANT"
313                 libdl="-ldl"
314                 libgc_threads=pthreads
315                 CORETARGETS="-p:TargetsUnix=true"
316                 use_sigposix=yes
317                 if test "x$cross_compiling" != "xno"; then
318                         # to bypass the underscore linker check, not
319                         # available during cross-compilation
320                         mono_cv_uscore=no
321                 fi
322                 case "$host" in
323                 *-tizen-linux-*)
324                         platform_tizen=yes
325                         ;;
326                 esac
327                 case "$host" in
328                 ppc64-*)
329                         RID="linux-ppc64"
330                         ;;
331                 ppc64le-*)
332                         RID="linux-ppc64el"
333                         ;;
334                 mipsel-*)
335                         RID="linux-mipsel"
336                         ;;
337                 x86-*)
338                         RID="linux-x86"
339                         COREARCH="x86"
340                         ;;
341                 x86_64-*)
342                         RID="linux-x64"
343                         COREARCH="x64"
344                         ;;
345                 arm-*)
346                         # deal with this in the FPU detection section, since
347                         # we cannot determine FPU from triplet and don't want
348                         # to duplicate the logic
349                         ;;
350                 aarch64-*)
351                         support_boehm=no
352                         with_gc=sgen
353                         RID="linux-arm64"
354                         COREARCH="arm64"
355                         ;;
356                 powerpc*-*-linux*)
357                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
358                         disable_munmap=yes
359                         ;;
360                 riscv*)
361                         support_boehm=no
362                         with_gc=sgen
363                         ;;
364                 esac
365                 with_sgen_default_concurrent=yes
366                 ;;
367         *-*-nacl*)
368                 echo "nacl no longer supported."
369                 exit 1
370                 ;;
371         *-*-hpux*)
372                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
373                 # +ESdbgasm only valid on bundled cc on RISC
374                 # silently ignored for ia64
375                 if test $GCC != "yes"; then
376                         CFLAGS="$CFLAGS +ESdbgasm"
377                         # Arrange for run-time dereferencing of null
378                         # pointers to produce a SIGSEGV signal.
379                         LDFLAGS="$LDFLAGS -z"
380                 fi
381                 CFLAGS="$CFLAGS +ESdbgasm"
382                 LDFLAGS="$LDFLAGS -z"
383                 libmono_cflags="-D_REENTRANT"
384                 libmono_ldflags="-lpthread"
385                 libgc_threads=pthreads
386                 need_link_unlink=yes
387                 use_sigposix=yes
388                 ;;
389         *-*-solaris*)
390                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
391                 need_link_unlink=yes
392                 libmono_cflags="-D_REENTRANT"
393                 libgc_threads=pthreads
394                 has_dtrace=yes
395                 use_sigposix=yes
396                 enable_solaris_tar_check=yes
397                 ;;
398         *-*-darwin*)
399                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
400                 host_darwin=yes
401                 target_mach=yes
402                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
403                 libmono_cflags="-D_THREAD_SAFE"
404                 need_link_unlink=yes
405                 AC_DEFINE(PTHREAD_POINTER_ID)
406                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
407                 CORETARGETS="-p:TargetsUnix=true -p:TargetsOSX=true"
408                 libdl=
409                 libgc_threads=pthreads
410                 has_dtrace=yes
411                 if test "x$cross_compiling" = "xyes"; then
412                         has_broken_apple_cpp=yes
413                 fi
414                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
415                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
416                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
417                 case "$host" in
418                         dnl Snow Leopard and newer config.guess reports as this
419                         i*86-*-darwin*)
420                                 BROKEN_DARWIN_FLAGS="-arch i386"
421                                 BROKEN_DARWIN_CPPFLAGS=""
422                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
423                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
424                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
425                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
426                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
427                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
428                                 with_sgen_default_concurrent=yes
429                                 RID="osx-x86"
430                                 COREARCH="x86"
431                                 ;;
432                         x*64-*-darwin*)
433                                 with_sgen_default_concurrent=yes
434                                 RID="osx-x64"
435                                 COREARCH="x64"
436                                 ;;
437                         arm*-darwin*)
438                                 platform_ios=yes
439                                 has_dtrace=no
440                                 ;;
441                         aarch64*-darwin*)
442                                 platform_ios=yes
443                                 ;;
444                 esac
445                 ;;
446         *-*-haiku*)
447                 dnl BSD_SOURCE is for getifaddrs
448                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
449                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
450                 libdl=
451                 LIBS="$LIBS -lnetwork -ltextencoding"
452                 need_link_unlink=yes
453                 AC_DEFINE(PTHREAD_POINTER_ID)
454                 dnl Haiku does not support static TLS with __thread
455                 with_tls=pthread
456                 libgc_threads=pthreads
457                 use_sigposix=yes
458                 with_sigaltstack=no
459                 ;;
460         *-*-fuchsia*)
461                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
462                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
463                 fuchsia=true
464                 with_tls=pthread
465                 with_sigaltstack=yes
466                 with_static_mono=no
467                 support_boehm=no
468                 with_gc=sgen
469                 mono_cv_uscore=yes
470                 mono_cv_clang=no
471                 ;;
472         *-*-aix*|*-*-os400*)
473                 dnl IMPORTANT: For svr4 sonames on AIX, you should set
474                 dnl `OBJECT_MODE=64` when configuring.
475                 dnl libtool cannot generate functioning svr4 sonames on
476                 dnl 64-bit without it.
477                 dnl Unfortunately, everything is complicated by the fact that
478                 dnl gcc doesn't respect this variable. (otherwise we could set
479                 dnl it for build time for configure and make)
480                 dnl On IBM i PASE using IBM's packages, GCC *does* respect this
481                 dnl variable, and builds are 64-bit by default. svr4 sonames
482                 dnl must still be specified when configuring on i, however.
483                 dnl As such, because Mono doesn't support 32-bit AIX or PASE,
484                 dnl set up a 64-bit build (assming GCC; XLC not supported)
485                 dnl regardless of what variable is used.
486                 case $host_os in
487                         aix*)
488                         if test "x$OBJECT_MODE" = "x64" && test "x$CC" = "x" && test "x$CXX" = "x"; then
489                                 dnl HACK: Set -maix64 at the GCC invocation
490                                 dnl level explicitly to work around the fact
491                                 dnl GCC in default maix32 mode explodes when
492                                 dnl binutils respects OBJECT_MODE.
493                                 dnl When that check occurs, flags are not
494                                 dnl passed to to the compiler, so GCC has no
495                                 dnl chance to change its mode.
496                                 dnl Otherwise, it may enter a state where it
497                                 dnl runs, but uses the libtool "compile"
498                                 dnl wrapper, which subtly breaks other things.
499                                 dnl This should propagate to all uses of CC.
500                                 dnl This is only set if not manually set.
501                                 CC="gcc -maix64"
502                                 CXX="g++ -maix64"
503                                 echo
504                         fi
505                         ;;
506                         dnl Not needed on i because it defaults to 64-bit and
507                         dnl has a GCC smart enough to respect OBJECT_MODE.
508                 esac
509                 dnl We still set this for *FLAGS, however, because we may not
510                 dnl be setting OBJECT_MODE.
511                 LDFLAGS="$LDFLAGS -maix64"
512                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
513                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
514                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
515                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
516                 dnl specifiy 64-bit mode for tools. (OBJECT_MODE is finicky with cmake.)
517                 dnl XXX: We should stop the hardcoding madness
518                 AR="/usr/bin/ar -X64"
519                 NM="/usr/bin/nm -X64"
520                 STRIP="/usr/bin/strip -X64"
521                 RANLIB="/usr/bin/ranlib -X64"
522                 dnl SGen is the future (changes to Boehm support code would be
523                 dnl required if you wish to re-enable Boehm)
524                 support_boehm=no
525                 with_gc=sgen
526                 need_link_unlink=yes
527                 use_sigposix=yes
528                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
529                 with_sigaltstack=no
530                 dnl use pthread TLS, __thread has issues with the compiler flags we use
531                 with_tls=pthread
532                 dnl ppc Linux is the same? test further
533                 disable_munmap=yes
534                 RID="aix-ppc64"
535                 CORETARGETS="-p:TargetsUnix=true"
536                 ;;
537         *)
538                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
539                 libdl="-ldl"
540                 ;;
541 esac
543 AC_MSG_RESULT(ok)
545 if test x$need_link_unlink = xyes; then
546    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
549 if test x$host_win32 = xyes; then
550    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
553 if test x$target_win32 = xyes; then
554    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
557 if test x$host_darwin = xyes; then
558    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
561 # Defined for all targets/platforms using classic Windows API support.
562 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
563 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
565 AC_SUBST(extra_runtime_ldflags)
566 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
567 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
568 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
569 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
570 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
571 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
572 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
573 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
574 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
576 if test -z "$HOST_DARWIN_TRUE"; then :
577 PLATFORM_AOT_SUFFIX=.dylib
578 PLATFORM_AOT_PREFIX=lib
581 if test -z "$HOST_LINUX_TRUE"; then :
582 PLATFORM_AOT_SUFFIX=.so
583 PLATFORM_AOT_PREFIX=lib
586 if test -z "$HOST_WIN32_TRUE"; then :
587 PLATFORM_AOT_SUFFIX=.dll
588 PLATFORM_AOT_PREFIX=
591 AC_SUBST(PLATFORM_AOT_SUFFIX)
592 AC_SUBST(PLATFORM_AOT_PREFIX)
594 if test -z "$HOST_WASM_TRUE"; then :
595 AC_DEFINE(HAVE_UTIME)
596 AC_DEFINE(HAVE_UTIMES)
599 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
601 AC_CHECK_TOOL(CC, gcc, gcc)
602 AC_PROG_CC
603 AC_CHECK_TOOL(CXX, g++, g++)
604 AC_PROG_CXX
605 AM_PROG_AS
606 AC_PROG_INSTALL
607 AC_PROG_AWK
608 AM_PROG_CC_C_O
609 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
610 : ${CCAS='$(CC)'}
611 # Set ASFLAGS if not already set.
612 : ${CCASFLAGS='$(CFLAGS)'}
613 AC_SUBST(CCAS)
614 AC_SUBST(CCASFLAGS)
616 if test "x$CXX" = "xno"; then
617         AC_MSG_ERROR([No c++ compiler found. You need to install a c++ compiler])
620 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
621 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
622 if test "x$CXX" = "xg++"; then
623         if test "x$GXX" != "xyes"; then
624                 # automake/libtool is so broken, it requires g++ even if the c++ sources
625                 # are inside automake conditionals
626                 AC_MSG_ERROR([You need to install g++])
627         fi
630 dnl may require a specific autoconf version
631 dnl AC_PROG_CC_FOR_BUILD
632 dnl CC_FOR_BUILD not automatically detected
633 CC_FOR_BUILD=$CC
634 CFLAGS_FOR_BUILD=$CFLAGS
635 BUILD_EXEEXT=
636 if test "x$cross_compiling" = "xyes"; then
637         CC_FOR_BUILD=cc
638         CFLAGS_FOR_BUILD=
639         BUILD_EXEEXT=""
641 AC_SUBST(CC_FOR_BUILD)
642 AC_SUBST(CFLAGS_FOR_BUILD)
643 AC_SUBST(HOST_CC)
644 AC_SUBST(BUILD_EXEEXT)
646 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
647 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
649 # Set STDC_HEADERS
650 AC_HEADER_STDC
651 AC_LIBTOOL_WIN32_DLL
652 # This causes monodis to not link correctly
653 #AC_DISABLE_FAST_INSTALL
655 #lookup makedev() header
656 AC_HEADER_MAJOR
658 AM_PROG_LIBTOOL
659 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
660 DOLT
662 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
663 AC_SUBST(export_ldflags)
665 # Test whenever ld supports -version-script
666 AC_PROG_LD
667 AC_PROG_LD_GNU
669 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)
670 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)
671 AC_CHECK_HEADER(unistd.h, [HAVE_UNISTD_H=1], [HAVE_UNISTD_H=0])
672 AC_SUBST(HAVE_UNISTD_H)
673 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
674                   [], [], [#include <stddef.h>
675                   #include <sys/socket.h>
676                   #include <linux/socket.h>])
678 AC_CHECK_HEADERS(sys/user.h, [], [],
680 #ifdef HAVE_SYS_PARAM_H
681 # include <sys/param.h>
682 #endif
685 AC_CHECK_HEADERS(linux/serial.h)
687 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
688 if test x$have_zlib = xyes; then
689    AC_TRY_COMPILE([#include <zlib.h>], [
690    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
691    #else
692    #error No good zlib found
693    #endif
694    ],[
695         AC_MSG_RESULT(Using system zlib)
696         zlib_msg="system zlib"
697         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
698    ],[
699         AC_MSG_RESULT(Using embedded zlib)
700         have_zlib=no
701         zlib_msg="bundled zlib"
702    ])
705 AC_ARG_WITH(static-zlib, [  --with-static-zlib=PATH    use the specified static zlib instead of -lz],[STATIC_ZLIB_PATH=$with_static_zlib],[STATIC_ZLIB_PATH=])
706 if test "x$STATIC_ZLIB_PATH" != "x"; then
707         have_static_zlib=yes
708         AC_SUBST(STATIC_ZLIB_PATH)
711 AM_CONDITIONAL(HAVE_STATIC_ZLIB, test x$have_static_zlib = xyes)
712 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
713 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
715 # for mono/metadata/debug-symfile.c
716 AC_CHECK_HEADERS(elf.h)
718 # for support
719 AC_CHECK_HEADERS(poll.h)
720 AC_CHECK_HEADERS(sys/poll.h)
721 AC_CHECK_HEADERS(sys/wait.h)
722 AC_CHECK_HEADERS(grp.h)
723 AC_CHECK_HEADERS(syslog.h)
724 AC_CHECK_FUNCS(vsyslog)
726 # for mono/dis
727 AC_CHECK_HEADERS(wchar.h)
729 # for Linux statfs support
730 AC_CHECK_HEADERS(linux/magic.h)
732 # For Android NDK unified headers
733 if test x$platform_android = xyes; then
734         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
735         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
736         AC_CHECK_HEADERS(android/ndk-version.h)
738         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
739         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
740         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
741         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
742         # doesn't contain the required definitions (NDK 14)
743         if test x$have_android_signal_inlines = xyes; then
744                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
745                 AC_COMPILE_IFELSE([
746                         AC_LANG_PROGRAM([#include <signal.h>
747                                 #include <android/legacy_signal_inlines.h>],[
748                                 int i;
749                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
750                                 }
751                         ])],[
752                                 AC_MSG_RESULT(yes)
753                                 android_sigrtminmax_work=yes
754                         ],[
755                                 AC_MSG_RESULT(no)
756                                 android_sigrtminmax_work=no
757                         ]
758                 )
760                 if test x$android_sigrtminmax_work = xno; then
761                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
762                 fi
763         fi
765         # Attempt to detect whether we're using Android NDK unified headers
766         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
767         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
769         android_unified_headers=no
770         if test x$have_android_api_level = xyes; then
771                 if test x$have_android_versioning = xyes; then
772                         AC_MSG_CHECKING([whether using Android NDK unified headers])
774                         # Both macros are defined only in the NDK unified headers
775                         AC_COMPILE_IFELSE([
776                                 AC_LANG_PROGRAM([
777                                         #include <android/api-level.h>
778                                         #include <android/versioning.h>
779                                 ],[
780                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
781                                         #else
782                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
783                                         #endif
784                                 ])],[
785                                         AC_MSG_RESULT(yes)
786                                         android_unified_headers=yes
787                                 ],[
788                                         AC_MSG_RESULT(no)
789                                         android_unified_headers=no
790                                 ]
791                         )
792                 fi
793         fi
795         if test x$android_unified_headers = xyes; then
796                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
797         fi
798 fi # Android
800 # not 64 bit clean in cross-compile
801 AC_CHECK_SIZEOF(void *)
802 AC_CHECK_SIZEOF(long)
804 AC_CHECK_SIZEOF(int)
805 AC_CHECK_SIZEOF(long long)
807 AC_CACHE_CHECK([for clang],
808         mono_cv_clang,[
809         AC_TRY_COMPILE([], [
810                 #ifdef __clang__
811                 #else
812                 #error "FAILED"
813                 #endif
814         ],
815         [mono_cv_clang=yes],
816         [mono_cv_clang=no],
817         [])
820 AC_ARG_ENABLE(visibility-hidden,
821 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
822    disable_visibility_hidden=yes, disable_visibility_hidden=no)
824 WARN=''
825 if test x"$GCC" = xyes; then
826                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
827                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
829                 # We require C99 with some GNU extensions, e.g. `linux` macro
830                 CFLAGS="$CFLAGS -std=gnu99"
832                 # The runtime code does not respect ANSI C strict aliasing rules
833                 CFLAGS="$CFLAGS -fno-strict-aliasing"
835                 # We rely on signed overflow to behave
836                 CFLAGS="$CFLAGS -fwrapv"
838                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
839                 if test x"$disable_visibility_hidden" = xno; then
840                    # Don't export any symbols by default
841                    SHARED_CFLAGS="-fvisibility=hidden"
842                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
843                 fi
845                 ORIG_CFLAGS=$CFLAGS
846                 # Check for the normal version, since gcc ignores unknown -Wno options
847                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
848                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
849                 AC_TRY_COMPILE([],[
850                 ], [
851                    AC_MSG_RESULT(yes)
852                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
853                 ], [
854                    AC_MSG_RESULT(no)
855                    CFLAGS=$ORIG_CFLAGS
856                 ])
858                 if test "x$mono_cv_clang" = "xyes"; then
859                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
860                    WARN="$WARN -Qunused-arguments"
861                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
862                    # We rely on zero length arrays in structs
863                    WARN="$WARN -Wno-zero-length-array"
864                 fi
865 else
866         # The Sun Forte compiler complains about inline functions that access static variables
867         # so disable all inlining.
868         case "$host" in
869         *-*-solaris*)
870                 CFLAGS="$CFLAGS -Dinline="
871                 ;;
872         esac
874 CFLAGS="$WARN $CFLAGS -g"
875 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
876 CPPFLAGS="$WARN $CPPFLAGS -g"
878 # Where's the 'mcs' source tree?
879 if test -d $srcdir/mcs; then
880   mcsdir=mcs
881 else
882   mcsdir=../mcs
885 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
886         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
887                 mcsdir=$with_mcs_path
888         fi
891 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
893 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
894 if test x$with_core = xonly; then
895     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
896     with_runtime_preset=netcore
898 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
901 # A sanity check to catch cases where the package was unpacked
902 # with an ancient tar program (Solaris)
904 AC_ARG_ENABLE(solaris-tar-check,
905 [  --disable-solaris-tar-check    disable solaris tar check],
906    do_solaris_tar_check=no, do_solaris_tar_check=yes)
908 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
909         AC_MSG_CHECKING(integrity of package)
910         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
911         then
912                 AC_MSG_RESULT(ok)
913         else
914                 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"
915                 AC_MSG_ERROR([$errorm])
916         fi
919 if test "x$with_mcs_path" != "x"; then
920 mcs_topdir=$(cd "$mcsdir" && pwd)
921 mcs_topdir_from_srcdir=$mcs_topdir
922 else
923 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
924 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
927 # Convert mcs_topdir* paths to Windows syntax.
928 if test x$cross_compiling$host_win32 = xnoyes; then
929   mcs_topdir=$(cygpath -m $mcs_topdir)
930   case $mcs_topdir_from_srcdir in
931     /cygdrive/*)
932         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
933         ;;
934   esac
937 AC_SUBST([mcs_topdir])
938 AC_SUBST([mcs_topdir_from_srcdir])
940 # gettext: prepare the translation directories. 
941 # we do not configure the full gettext, as we consume it dynamically from C#
942 AM_PO_SUBDIRS
944 if test "x$USE_NLS" = "xyes"; then
945    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
947    if test "x$HAVE_MSGFMT" = "xno"; then
948           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
949    fi
952 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
954 pkg_config_path=
955 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
956         if test x$with_crosspkgdir = "x"; then
957                 if test -s $PKG_CONFIG_PATH; then
958                         pkg_config_path=$PKG_CONFIG_PATH
959                 fi
960         else
961                 pkg_config_path=$with_crosspkgdir
962                 PKG_CONFIG_PATH=$pkg_config_path
963                 export PKG_CONFIG_PATH
964         fi
967 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
968 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
969 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
971 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
972 if test x$werror_flag = xyes; then
973         WERROR_CFLAGS="-Werror"
975 AC_SUBST([WERROR_CFLAGS])
976 AC_SUBST([SHARED_CFLAGS])
978 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
979   
980 AC_SUBST(GLIB_CFLAGS)
982 # Enable support for fast thread-local storage
983 # Some systems have broken support, so we allow to disable it.
984 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
986 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
987 # This does not work on some platforms (bug #55253)
988 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
990 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
991 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
992 # Same as --with-shared_mono=no
993 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
995 if test "x$enable_static" = "xno"; then
996    with_static_mono=no
999 if test "x$enable_shared" = "xno"; then
1000    with_shared_mono=no
1003 if test "x$enable_libraries" = "xno"; then
1004    with_shared_mono=no
1007 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
1009 if test "x$host_win32" = "xyes"; then
1010    # Boehm GC requires the runtime to be in its own dll
1011    with_static_mono=no
1014 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
1015 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
1016 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
1017 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
1019 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
1020 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
1021         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
1022         ORIG_CFLAGS=$CFLAGS
1023         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
1024         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
1025         AC_TRY_COMPILE([], [
1026         ], [
1027            AC_MSG_RESULT(yes)
1028            # Pass it to libgc as well
1029            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
1030         ], [
1031            AC_MSG_RESULT(no)
1032            CFLAGS=$ORIG_CFLAGS
1033         ])
1036 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
1038 if test x$enable_small_config = xyes; then
1039         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
1040         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
1043 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)
1045 DISABLED_FEATURES=none
1046 csc_compiler=default
1047 endian=unknown
1048 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
1049 AC_MSG_CHECKING([CSharp compiler to use])
1050 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
1051    if test x$withval = xmcs; then
1052        csc_compiler=mcs
1053    elif test x$withval = xroslyn; then
1054        csc_compiler=roslyn
1055    elif test x$withval = xdefault; then
1056        :
1057    else
1058        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
1059    fi
1060 ],[csc_compiler=default])
1062 if test $csc_compiler = default; then
1063    if test $endian = big; then
1064       csc_compiler=mcs
1065    elif test $endian = little; then
1066       case "$host" in
1067         powerpc*) csc_compiler=mcs ;;
1068         *) csc_compiler=roslyn ;;
1069       esac
1070    else
1071       csc_compiler=mcs
1072    fi
1074 AC_MSG_RESULT($csc_compiler)
1076 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
1077 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
1078 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])
1081 if test x$target_win32 = xyes; then
1082 with_jemalloc=no
1083 with_jemalloc_assert=no
1084 with_jemalloc_always=no
1087 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
1088 if test "x$with_jemalloc_assert" = "xyes"; then
1089 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
1090 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
1091 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
1094 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
1095 if test "x$with_jemalloc_always" = "xyes"; then
1096 with_jemalloc=yes
1097 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
1098 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
1099 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
1102 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
1103 if test "x$with_jemalloc" = "xyes"; then
1104 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
1105 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
1106 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
1108 if test "x$target_mach" = "xyes"; then
1109         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
1112 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
1113 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
1115 AC_SUBST(JEMALLOC_CFLAGS)
1116 AC_SUBST(JEMALLOC_CPPFLAGS)
1117 AC_SUBST(JEMALLOC_LDFLAGS)
1118 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
1121 # Terminology:
1122 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
1123 # MERP - The MS telemetry profile. Not for general use.
1124 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
1126 # 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.
1128 #--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.
1129 #--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.
1130 #--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.
1131 #--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.
1133 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])
1134 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])
1135 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1137 if test "x$with_crash_privacy" = "xyes"; then
1138 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1141 if test "x$with_structured_crashes" = "xno"; then
1142 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1145 case "$host" in
1146         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1147                 crash_reporting=no
1148                 ;;
1149 esac
1151 if test "x$crash_reporting" != "xyes"; then
1152 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1153 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1156 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1157 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1159 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1160 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1162 if test x$enable_monodroid = xyes; then
1163         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1166 if test x$enable_monotouch = xyes; then
1167         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1170 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1172 # mono/corefx/native has a lot of invalid C++98 in its headers
1173 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1174 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1175 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1176 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1178 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1179 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1180 # and add it whenever we're running clang on Darwin.
1181 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1182         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1185 AC_SUBST(CXXFLAGS_COMMON)
1187 if test "x$enable_cxx" = "xyes"; then
1189         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1191         # -std=gnu99 -xc++ is not allowed and errors.
1192         CXX_REMOVE_CFLAGS=-std=gnu99
1193         # These give warnings and should be removed. They are C-only.
1194         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1195         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1196         # Likewise with CentOS 6 gcc 4.4.
1197         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1199         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1200         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1201         # generates a warning every time we run gcc which is very unsightly.
1202         # The warning is for e.g. sprintf(foo, "") which can just be
1203         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1204         # and completely legal and valid.
1205         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1206         # Alternatively, just run $CXX -xc++ -c /dev/null.
1207         AC_LANG_PUSH(C++)
1208         ORIG_CXXFLAGS=$CXXFLAGS
1209         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1210         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1211         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1212                                  [ AC_MSG_RESULT(no)
1213                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1214         CXXFLAGS=$ORIG_CXXFLAGS
1215         AC_LANG_POP(C++)
1217 AC_SUBST(CXX_ADD_CFLAGS)
1218 AC_SUBST(CXX_REMOVE_CFLAGS)
1221 # Set the build profiles and options before things which use them
1224 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])
1225 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1226 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1227 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])
1228 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])
1229 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1230 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1231 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])
1232 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])
1233 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])
1234 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1235 AC_ARG_WITH(testing_winaot_interp,    [  --with-testing_winaot_interp=yes,no      If you want to build the Windows friendly AOT + Interpreter testing assemblies (defaults to no)], [], [with_testing_winaot_interp=default])
1236 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1237 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1238 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1241 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,winaot,winaotinterp,winaot_llvm,bitcode,bitcodeinterp,unreal,fullaotinterp,fullaotinterp_llvm  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1242 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])
1243 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])
1244 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])
1247 dnl Spectre compiler mitigation flag checks
1249 if test "x$with_spectre_mitigation" = "xyes"; then
1250    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1251    SPECTRE_CFLAGS=
1252    SPECTRE_INDIRECT_BRANCH_KIND=
1253    case "x$with_spectre_indirect_branch_choice" in
1254        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1255        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1256        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1257        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1258        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1259    esac
1261    SPECTRE_FUNCTION_RETURN_KIND=""
1262    case "x$with_spectre_function_return_choice" in
1263        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1264        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1265        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1266        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1267        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1268    esac
1270    AX_CHECK_COMPILE_FLAG(
1271         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1272         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1273    )
1275    AX_CHECK_COMPILE_FLAG(
1276         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1277         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1278    )
1280    if test "x$SPECTRE_CFLAGS" != "x" ; then
1281         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1282         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1283         spectre_mitigation_status="mitigation enabled"
1284    fi
1285 else
1286         spectre_mitigation_status="no mitigation"
1290 dnl Profile defaults
1292 TEST_PROFILE=default
1293 enable_llvm_default=no
1295 with_profile4_x_default=no
1296 with_monodroid_default=no
1297 with_monotouch_default=no
1298 with_monotouch_watch_default=no
1299 with_monotouch_tv_default=no
1300 with_xammac_default=no
1301 with_testing_aot_full_interp_default=no
1302 with_testing_aot_hybrid_default=no
1303 with_testing_aot_full_default=no
1304 with_winaot_default=no
1305 with_testing_winaot_interp_default=no
1306 with_orbis_default=no
1307 with_unreal_default=no
1308 with_wasm_default=no
1310 with_bitcode_default=no
1311 enable_cooperative_suspend_default=no
1312 enable_hybrid_suspend_default=no
1313 enable_copy_stack_data_default=yes
1315 # For the sake of clearer error messages, these numbers should all be different from each other.
1316 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4400,nftnptr-arg-trampolines=4000
1318 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1320 MONO_LLVM_PATH_OPTION=llvm-path="`pwd`/llvm/usr/bin"
1322 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1323    DISABLE_MCS_DOCS_default=yes
1324 elif test x$with_runtime_preset = xnetcore; then
1325    DISABLE_MCS_DOCS_default=yes
1326    BTLS_SUPPORTED=no
1327    enable_mcs_build=no
1328    enable_support_build=no
1330    mono_feature_disable_remoting='yes'
1331    mono_feature_disable_reflection_emit_save='yes'
1332    mono_feature_disable_appdomains='yes'
1333    mono_feature_disable_cleanup='yes'
1334    mono_feature_disable_assembly_remapping='yes'
1335    disable_mono_native=yes
1336    support_boehm=no
1337 elif test x$with_runtime_preset = xnet_4_x; then
1338    with_profile4_x_default=yes
1339    TEST_PROFILE=net_4_x
1340 elif test x$with_runtime_preset = xall; then
1341    with_profile4_x_default=yes
1342    with_monodroid_default=yes
1343    with_monotouch_default=yes
1344    with_monotouch_watch_default=yes
1345    with_monotouch_tv_default=yes
1346    with_xammac_default=yes
1347    with_winaot_default=yes
1348    with_testing_winaot_interp_default=yes
1349    with_orbis_default=yes
1350    with_unreal_default=yes
1351    with_wasm_default=yes
1352    with_testing_aot_full_interp_default=yes
1353    with_testing_aot_hybrid_default=yes
1354    with_testing_aot_full_default=yes
1355    TEST_PROFILE=net_4_x
1356 elif test x$with_runtime_preset = xbitcode; then
1357    DISABLE_MCS_DOCS_default=yes
1358    with_testing_aot_full_default=yes
1359    with_bitcode_default=yes
1360    enable_cooperative_suspend_default=yes
1361    # FIXME: use TEST_PROFILE=testing_aot_full
1362    TEST_PROFILE=testing_aot_bitcode
1363    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1364    enable_llvm_default=yes
1366    mono_feature_disable_com='yes'
1367    mono_feature_disable_remoting='yes'
1368    mono_feature_disable_reflection_emit_save='yes'
1369    mono_feature_disable_reflection_emit='yes'
1370    mono_feature_disable_appdomains='yes'
1372    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1373    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1374    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1375    AOT_MODE="llvmonly"
1376 elif test x$with_runtime_preset = xbitcodeinterp; then
1377    with_testing_aot_full_interp_default=yes
1378    with_bitcode_default=yes
1379    enable_cooperative_suspend_default=yes
1380    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1381    TEST_PROFILE=testing_aot_bitcode_interp
1382    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1383    enable_llvm_default=yes
1385    # mscorlib.dll aot compilation crashes
1386    mono_feature_disable_com='yes'
1388    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1389    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1390    AOT_RUN_FLAGS="--llvmonly-interp"
1391 elif test x$with_runtime_preset = xfullaot; then
1392    DISABLE_MCS_DOCS_default=yes
1393    with_testing_aot_full_default=yes
1394    TEST_PROFILE=testing_aot_full
1396    mono_feature_disable_com='yes'
1397    mono_feature_disable_remoting='yes'
1398    mono_feature_disable_reflection_emit_save='yes'
1399    mono_feature_disable_reflection_emit='yes'
1400    mono_feature_disable_appdomains='yes'
1402    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1403    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1404    AOT_MODE="full"
1405 elif test x$with_runtime_preset = xfullaot_llvm; then
1406    DISABLE_MCS_DOCS_default=yes
1407    with_testing_aot_full_default=yes
1408    TEST_PROFILE=testing_aot_full
1410    mono_feature_disable_com='yes'
1411    mono_feature_disable_remoting='yes'
1412    mono_feature_disable_reflection_emit_save='yes'
1413    mono_feature_disable_reflection_emit='yes'
1414    mono_feature_disable_appdomains='yes'
1416    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1417    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1418    AOT_MODE="full"
1419 elif test x$with_runtime_preset = xhybridaot; then
1420    DISABLE_MCS_DOCS_default=yes
1421    with_testing_aot_hybrid_default=yes
1422    TEST_PROFILE=testing_aot_hybrid 
1424    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1425    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1426 elif test x$with_runtime_preset = xhybridaot_llvm; then
1427    DISABLE_MCS_DOCS_default=yes
1428    with_testing_aot_hybrid_default=yes
1429    TEST_PROFILE=testing_aot_hybrid
1431    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1432    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1433 elif test x$with_runtime_preset = xfullaotinterp; then
1434    with_testing_aot_full_interp_default=yes
1435    TEST_PROFILE=testing_aot_full_interp
1437    # mscorlib.dll aot compilation crashes
1438    mono_feature_disable_com='yes'
1440    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1441    AOT_RUN_FLAGS="--full-aot-interp"
1442 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1443    with_testing_aot_full_interp_default=yes
1444    TEST_PROFILE=testing_aot_full_interp
1446    # mscorlib.dll aot compilation crashes
1447    mono_feature_disable_com='yes'
1449    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1450    AOT_RUN_FLAGS="--full-aot-interp"
1451 elif test x$with_runtime_preset = xaot; then
1452    with_profile4_x_default=yes
1454    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1455    AOT_RUN_FLAGS=""
1457    DISABLE_MCS_DOCS_default=yes
1458 elif test x$with_runtime_preset = xaot_llvm; then
1459    with_profile4_x_default=yes
1461    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1462    AOT_RUN_FLAGS=""
1464    DISABLE_MCS_DOCS_default=yes
1465 elif test x$with_runtime_preset = xwinaot; then
1466    DISABLE_MCS_DOCS_default=yes
1467    with_winaot_default=yes
1468    TEST_PROFILE=winaot
1470    mono_feature_disable_com='yes'
1471    mono_feature_disable_remoting='yes'
1472    mono_feature_disable_reflection_emit_save='yes'
1473    mono_feature_disable_reflection_emit='yes'
1474    mono_feature_disable_appdomains='yes'
1476    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1477    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1478    AOT_MODE="full"
1479 elif test x$with_runtime_preset = xwinaotinterp; then
1480    DISABLE_MCS_DOCS_default=yes
1481    with_testing_winaot_interp_default=yes
1482    TEST_PROFILE=testing_winaot_interp
1484    mono_feature_disable_com='yes'
1485    mono_feature_disable_remoting='yes'
1486    mono_feature_disable_appdomains='yes'
1488    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1489    AOT_RUN_FLAGS="--full-aot-interp"
1490 elif test x$with_runtime_preset = xwinaot_llvm; then
1491    DISABLE_MCS_DOCS_default=yes
1492    with_winaot_default=yes
1493    TEST_PROFILE=winaot
1495    mono_feature_disable_com='yes'
1496    mono_feature_disable_remoting='yes'
1497    mono_feature_disable_reflection_emit_save='yes'
1498    mono_feature_disable_reflection_emit='yes'
1499    mono_feature_disable_appdomains='yes'
1501    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1502    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1503    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1504    AOT_MODE="full"
1505 elif test x$with_runtime_preset = xorbis; then
1506    DISABLE_MCS_DOCS_default=yes
1507    with_orbis_default=yes
1508    TEST_PROFILE=orbis
1510    mono_feature_disable_com='yes'
1511    mono_feature_disable_remoting='yes'
1512    mono_feature_disable_reflection_emit_save='yes'
1513    mono_feature_disable_reflection_emit='yes'
1514    mono_feature_disable_appdomains='yes'
1516    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1517    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1518    AOT_MODE="full"
1519 elif test x$with_runtime_preset = xunreal; then
1520    DISABLE_MCS_DOCS_default=yes
1521    with_unreal_default=yes
1522    TEST_PROFILE=unreal
1524    mono_feature_disable_com='yes'
1525    mono_feature_disable_remoting='yes'
1526    mono_feature_disable_appdomains='no'
1528    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1529    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1530 elif test x$with_runtime_preset = xwasm; then
1531    DISABLE_MCS_DOCS_default=yes
1532    with_wasm_default=yes
1533    TEST_PROFILE=wasm
1535    mono_feature_disable_com='yes'
1536    mono_feature_disable_remoting='yes'
1537    mono_feature_disable_reflection_emit_save='yes'
1538    mono_feature_disable_reflection_emit='yes'
1539    mono_feature_disable_appdomains='yes'
1541    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1542    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1543 else
1544    TEST_PROFILE=net_4_x
1545    with_profile4_x_default=yes
1548 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1549    AC_SUBST(AOT_BUILD_FLAGS)
1550    AC_SUBST(AOT_RUN_FLAGS)
1551    # For llvmonlycheck + fullaotcheck
1552    AC_SUBST(INVARIANT_AOT_OPTIONS)
1555 AC_SUBST(TEST_PROFILE)
1557 if test "x$with_profile4_x" = "xdefault"; then
1558    with_profile4_x=$with_profile4_x_default
1560 if test "x$with_monodroid" = "xdefault"; then
1561    with_monodroid=$with_monodroid_default
1563 if test "x$with_monotouch" = "xdefault"; then
1564    with_monotouch=$with_monotouch_default
1566 if test "x$with_monotouch_watch" = "xdefault"; then
1567    with_monotouch_watch=$with_monotouch_watch_default
1569 if test "x$with_monotouch_tv" = "xdefault"; then
1570    with_monotouch_tv=$with_monotouch_tv_default
1572 if test "x$with_bitcode" = "xdefault"; then
1573    with_bitcode=$with_bitcode_default
1575 if test "x$with_xammac" = "xdefault"; then
1576    with_xammac=$with_xammac_default
1578 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1579    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1581 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1582    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1584 if test "x$with_testing_aot_full" = "xdefault"; then
1585    with_testing_aot_full=$with_testing_aot_full_default
1587 if test "x$with_winaot" = "xdefault"; then
1588    with_winaot=$with_winaot_default
1590 if test "x$with_testing_winaot_interp" = "xdefault"; then
1591    with_testing_winaot_interp=$with_testing_winaot_interp_default
1593 if test "x$with_orbis" = "xdefault"; then
1594    with_orbis=$with_orbis_default
1596 if test "x$with_unreal" = "xdefault"; then
1597    with_unreal=$with_unreal_default
1599 if test "x$with_wasm" = "xdefault"; then
1600    with_wasm=$with_wasm_default
1604 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1605 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1606 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1607 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1608 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1609 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1610 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1611 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1612 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1613 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1614 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1615 AM_CONDITIONAL(INSTALL_TESTING_WINAOT_INTERP, [test "x$with_testing_winaot_interp" != "xno"])
1616 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1617 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1618 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1619 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1621 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1622 AM_CONDITIONAL(FULL_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full"] || [test "x$TEST_PROFILE" = "xtesting_aot_bitcode"] || [test "x$TEST_PROFILE" = "xwinaot"] || [test "x$TEST_PROFILE" = "xorbis"] || [test "x$TEST_PROFILE" = "xwasm"])
1623 AM_CONDITIONAL(FULL_AOT_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"] || [test "x$TEST_PROFILE" = "xtesting_aot_bitcode_interp"] || [test "x$TEST_PROFILE" == "xtesting_winaot_interp"])
1624 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1626 default_profile=net_4_x
1627 if test -z "$INSTALL_MONODROID_TRUE"; then :
1628    default_profile=monodroid
1630 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1631    default_profile=monotouch
1633 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1634    default_profile=xammac
1636 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1637    default_profile=testing_aot_full_interp
1639 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1640    default_profile=testing_aot_hybrid
1642 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1643    default_profile=testing_aot_full
1645 if test -z "$INSTALL_WINAOT_TRUE"; then :
1646    default_profile=winaot
1648 if test -z "$INSTALL_TESTING_WINAOT_INTERP_TRUE"; then :
1649    default_profile=testing_winaot_interp
1651 if test -z "$INSTALL_ORBIS_TRUE"; then :
1652    default_profile=orbis
1654 if test -z "$INSTALL_UNREAL_TRUE"; then :
1655    default_profile=unreal
1657 if test -z "$INSTALL_WASM_TRUE"; then :
1658    default_profile=wasm
1660 if test -z "$INSTALL_4_x_TRUE"; then :
1661    default_profile=net_4_x
1663 DEFAULT_PROFILE=$default_profile
1664 AC_SUBST(DEFAULT_PROFILE)
1667 # End build profile configuration
1670 if test x$USE_NLS = xprofile_default; then
1672         AC_MSG_CHECKING([NLS used])
1674         # We make the default value for USE_NLS
1675         # "no" on OSX because it isn't available on most
1676         # default OSX installs. The most common configurations will
1677         # all disable it, so this saves us typing.
1678         if test x$host_darwin = xyes; then
1679                 USE_NLS=no;
1680         else
1681                 USE_NLS=yes;
1682         fi
1684         AC_SUBST([USE_NLS])
1685         AC_MSG_RESULT([$USE_NLS])
1688 AC_ARG_ENABLE(static-gcc-libs, [  --enable-static-gcc-libs      Statically link GCC support libs (for MinGW32)])
1689 if test "x$enable_static_gcc_libs" = "xyes"; then
1690         # llvm/build.mk doesn't use automake, so make a regular make variable for it.
1691         AC_SUBST(STATIC_GCC_LIBS,1)
1693 AM_CONDITIONAL(ENABLE_STATIC_GCC_LIBS, test "x$enable_static_gcc_libs" = "xyes")
1695 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1696      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1697      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1698          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1700         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1701                 eval "mono_feature_disable_$feature='yes'"
1702         done
1703         DISABLED_FEATURES=$enable_minimal
1704         disabled="Disabled:      $enable_minimal"
1705 ],[])
1707 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1709 if test "x$mono_feature_disable_aot" = "xyes"; then
1710         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1711         enable_system_aot=no
1712         AC_MSG_NOTICE([Disabled AOT compiler])
1715 if test "x$mono_feature_disable_profiler" = "xyes"; then
1716         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1717         AC_MSG_NOTICE([Disabled support for the profiler])
1719 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1721 if test "x$mono_feature_disable_decimal" = "xyes"; then
1722         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1723         AC_MSG_NOTICE([Disabled support for decimal])
1726 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1727         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1728         AC_MSG_NOTICE([Disabled support for P/Invoke])
1731 if test "x$mono_feature_disable_debug" = "xyes"; then
1732         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1733         AC_MSG_NOTICE([Disabled support for runtime debugging])
1736 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1737         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1738         mono_feature_disable_reflection_emit_save=yes
1739         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1742 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1743         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1744         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1747 if test "x$mono_feature_disable_large_code" = "xyes"; then
1748         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1749         AC_MSG_NOTICE([Disabled support for large assemblies])
1752 if test "x$mono_feature_disable_logging" = "xyes"; then
1753         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1754         AC_MSG_NOTICE([Disabled support for logging])
1757 if test "x$mono_feature_disable_com" = "xyes"; then
1758         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1759         AC_MSG_NOTICE([Disabled COM support])
1762 if test "x$mono_feature_disable_ssa" = "xyes"; then
1763         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1764         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1767 if test "x$mono_feature_disable_generics" = "xyes"; then
1768         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1769         AC_MSG_NOTICE([Disabled Generics Support])
1772 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1773         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1774         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1777 if test "x$mono_feature_disable_portability" = "xyes"; then
1778         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1779         AC_MSG_NOTICE([Disabled IO Portability layer])
1782 if test "x$mono_feature_disable_attach" = "xyes"; then
1783         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1784         AC_MSG_NOTICE([Disabled agent attach])
1787 if test "x$mono_feature_disable_verifier" = "xyes"; then
1788         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1789         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1792 if test "x$mono_feature_disable_jit" = "xyes"; then
1793         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1794         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1797 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1799 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1800         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1801         AC_MSG_NOTICE([Disabled the interpreter])
1804 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1806 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1807         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1810 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1812 if test "x$mono_feature_disable_simd" = "xyes"; then
1813         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1814         AC_MSG_NOTICE([Disabled SIMD support])
1817 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1818         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1819         AC_MSG_NOTICE([Disabled Soft Debugger.])
1822 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1824 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1825         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1826         AC_MSG_NOTICE([Disabled Performance Counters.])
1828 if test "x$mono_feature_disable_normalization" = "xyes"; then
1829         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1830         AC_MSG_NOTICE([Disabled String normalization support.])
1833 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1834 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1835         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1836         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1839 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1840         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1841         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1844 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1845         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1846         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1849 if test "x$mono_feature_disable_remoting" = "xyes"; then
1850         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1851         AC_MSG_NOTICE([Disabled remoting])
1854 if test "x$mono_feature_disable_security" = "xyes"; then
1855         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1856         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1859 if test "x$mono_feature_disable_lldb" = "xyes"; then
1860         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1861         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1864 if test "x$mono_feature_disable_mdb" = "xyes"; then
1865         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1866         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1869 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1870         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1871         AC_MSG_NOTICE([Disabled assertion messages.])
1874 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1875         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1876         AC_MSG_NOTICE([Disabled runtime cleanup.])
1879 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1880         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1881         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1885 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1886         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1887         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1890 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1891         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1892         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1895 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1896         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1897         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1900 if test "x$mono_feature_disable_sockets" = "xyes"; then
1901         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1902         AC_MSG_NOTICE([Disabled sockets])
1905 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1906 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1908 has_extension_module=no
1909 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1911         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1912                 if test x$extension = xdefault ; then
1913                         has_extension_module=yes;
1914                 fi
1915         done
1916         if test x$enable_extension_module = xyes; then
1917                 has_extension_module=yes;
1918         fi
1919 ], [])
1921 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1923 if test x$has_extension_module != xno ; then
1924         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1925         AC_MSG_NOTICE([Enabling mono extension module.])
1928 # Deprecated
1929 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1931 AC_MSG_CHECKING(for visibility __attribute__)
1932 AC_COMPILE_IFELSE([
1933         AC_LANG_SOURCE([[
1934                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1935                 int main () { doit (); return 0; }
1936         ]])
1937 ], [
1938    have_visibility_hidden=yes
1939    AC_MSG_RESULT(yes)
1940 ], [
1941    have_visibility_hidden=no
1942    AC_MSG_RESULT(no)
1946 dnl Boehm GC configuration
1949 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1951 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1952 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1954 if test "x$support_boehm" = "xyes"; then
1956         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1957         if test x$enable_parallel_mark = xyes; then
1958                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1959         fi
1961         gc_msg=""
1962         LIBGC_CPPFLAGS=
1963         LIBGC_LIBS=
1964         LIBGC_STATIC_LIBS=
1965         libgc_dir=
1966         case "x$libgc" in
1967                 xincluded)
1968                         if test "x$support_boehm" = "xyes"; then
1969                                 libgc_dir=libgc
1970                         fi
1972                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1973                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1974                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1976                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1978                         if test x$target_win32 = xyes; then
1979                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1980                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1981                         fi
1983                         gc_msg="Included Boehm GC with typed GC"
1984                         if test x$enable_parallel_mark = xyes; then
1985                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1986                                 gc_msg="$gc_msg and parallel mark"
1987                         else
1988                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1989                         fi
1990                         ;;
1992                 xboehm|xbohem|xyes)
1993                         AC_MSG_WARN("External Boehm is no longer supported")
1994                         ;;
1996                 xsgen)
1997                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1998                         ;;
2000                 xnone)
2001                         AC_MSG_WARN("Compiling mono without GC.")
2002                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
2003                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
2004                         gc_msg="none"
2005                         ;;
2006                 *)
2007                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
2008                         ;;
2009         esac
2011         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])
2012         if test "x$large_heap" = "xyes"; then
2013            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
2014         fi
2016         AC_SUBST(LIBGC_CPPFLAGS)
2017         AC_SUBST(LIBGC_LIBS)
2018         AC_SUBST(LIBGC_STATIC_LIBS)
2019         AC_SUBST(libgc_dir)
2020         AC_SUBST(BOEHM_DEFINES)
2023 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
2026 dnl End of Boehm GC Configuration
2029 dnl *************************************
2030 dnl *** Checks for zero length arrays ***
2031 dnl *************************************
2032 AC_MSG_CHECKING(whether $CC supports zero length arrays)
2033 AC_TRY_COMPILE([
2034         struct s {
2035                 int  length;
2036                 char data [0];
2037         };
2038 ], [], [
2039         AC_MSG_RESULT(yes)
2040         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
2041 ], [
2042         AC_MSG_RESULT(no)
2043         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
2046 dnl ***********************************
2047 dnl *** Checks for signals
2048 dnl ***********************************
2049 AC_CHECK_HEADERS(signal.h)
2050 AC_CHECK_FUNCS(sigaction)
2051 AC_CHECK_FUNCS(kill)
2052 AC_CHECK_FUNCS(signal)
2054 # signal() is declared inline in Android headers
2055 # so we need to workaround it by overriding the check.
2056 if test x$platform_android = xyes; then
2057         AC_DEFINE(HAVE_SIGNAL,1)
2060 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
2061 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
2063 if test x$host_win32 = xno; then
2064         dnl *************************************
2065         dnl *** Checks for time capabilities ***
2066         dnl *************************************
2068         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
2069         AC_TRY_COMPILE([#include <time.h>], [
2070                 const int foo = CLOCK_MONOTONIC;
2071         ],[
2072                 AC_MSG_RESULT(yes)
2073                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
2074         ], [
2075                 AC_MSG_RESULT(no)
2076         ])
2078         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
2079         AC_TRY_COMPILE([#include <time.h>], [
2080                 const int foo = CLOCK_MONOTONIC_COARSE;
2081         ],[
2082                 AC_MSG_RESULT(yes)
2083                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
2084         ], [
2085                 AC_MSG_RESULT(no)
2086         ])
2088         AC_MSG_CHECKING(for CLOCK_REALTIME)
2089         AC_TRY_COMPILE([#include <time.h>], [
2090                 const int foo = CLOCK_REALTIME;
2091         ],[
2092                 AC_MSG_RESULT(yes)
2093                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
2094         ], [
2095                 AC_MSG_RESULT(no)
2096         ])
2098         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
2099         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
2100         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
2101         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
2102         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
2103         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
2105         dnl hires monotonic clock support
2106         AC_SEARCH_LIBS(clock_gettime, rt)
2107         AC_CHECK_FUNCS(clock_nanosleep)
2109         dnl dynamic loader support
2110         AC_CHECK_FUNC(dlopen, DL_LIB="",
2111                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
2112         )
2113         if test x$dl_support = xno; then
2114                 AC_MSG_WARN([No dynamic loading support available])
2115         else
2116                 LIBS="$LIBS $DL_LIB"
2117                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
2118                 dnl from glib's configure.ac
2119                 AC_CACHE_CHECK([for preceeding underscore in symbols],
2120                         mono_cv_uscore,[
2121                         AC_TRY_RUN([#include <dlfcn.h>
2122                         int mono_underscore_test (void) { return 42; }
2123                         int main() {
2124                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
2125                           handle = dlopen ((void*)0, 0);
2126                           if (handle) {
2127                             f1 = dlsym (handle, "mono_underscore_test");
2128                             f2 = dlsym (handle, "_mono_underscore_test");
2129                           } return (!f2 || f1);
2130                         }],
2131                                 [mono_cv_uscore=yes],
2132                                 [mono_cv_uscore=no],
2133                         [])
2134                 ])
2135                 if test "x$mono_cv_uscore" = "xyes"; then
2136                         MONO_DL_NEED_USCORE=1
2137                 else
2138                         MONO_DL_NEED_USCORE=0
2139                 fi
2140                 AC_SUBST(MONO_DL_NEED_USCORE)
2141                 AC_CHECK_FUNC(dlerror)
2142         fi
2144         dnl ******************************************************************
2145         dnl *** Checks for the IKVM JNI interface library                  ***
2146         dnl ******************************************************************
2147         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])
2149         ikvm_native_dir=
2150         if test x$with_ikvm_native = xyes; then
2151                 ikvm_native_dir=ikvm-native
2152                 jdk_headers_found="IKVM Native"
2153         fi
2155         AC_SUBST(ikvm_native_dir)
2157         AC_CHECK_HEADERS(execinfo.h)
2159         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2161         AC_CHECK_FUNCS(getgrgid_r)
2162         AC_CHECK_FUNCS(getgrnam_r)
2163         AC_CHECK_FUNCS(getresuid)
2164         AC_CHECK_FUNCS(setresuid)
2165         AC_CHECK_FUNCS(kqueue)
2166         AC_CHECK_FUNCS(backtrace_symbols)
2167         AC_CHECK_FUNCS(mkstemp)
2168         AC_CHECK_FUNCS(mmap)
2169         AC_CHECK_FUNCS(madvise)
2170         AC_CHECK_FUNCS(getrusage)
2171         AC_CHECK_FUNCS(getpriority)
2172         AC_CHECK_FUNCS(setpriority)
2173         AC_CHECK_FUNCS(dl_iterate_phdr)
2174         AC_CHECK_FUNCS(dladdr)
2175         AC_CHECK_FUNCS(sysconf)
2176         AC_CHECK_FUNCS(getrlimit)
2177         AC_CHECK_FUNCS(prctl)
2178         AC_CHECK_FUNCS(arc4random)
2179         AC_CHECK_FUNCS(nl_langinfo)
2181         AC_CHECK_FUNCS(sched_getaffinity)
2182         AC_CHECK_FUNCS(sched_setaffinity)
2183         AC_CHECK_FUNCS(sched_getcpu)
2185         if test x$platform_android != xyes; then
2186                 AC_CHECK_FUNCS(getpwnam_r)
2187                 AC_CHECK_FUNCS(getpwuid_r)
2188         fi
2190         AC_CHECK_FUNCS(readlink)
2191         AC_CHECK_FUNCS(chmod)
2192         AC_CHECK_FUNCS(lstat)
2193         AC_CHECK_FUNCS(getdtablesize)
2195         AC_CHECK_FUNCS(ftruncate)
2196         AC_CHECK_FUNCS(msync)
2198         AC_CHECK_FUNCS(gethostname getpeername)
2199         AC_CHECK_FUNCS(utime utimes)
2201         AC_CHECK_FUNCS(openlog closelog)
2202         AC_CHECK_FUNCS(atexit)
2203         AC_CHECK_FUNCS(popen)
2205         AC_FUNC_STRERROR_R()
2207         dnl ****************************************************************
2208         dnl *** Check for sched_setaffinity from glibc versions before   ***
2209         dnl *** 2.3.4. The older versions of the function only take 2    ***
2210         dnl *** parameters, not 3.                                       ***
2211         dnl ***                                                          ***
2212         dnl *** Because the interface change was not made in a minor     ***
2213         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2214         dnl *** won't always indicate the interface sched_affinity has.  ***
2215         dnl ****************************************************************
2216         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2217         AC_TRY_COMPILE([#include <sched.h>], [
2218             int mask = 1; 
2219             sched_setaffinity(0, &mask);
2220         ], [
2221                 # Yes, we have it...
2222                 AC_MSG_RESULT(yes)
2223                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2224         ], [
2225                 # We have the new, three-parameter version
2226                 AC_MSG_RESULT(no)
2227         ])
2228         AC_TRY_COMPILE([#include <sched.h>], [
2229              CPU_COUNT((void *) 0);
2230         ], [
2231                 AC_MSG_RESULT(yes)
2232                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2233         ], [
2234                 # We have the new, three-parameter version
2235                 AC_MSG_RESULT(no)
2236         ])
2238         dnl ******************************************************************
2239         dnl *** Check for large file support                               ***
2240         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2241         dnl ******************************************************************
2242         
2243         # Check that off_t can represent 2**63 - 1 correctly, working around
2244         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2245         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2246         large_offt=no
2247         AC_DEFUN([LARGE_FILES], [
2248                 large_CPPFLAGS=$CPPFLAGS
2249                 CPPFLAGS="$CPPFLAGS $1"
2250                 AC_TRY_COMPILE([
2251                         #include <sys/types.h>
2252                         #include <limits.h>
2253                 ], [
2254                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2255                         #define COMPILE_TIME_ASSERT(pred) \
2256                                 switch(0){case 0:case pred:;}
2257                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2258                 ], [
2259                         AC_MSG_RESULT(ok)
2260                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2261                         large_CPPFLAGS="$large_CPPFLAGS $1"
2262                         large_offt=yes
2263                 ], [
2264                         AC_MSG_RESULT(no)
2265                 ])
2266                 CPPFLAGS=$large_CPPFLAGS
2267         ])
2269         AC_MSG_CHECKING(if off_t is 64 bits wide)
2270         LARGE_FILES("")
2271         if test $large_offt = no; then
2272                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2273                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2274         fi
2275         if test $large_offt = no; then
2276                 AC_MSG_WARN([No 64 bit file size support available])
2277         fi
2278         
2279         dnl *****************************
2280         dnl *** Checks for libsocket  ***
2281         dnl *****************************
2282         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2284         case "$host" in
2285                 *-*-*freebsd*)
2286                         dnl *****************************
2287                         dnl *** Checks for libinotify ***
2288                         dnl *****************************
2289                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2290         esac
2292         dnl *******************************
2293         dnl *** Checks for MSG_NOSIGNAL ***
2294         dnl *******************************
2295         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2296         AC_TRY_COMPILE([#include <sys/socket.h>], [
2297                 int f = MSG_NOSIGNAL;
2298         ], [
2299                 # Yes, we have it...
2300                 AC_MSG_RESULT(yes)
2301                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2302         ], [
2303                 # We'll have to use signals
2304                 AC_MSG_RESULT(no)
2305         ])
2307         dnl *****************************
2308         dnl *** Checks for IPPROTO_IP ***
2309         dnl *****************************
2310         AC_MSG_CHECKING(for IPPROTO_IP)
2311         AC_TRY_COMPILE([#include <netinet/in.h>], [
2312                 int level = IPPROTO_IP;
2313         ], [
2314                 # Yes, we have it...
2315                 AC_MSG_RESULT(yes)
2316                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2317         ], [
2318                 # We'll have to use getprotobyname
2319                 AC_MSG_RESULT(no)
2320         ])
2322         dnl *******************************
2323         dnl *** Checks for IPPROTO_IPV6 ***
2324         dnl *******************************
2325         AC_MSG_CHECKING(for IPPROTO_IPV6)
2326         AC_TRY_COMPILE([#include <netinet/in.h>], [
2327                 int level = IPPROTO_IPV6;
2328         ], [
2329                 # Yes, we have it...
2330                 AC_MSG_RESULT(yes)
2331                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2332         ], [
2333                 # We'll have to use getprotobyname
2334                 AC_MSG_RESULT(no)
2335         ])
2337         dnl ******************************
2338         dnl *** Checks for IPPROTO_TCP ***
2339         dnl ******************************
2340         AC_MSG_CHECKING(for IPPROTO_TCP)
2341         AC_TRY_COMPILE([#include <netinet/in.h>], [
2342                 int level = IPPROTO_TCP;
2343         ], [
2344                 # Yes, we have it...
2345                 AC_MSG_RESULT(yes)
2346                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2347         ], [
2348                 # We'll have to use getprotobyname
2349                 AC_MSG_RESULT(no)
2350         ])
2352         dnl *****************************
2353         dnl *** Checks for SOL_IP     ***
2354         dnl *****************************
2355         AC_MSG_CHECKING(for SOL_IP)
2356         AC_TRY_COMPILE([#include <netdb.h>], [
2357                 int level = SOL_IP;
2358         ], [
2359                 # Yes, we have it...
2360                 AC_MSG_RESULT(yes)
2361                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2362         ], [
2363                 # We'll have to use getprotobyname
2364                 AC_MSG_RESULT(no)
2365         ])
2367         dnl *****************************
2368         dnl *** Checks for SOL_IPV6     ***
2369         dnl *****************************
2370         AC_MSG_CHECKING(for SOL_IPV6)
2371         AC_TRY_COMPILE([#include <netdb.h>], [
2372                 int level = SOL_IPV6;
2373         ], [
2374                 # Yes, we have it...
2375                 AC_MSG_RESULT(yes)
2376                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2377         ], [
2378                 # We'll have to use getprotobyname
2379                 AC_MSG_RESULT(no)
2380         ])
2382         dnl *****************************
2383         dnl *** Checks for SOL_TCP    ***
2384         dnl *****************************
2385         AC_MSG_CHECKING(for SOL_TCP)
2386         AC_TRY_COMPILE([#include <netdb.h>], [
2387                 int level = SOL_TCP;
2388         ], [
2389                 # Yes, we have it...
2390                 AC_MSG_RESULT(yes)
2391                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2392         ], [
2393                 # We'll have to use getprotobyname
2394                 AC_MSG_RESULT(no)
2395         ])
2397         dnl *****************************
2398         dnl *** Checks for IP_PKTINFO ***
2399         dnl *****************************
2400         AC_MSG_CHECKING(for IP_PKTINFO)
2401         AC_TRY_COMPILE([#include <linux/in.h>], [
2402                 int level = IP_PKTINFO;
2403         ], [
2404                 # Yes, we have it...
2405                 AC_MSG_RESULT(yes)
2406                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2407         ], [
2408                 AC_MSG_RESULT(no)
2409         ])
2411         dnl *****************************
2412         dnl *** Checks for IPV6_PKTINFO ***
2413         dnl *****************************
2414         AC_MSG_CHECKING(for IPV6_PKTINFO)
2415         AC_TRY_COMPILE([#include <netdb.h>], [
2416                 int level = IPV6_PKTINFO;
2417         ], [
2418                 # Yes, we have it...
2419                 AC_MSG_RESULT(yes)
2420                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2421         ], [
2422                 AC_MSG_RESULT(no)
2423         ])
2425         dnl **********************************
2426         dnl *** Checks for IP_DONTFRAG     ***
2427         dnl **********************************
2428         AC_MSG_CHECKING(for IP_DONTFRAG)
2429         AC_TRY_COMPILE([#include <netinet/in.h>], [
2430                 int level = IP_DONTFRAG;
2431         ], [
2432                 # Yes, we have it...
2433                 AC_MSG_RESULT(yes)
2434                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2435         ], [
2436                 AC_MSG_RESULT(no)
2437         ])
2439         dnl **********************************
2440         dnl *** Checks for IP_DONTFRAGMENT ***
2441         dnl **********************************
2442         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2443         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2444                 int level = IP_DONTFRAGMENT;
2445         ], [
2446                 # Yes, we have it...
2447                 AC_MSG_RESULT(yes)
2448                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2449         ], [
2450                 AC_MSG_RESULT(no)
2451         ])
2453         dnl **********************************
2454         dnl *** Checks for IP_MTU_DISCOVER ***
2455         dnl **********************************
2456         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2457         AC_TRY_COMPILE([#include <linux/in.h>], [
2458                 int level = IP_MTU_DISCOVER;
2459         ], [
2460                 # Yes, we have it...
2461                 AC_MSG_RESULT(yes)
2462                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2463         ], [
2464                 AC_MSG_RESULT(no)
2465         ])
2467         dnl **********************************
2468         dnl *** Checks for  IP_PMTUDISC_DO ***
2469         dnl **********************************
2470         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2471         AC_TRY_COMPILE([#include <linux/in.h>], [
2472                 int level = IP_PMTUDISC_DO;
2473         ], [
2474                 # Yes, we have it...
2475                 AC_MSG_RESULT(yes)
2476                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2477         ], [
2478                 AC_MSG_RESULT(no)
2479         ])
2481         dnl *********************************
2482         dnl *** Check for struct ip_mreqn ***
2483         dnl *********************************
2484         AC_MSG_CHECKING(for struct ip_mreqn)
2485         AC_TRY_COMPILE([#include <netinet/in.h>], [
2486                 struct ip_mreqn mreq;
2487                 mreq.imr_address.s_addr = 0;
2488         ], [
2489                 # Yes, we have it...
2490                 AC_MSG_RESULT(yes)
2491                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2492         ], [
2493                 # We'll just have to try and use struct ip_mreq
2494                 AC_MSG_RESULT(no)
2495                 AC_MSG_CHECKING(for struct ip_mreq)
2496                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2497                         struct ip_mreq mreq;
2498                         mreq.imr_interface.s_addr = 0;
2499                 ], [
2500                         # Yes, we have it...
2501                         AC_MSG_RESULT(yes)
2502                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2503                 ], [
2504                         # No multicast support
2505                         AC_MSG_RESULT(no)
2506                 ])
2507         ])
2508         
2509         dnl **********************************
2510         dnl *** Check for getaddrinfo ***
2511         dnl **********************************
2512         AC_MSG_CHECKING(for getaddrinfo)
2513                 AC_TRY_LINK([
2514                 #include <stdio.h>
2515                 #include <netdb.h>
2516         ], [
2517                 getaddrinfo(NULL,NULL,NULL,NULL);
2518         ], [
2519                 # Yes, we have it...
2520                 AC_MSG_RESULT(yes)
2521                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2522         ], [
2523                 AC_MSG_RESULT(no)
2524         ])
2526         dnl **********************************
2527         dnl *** Check for gethostbyname2_r ***
2528         dnl **********************************
2529         AC_MSG_CHECKING(for gethostbyname2_r)
2530                 AC_TRY_LINK([
2531                 #include <stdio.h>
2532                 #include <netdb.h>
2533         ], [
2535                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2536         ], [
2537                 # Yes, we have it...
2538                 AC_MSG_RESULT(yes)
2539                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2540         ], [
2541                 AC_MSG_RESULT(no)
2542         ])
2544         dnl **********************************
2545         dnl *** Check for gethostbyname2 ***
2546         dnl **********************************
2547         AC_MSG_CHECKING(for gethostbyname2)
2548                 AC_TRY_LINK([
2549                 #include <stdio.h>
2550                 #include <netdb.h>
2551         ], [
2552                 gethostbyname2(NULL,0);
2553         ], [
2554                 # Yes, we have it...
2555                 AC_MSG_RESULT(yes)
2556                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2557         ], [
2558                 AC_MSG_RESULT(no)
2559         ])
2561         dnl **********************************
2562         dnl *** Check for gethostbyname ***
2563         dnl **********************************
2564         AC_MSG_CHECKING(for gethostbyname)
2565                 AC_TRY_LINK([
2566                 #include <stdio.h>
2567                 #include <netdb.h>
2568         ], [
2569                 gethostbyname(NULL);
2570         ], [
2571                 # Yes, we have it...
2572                 AC_MSG_RESULT(yes)
2573                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2574         ], [
2575                 AC_MSG_RESULT(no)
2576         ])
2578         dnl **********************************
2579         dnl *** Check for getprotobyname ***
2580         dnl **********************************
2581         AC_MSG_CHECKING(for getprotobyname)
2582                 AC_TRY_LINK([
2583                 #include <stdio.h>
2584                 #include <netdb.h>
2585         ], [
2586                 getprotobyname(NULL);
2587         ], [
2588                 # Yes, we have it...
2589                 AC_MSG_RESULT(yes)
2590                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2591         ], [
2592                 AC_MSG_RESULT(no)
2593         ])
2595         dnl **********************************
2596         dnl *** Check for getprotobyname_r ***
2597         dnl **********************************
2598         AC_MSG_CHECKING(for getprotobyname_r)
2599                 AC_TRY_LINK([
2600                 #include <stdio.h>
2601                 #include <netdb.h>
2602         ], [
2603                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2604         ], [
2605                 # Yes, we have it...
2606                 AC_MSG_RESULT(yes)
2607                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2608         ], [
2609                 AC_MSG_RESULT(no)
2610         ])
2612         dnl **********************************
2613         dnl *** Check for getnameinfo ***
2614         dnl **********************************
2615         AC_MSG_CHECKING(for getnameinfo)
2616                 AC_TRY_LINK([
2617                 #include <stdio.h>
2618                 #include <netdb.h>
2619         ], [
2620                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2621         ], [
2622                 # Yes, we have it...
2623                 AC_MSG_RESULT(yes)
2624                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2625         ], [
2626                 AC_MSG_RESULT(no)
2627         ])
2630         dnl **********************************
2631         dnl *** Check for inet_ntop ***
2632         dnl **********************************
2633         AC_MSG_CHECKING(for inet_ntop)
2634                 AC_TRY_LINK([
2635                 #include <stdio.h>
2636                 #include <arpa/inet.h>
2637         ], [
2638                 inet_ntop (0, NULL, NULL, 0);
2639         ], [
2640                 # Yes, we have it...
2641                 AC_MSG_RESULT(yes)
2642                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2643         ], [
2644                 AC_MSG_RESULT(no)
2645         ])
2647         dnl *****************************
2648         dnl *** Checks for libnsl     ***
2649         dnl *****************************
2650         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2652         AC_CHECK_FUNCS(inet_pton inet_aton)
2654         dnl *****************************
2655         dnl *** Checks for libxnet    ***
2656         dnl *****************************
2657         case "${host}" in
2658                 *solaris* )
2659                         AC_MSG_CHECKING(for Solaris XPG4 support)
2660                         if test -f /usr/lib/libxnet.so; then
2661                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2662                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2663                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2664                                 LIBS="$LIBS -lxnet"
2665                                 AC_MSG_RESULT(yes)
2666                         else
2667                                 AC_MSG_RESULT(no)
2668                         fi
2670                         if test "$GCC" = "yes"; then
2671                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2672                         fi
2673                 ;;
2674         esac
2676         dnl *****************************
2677         dnl *** Checks for libpthread ***
2678         dnl *****************************
2679 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2680 # and libpthread does not exist
2682         case "${host}" in
2683                 *-*-*haiku*)
2684                         dnl Haiku has pthread in libroot (libc equiv)
2685                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2686                 ;;
2687                 *-*-*freebsd*)
2688                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2689                 ;;
2690                 *-*-*openbsd*)
2691                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2692                 ;;
2693                 *)
2694                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2695                 ;;
2696         esac
2697         AC_CHECK_HEADERS(pthread.h)
2698         AC_CHECK_HEADERS(pthread_np.h)
2699         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2700         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2701         AC_CHECK_FUNCS(pthread_kill)
2702         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2703         AC_TRY_COMPILE([ #include <pthread.h>], [
2704                 pthread_mutexattr_t attr;
2705                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2706         ], [
2707                 AC_MSG_RESULT(ok)
2708         ], [
2709                 AC_MSG_RESULT(no)
2710                 AC_ERROR(Posix system lacks support for recursive mutexes)
2711         ])
2712         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2713         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2714         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2715         dnl check that pthread_mutexattr_setprotocol is declared
2716         AC_CHECK_DECLS([pthread_mutexattr_setprotocol], [], [], [[#include <pthread.h>]])
2717         AC_CHECK_FUNCS(mincore mlock munlock)
2719         dnl ***********************************
2720         dnl *** Checks for working __thread ***
2721         dnl ***********************************
2722         AC_MSG_CHECKING(for working __thread)
2723         if test "x$with_tls" != "x__thread"; then
2724                 AC_MSG_RESULT(disabled)
2725         elif test "x$cross_compiling" = "xyes"; then
2726                 AC_MSG_RESULT(cross compiling, assuming yes)
2727         else
2728                 AC_TRY_RUN([
2729                         #if defined(__APPLE__) && defined(__clang__)
2730                         #error "__thread does not currently work with clang on Mac OS X"
2731                         #endif
2732                         
2733                         #include <unistd.h>
2734                         #include <pthread.h>
2735                         __thread int i;
2736                         static int res1, res2;
2738                         void thread_main (void *arg)
2739                         {
2740                                 i = arg;
2741                                 sleep (1);
2742                                 if (arg == 1)
2743                                         res1 = (i == arg);
2744                                 else
2745                                         res2 = (i == arg);
2746                         }
2748                         int main () {
2749                                 pthread_t t1, t2;
2751                                 i = 5;
2753                                 pthread_create (&t1, NULL, thread_main, 1);
2754                                 pthread_create (&t2, NULL, thread_main, 2);
2756                                 pthread_join (t1, NULL);
2757                                 pthread_join (t2, NULL);
2759                                 return !(res1 + res2 == 2);
2760                         }
2761                 ], [
2762                                 AC_MSG_RESULT(yes)
2763                 ], [
2764                                 AC_MSG_RESULT(no)
2765                                 with_tls=pthread
2766                 ])
2767         fi
2769         dnl **************************************
2770         dnl *** Checks for working sigaltstack ***
2771         dnl **************************************
2772         AC_MSG_CHECKING(for working sigaltstack)
2773         if test "x$with_sigaltstack" != "xyes"; then
2774                 AC_MSG_RESULT(disabled)
2775         elif test "x$cross_compiling" = "xyes"; then
2776                 AC_MSG_RESULT(cross compiling, assuming no)
2777                 with_sigaltstack=no
2778         else
2779                 AC_TRY_RUN([
2780                         #include <stdio.h>
2781                         #include <stdlib.h>
2782                         #include <unistd.h>
2783                         #include <signal.h>
2784                         #include <pthread.h>
2785                         #include <sys/wait.h>
2786                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2787                         #define SA_STACK SA_ONSTACK
2788                         #endif
2789                         static void
2790                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2791                         {
2792                                 exit (0);
2793                         }
2795                         volatile char*__ptr = NULL;
2796                         static void *
2797                         loop (void *ignored)
2798                         {
2799                                 *__ptr = 0;
2800                                 return NULL;
2801                         }
2803                         static void
2804                         child ()
2805                         {
2806                                 struct sigaction sa;
2807                                 stack_t sas;
2808                                 pthread_t id;
2809                                 pthread_attr_t attr;
2811                                 sa.sa_sigaction = sigsegv_signal_handler;
2812                                 sigemptyset (&sa.sa_mask);
2813                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2814                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2815                                         perror ("sigaction");
2816                                         return;
2817                                 }
2819                                 /* x86 darwin deliver segfaults using SIGBUS */
2820                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2821                                         perror ("sigaction");
2822                                         return;
2823                                 }
2824                                 sas.ss_sp = malloc (SIGSTKSZ);
2825                                 sas.ss_size = SIGSTKSZ;
2826                                 sas.ss_flags = 0;
2827                                 if (sigaltstack (&sas, NULL) == -1) {
2828                                         perror ("sigaltstack");
2829                                         return;
2830                                 }
2832                                 pthread_attr_init (&attr);
2833                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2834                                         printf ("pthread_create\n");
2835                                         return;
2836                                 }
2838                                 sleep (100);
2839                         }
2841                         int
2842                         main ()
2843                         {
2844                                 pid_t son;
2845                                 int status;
2846                                 int i;
2848                                 son = fork ();
2849                                 if (son == -1) {
2850                                         return 1;
2851                                 }
2853                                 if (son == 0) {
2854                                         child ();
2855                                         return 0;
2856                                 }
2858                                 for (i = 0; i < 300; ++i) {
2859                                         waitpid (son, &status, WNOHANG);
2860                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2861                                                 return 0;
2862                                         usleep (10000);
2863                                 }
2865                                 kill (son, SIGKILL);
2866                                 return 1;
2867                         }
2869                 ], [
2870                                 AC_MSG_RESULT(yes)
2871                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2872                 ], [
2873                                 with_sigaltstack=no
2874                                 AC_MSG_RESULT(no)
2875                 ])
2876         fi
2878         dnl ********************************
2879         dnl *** Checks for semaphore lib ***
2880         dnl ********************************
2881         # 'Real Time' functions on Solaris
2882         # posix4 on Solaris 2.6
2883         # pthread (first!) on Linux
2884         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2886         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2887         AC_CHECK_FUNCS(shm_open)
2889         dnl ********************************
2890         dnl ***  Checks for gettext lib  ***
2891         dnl ********************************
2892         # This is needed for some hackery for AIX;
2893         # Mono itself doesn't use it, but DllMap includes it
2894         AC_SEARCH_LIBS([gettext], [intl])
2896         dnl ********************************
2897         dnl *** Checks for timezone stuff **
2898         dnl ********************************
2899         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2900                 AC_TRY_COMPILE([
2901                         #include <time.h>
2902                         ], [
2903                         struct tm tm;
2904                         tm.tm_gmtoff = 1;
2905                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2906         if test $ac_cv_struct_tm_gmtoff = yes; then
2907                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2908         else
2909                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2910                         AC_TRY_COMPILE([
2911                                 #include <time.h>
2912                         ], [
2913                                 timezone = 1;
2914                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2915                 if test $ac_cv_var_timezone = yes; then
2916                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2917                 else
2918                         AC_ERROR(unable to find a way to determine timezone)
2919                 fi
2920         fi
2922         dnl *********************************
2923         dnl *** Checks for math functions ***
2924         dnl *********************************
2925         AC_SEARCH_LIBS(sqrtf, m)
2927         dnl ****************************************************************
2928         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2929         dnl *** have it in the library (duh))                            ***
2930         dnl ****************************************************************
2931         AC_CHECK_FUNCS(poll)
2933         dnl **********************************
2934         dnl *** epoll                      ***
2935         dnl **********************************
2936         AC_CHECK_HEADERS(sys/epoll.h)
2937         haveepoll=no
2938         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2939         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2940                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2941         fi
2943         havekqueue=no
2945         AC_CHECK_HEADERS(sys/event.h)
2946         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2948         dnl **************************************
2949         dnl * Darwin has a race that prevents us from using reliably:
2950         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2951         dnl * Since kqueue is mostly used for scaling large web servers, 
2952         dnl * and very few folks run Mono on large web servers on OSX, falling
2953         dnl * back 
2954         dnl **************************************
2955         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2956                 if test "x$host_darwin" = "xno"; then
2957                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2958                 fi
2959         fi
2961         dnl ******************************
2962         dnl *** Checks for SIOCGIFCONF ***
2963         dnl ******************************
2964         AC_CHECK_HEADERS(sys/ioctl.h)
2965         AC_CHECK_HEADERS(net/if.h, [], [],
2966            [
2967            #ifdef HAVE_SYS_TYPES_H
2968            # include <sys/types.h>
2969            #endif
2970            #ifdef HAVE_SYS_SOCKET_H
2971            # include <sys/socket.h>
2972            #endif
2973            ])
2974         AC_MSG_CHECKING(for ifreq)
2975         AC_TRY_COMPILE([
2976                 #include <stdio.h>
2977                 #include <sys/ioctl.h>
2978                 #include <net/if.h>
2979                 ], [
2980                 struct ifconf ifc;
2981                 struct ifreq *ifr;
2982                 void *x;
2983                 ifc.ifc_len = 0;
2984                 ifc.ifc_buf = NULL;
2985                 x = (void *) &ifr->ifr_addr;
2986                 ],[
2987                         AC_MSG_RESULT(yes)
2988                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2989                 ], [
2990                         AC_MSG_RESULT(no)
2991                 ])
2992         dnl **********************************
2993         dnl ***     Checks for sin_len     ***
2994         dnl **********************************
2995         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2996         AC_TRY_COMPILE([
2997                 #include <netinet/in.h>
2998                 ], [
2999                 struct sockaddr_in saddr;
3000                 saddr.sin_len = sizeof (saddr);
3001                 ],[
3002                         AC_MSG_RESULT(yes)
3003                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
3004                 ], [
3005                         AC_MSG_RESULT(no)
3006                 ])      
3007         dnl **********************************
3008         dnl ***    Checks for sin6_len     ***
3009         dnl **********************************
3010         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
3011         AC_TRY_COMPILE([
3012                 #include <netinet/in.h>
3013                 ], [
3014                 struct sockaddr_in6 saddr6;
3015                 saddr6.sin6_len = sizeof (saddr6);
3016                 ],[
3017                         AC_MSG_RESULT(yes)
3018                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
3019                 ], [
3020                         AC_MSG_RESULT(no)
3021                 ])
3022         dnl **********************************
3023         dnl *** Check for getifaddrs       ***
3024         dnl **********************************
3025         AC_MSG_CHECKING(for getifaddrs)
3026                 AC_TRY_LINK([
3027                 #include <stdio.h>
3028                 #include <sys/types.h>
3029                 #include <sys/socket.h>
3030                 #ifdef HAVE_NET_IF_H
3031                 #include <net/if.h>
3032                 #endif
3033                 #include <ifaddrs.h>
3034         ], [
3035                 getifaddrs(NULL);
3036         ], [
3037                 # Yes, we have it...
3038                 AC_MSG_RESULT(yes)
3039                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
3040         ], [
3041                 AC_MSG_RESULT(no)
3042         ])
3043         dnl **********************************
3044         dnl *** Check for if_nametoindex   ***
3045         dnl **********************************
3046         AC_MSG_CHECKING(for if_nametoindex)
3047                 AC_TRY_LINK([
3048                 #include <stdio.h>
3049                 #include <sys/types.h>
3050                 #include <sys/socket.h>
3051                 #include <net/if.h>
3052         ], [
3053                 if_nametoindex(NULL);
3054         ], [
3055                 # Yes, we have it...
3056                 AC_MSG_RESULT(yes)
3057                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
3058         ], [
3059                 AC_MSG_RESULT(no)
3060         ])
3061         dnl **********************************
3062         dnl *** Check for access ***
3063         dnl **********************************
3064         AC_MSG_CHECKING(for access)
3065                 AC_TRY_LINK([
3066                 #include <unistd.h>
3067         ], [
3068                 access(NULL,0);
3069         ], [
3070                 # Yes, we have it...
3071                 AC_MSG_RESULT(yes)
3072                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
3073         ], [
3074                 AC_MSG_RESULT(no)
3075         ])
3076                         
3077         dnl **********************************
3078         dnl *** Checks for proclib         ***
3079         dnl **********************************
3080         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.)])
3081         dnl **********************************
3082         dnl *** Checks for MonoPosixHelper ***
3083         dnl **********************************
3084         AC_CHECK_HEADERS(checklist.h)
3085         AC_CHECK_HEADERS(pathconf.h)
3086         AC_CHECK_HEADERS(fstab.h)
3087         AC_CHECK_HEADERS(attr/xattr.h)
3088         AC_CHECK_HEADERS(sys/extattr.h)
3089         AC_CHECK_HEADERS(sys/sendfile.h)
3090         AC_CHECK_HEADERS(sys/statvfs.h)
3091         AC_CHECK_HEADERS(sys/statfs.h)
3092         AC_CHECK_HEADERS(sys/vfstab.h)
3093         AC_CHECK_HEADERS(sys/xattr.h)
3094         AC_CHECK_HEADERS(sys/mman.h)
3095         AC_CHECK_HEADERS(sys/param.h)
3096         AC_CHECK_HEADERS(sys/mount.h, [], [],
3097                 [
3098                 #ifdef HAVE_SYS_PARAM_H
3099                 # include <sys/param.h>
3100                 #endif
3101                 ])
3102         AC_CHECK_HEADERS(sys/mount.h)
3103         AC_CHECK_FUNCS(confstr)
3104         AC_CHECK_FUNCS(seekdir telldir)
3105         AC_CHECK_FUNCS(getdomainname)
3106         AC_CHECK_FUNCS(setdomainname)
3107         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
3108         AC_CHECK_FUNCS(setgroups)
3109         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
3110         AC_CHECK_FUNCS(getfsstat)
3111         AC_CHECK_FUNCS(lutimes futimes)
3112         AC_CHECK_FUNCS(mremap)
3113         AC_CHECK_FUNCS(remap_file_pages)
3114         AC_CHECK_FUNCS(posix_fadvise)
3115         AC_CHECK_FUNCS(posix_fallocate)
3116         AC_CHECK_FUNCS(posix_madvise)
3117         AC_CHECK_FUNCS(vsnprintf)
3118         AC_CHECK_FUNCS(sendfile)
3119         AC_CHECK_FUNCS(gethostid sethostid)
3120         AC_CHECK_FUNCS(sethostname)
3121         AC_CHECK_FUNCS(statfs)
3122         AC_CHECK_FUNCS(fstatfs)
3123         AC_CHECK_FUNCS(statvfs)
3124         AC_CHECK_FUNCS(fstatvfs)
3125         AC_CHECK_FUNCS(stime)
3126         AC_CHECK_FUNCS(ttyname_r)
3127         AC_CHECK_FUNCS(psignal)
3128         AC_CHECK_FUNCS(getlogin_r)
3129         AC_CHECK_FUNCS(lockf)
3130         AC_CHECK_FUNCS(swab)
3131         AC_CHECK_FUNCS(setusershell endusershell)
3132         AC_CHECK_FUNCS(futimens utimensat)
3133         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
3134         AC_CHECK_FUNCS(readv writev preadv pwritev)
3135         AC_CHECK_FUNCS(setpgid)
3136         AC_CHECK_FUNCS(system)
3137         AC_CHECK_FUNCS(fork execv execve)
3138         AC_CHECK_FUNCS(waitpid)
3139         AC_CHECK_FUNCS(accept4)
3140         AC_CHECK_FUNCS(localtime_r)
3141         AC_CHECK_FUNCS(mkdtemp)
3142         AC_CHECK_SIZEOF(size_t)
3143         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
3144                 [#include <sys/types.h>
3145                  #include <sys/stat.h>
3146                  #include <unistd.h>])
3147         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
3148                 [#include <sys/types.h>
3149                  #include <sys/stat.h>
3150                  #include <unistd.h>])
3151         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
3152                 [#include <sys/time.h>])
3153         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
3154                 [#include <sys/socket.h>])
3155         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
3156                 [#include <unistd.h>
3157                  #include <fcntl.h>])
3158         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
3159                 [#include <sys/uio.h>])
3160         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
3161                 [#include <sys/socket.h>])
3162         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3163                 [#include <sys/poll.h>])
3164         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3165                 [#include <sys/socket.h>])
3166         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3167                 [#include <sys/socket.h>])
3168         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3169                 [#include <netinet/in.h>])
3170         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3171                 [#include <netinet/in.h>])
3172         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3173                 [#include <sys/un.h>])
3174         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3175                 [#include <sys/types.h>
3176                  #include <sys/stat.h>
3177                  #include <unistd.h>])
3178         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3179                 [#include <time.h>])
3180         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3181                 [#include <sys/time.h>
3182                  #include <sys/types.h>
3183                  #include <utime.h>])
3184         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3185                 [#include <sys/time.h>])
3186         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3187                 [#include <sys/types.h>
3188                  #include <utime.h>])
3189         AC_CHECK_MEMBERS(
3190                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3191                 [#include <sys/types.h>
3192                  #include <dirent.h>])
3193         AC_CHECK_MEMBERS(
3194                 [struct passwd.pw_gecos],,, 
3195                 [#include <sys/types.h>
3196                  #include <pwd.h>])
3197         AC_CHECK_MEMBERS(
3198                 [struct statfs.f_flags],,, 
3199                 [#include <sys/types.h>
3200                  #include <sys/vfs.h>])
3201         AC_CHECK_MEMBERS(
3202                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3203                 [#include <sys/types.h>
3204                  #include <sys/stat.h>
3205                  #include <unistd.h>])
3207         dnl Favour xattr through glibc, but use libattr if we have to
3208         AC_CHECK_FUNC(lsetxattr, ,
3209                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3210         )
3211         AC_SUBST(XATTR_LIB)
3213         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3214         AC_CHECK_MEMBERS(
3215                 [struct kinfo_proc.kp_proc],,, 
3216                 [#include <sys/types.h>
3217                  #include <sys/param.h>
3218                  #include <sys/sysctl.h>
3219                  #include <sys/proc.h>
3220                  ])
3222         dnl *********************************
3223         dnl *** Checks for Windows compilation ***
3224         dnl *********************************
3225         AC_CHECK_HEADERS(sys/time.h)
3226         AC_CHECK_HEADERS(sys/param.h)
3227         AC_CHECK_HEADERS(dirent.h)
3229         dnl ******************************************
3230         dnl *** Checks for OSX and iOS compilation ***
3231         dnl ******************************************
3232         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3234         dnl *********************************
3235         dnl *** Check for Console 2.0 I/O ***
3236         dnl *********************************
3237         AC_CHECK_HEADERS([curses.h])
3238         AC_CHECK_HEADERS([term.h], [], [],
3239         [#if HAVE_CURSES_H
3240          #include <curses.h>
3241          #endif
3242         ])
3243         AC_CHECK_HEADERS([termios.h])
3245         dnl *********************************
3246         dnl *** Checks for random         ***
3247         dnl *********************************
3248         if test x$host_darwin = xno; then
3249                 AC_CHECK_HEADERS(sys/random.h)
3250                 AC_CHECK_FUNCS(getrandom getentropy)
3251         fi
3253         dnl *********************************
3254         dnl *** Checks for Mono.Native    ***
3255         dnl *********************************
3257         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3258         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3260         AC_MSG_CHECKING(for linux/in.h)
3261         AC_TRY_COMPILE([
3262                 #include <sys/socket.h>
3263                 #include <linux/in.h>
3264         ], [
3265         ],[
3266                 AC_MSG_RESULT(yes)
3267                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3268         ], [
3269                 AC_MSG_RESULT(no)
3270         ])
3272         AC_CHECK_HEADERS([linux/if_packet.h])
3274         AC_MSG_CHECKING(for struct in_pktinfo)
3275         AC_TRY_COMPILE([
3276                 #ifdef HAVE_LINUX_IN_H
3277                 #include <sys/socket.h>
3278                 #include <linux/in.h>
3279                 #else
3280                 #include <netinet/in.h>
3281                 #endif
3282         ], [
3283                 struct in_pktinfo pktinfo;
3284         ],[
3285                 AC_MSG_RESULT(yes)
3286                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3287         ], [
3288                 AC_MSG_RESULT(no)
3289         ])
3291         AC_MSG_CHECKING(for struct ip_mreqn)
3292         AC_TRY_COMPILE([
3293                 #if HAVE_LINUX_IN_H
3294                 #include <sys/socket.h>
3295                 #include <linux/in.h>
3296                 #else
3297                 #include <netinet/in.h>
3298                 #endif
3299         ], [
3300                 struct ip_mreqn mreqn;
3301         ],[
3302                 AC_MSG_RESULT(yes)
3303                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3304         ], [
3305                 AC_MSG_RESULT(no)
3306         ])
3308         if test x$host_darwin = xno; then
3309                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3310         fi
3312         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3313         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3315         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3317         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3318         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3319         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3320         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3322         if test "x$mono_native_platform_ios" = "xno"; then
3323                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3324                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3325                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3326         fi
3328         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3329         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3330         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3331         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3332         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_ADVISE, 1, [posix_fadvise])]) # the define is called HAVE_POSIX_ADVISE in corefx, not a typo
3333         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3334         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3335         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3337         if test "x$platform_android" != "xyes"; then
3338                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3339         fi
3341         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3342         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3343         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3344         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3345         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3346         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3348         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>]])
3349         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>]])
3350         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>]])
3351         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>]])
3352         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3353         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3354         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3356         AC_MSG_CHECKING(for struct statfs)
3357         AC_TRY_COMPILE([
3358                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3359                 #include <sys/mount.h>
3360                 #else
3361                 #include <sys/statfs.h>
3362                 #endif
3363         ], [
3364                 struct statfs;
3365         ],[
3366                 AC_MSG_RESULT(yes)
3367                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3368         ], [
3369                 AC_MSG_RESULT(no)
3370         ])
3372         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3373                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3374         fi
3376         AC_MSG_CHECKING(for readdir_r)
3377         AC_TRY_LINK([
3378                 #include <dirent.h>
3379         ], [
3380                 DIR* dir;
3381                 struct dirent* entry;
3382                 struct dirent* result;
3383                 readdir_r(dir, entry, &result);
3384         ],[
3385                 AC_MSG_RESULT(yes)
3386                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3387         ], [
3388                 AC_MSG_RESULT(no)
3389         ])
3391         AC_MSG_CHECKING(for kevent with void *data)
3392         AC_TRY_LINK([
3393                 #include <sys/types.h>
3394                 #include <sys/event.h>
3395         ], [
3396                 struct kevent event;
3397                 void* data;
3398                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3399         ],[
3400                 AC_MSG_RESULT(yes)
3401                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3402         ], [
3403                 AC_MSG_RESULT(no)
3404         ])
3406         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3407         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3409         AC_MSG_CHECKING(for sendfile with 4 arguments)
3410         AC_TRY_LINK([
3411                 #include <sys/sendfile.h>
3412         ], [
3413                 #if defined(TARGET_ANDROID)
3414                 #if !defined(__ANDROID_API__)
3415                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3416                 #elif __ANDROID_API__ < 21
3417                 #error sendfile is not supported on this Android API level
3418                 #endif
3419                 #endif
3421                 int result = sendfile(0, 0, 0, 0);
3422         ],[
3423                 AC_MSG_RESULT(yes)
3424                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3425         ], [
3426                 AC_MSG_RESULT(no)
3427         ])
3429         ORIG_CFLAGS="$CFLAGS"
3430         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3432         AC_MSG_CHECKING(for sendfile with 6 arguments)
3433         AC_TRY_LINK([
3434                 #include <stdlib.h>
3435                 #include <sys/types.h>
3436                 #include <sys/socket.h>
3437                 #include <sys/uio.h>
3438         ], [
3439                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3440         ],[
3441                 AC_MSG_RESULT(yes)
3442                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3443         ], [
3444                 AC_MSG_RESULT(no)
3445         ])
3447         CFLAGS="$ORIG_CFLAGS"
3449         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3450         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3451         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3452         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3454         ORIG_CFLAGS="$CFLAGS"
3455         CFLAGS="$CFLAGS -Werror=sign-conversion"
3457         AC_MSG_CHECKING(for getnameinfo with signed flags)
3458         AC_TRY_LINK([
3459                 #include <sys/types.h>
3460                 #include <netdb.h>
3461         ], [
3462                 const struct sockaddr *addr;
3463                 socklen_t addrlen;
3464                 char *host;
3465                 socklen_t hostlen;
3466                 char *serv;
3467                 socklen_t servlen;
3468                 int flags;
3469                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3470         ],[
3471                 AC_MSG_RESULT(yes)
3472                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3473         ], [
3474                 AC_MSG_RESULT(no)
3475         ])
3477         CFLAGS="$ORIG_CFLAGS"
3479         if test "x$host_linux" = "xyes"; then
3480                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3481         else
3482                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3483         fi
3485         # HAVE_CLOCK_MONOTONIC check already done above
3486         # HAVE_CLOCK_REALTIME check already done above
3487         # HAVE_MACH_ABSOLUTE_TIME check already done above
3488         # HAVE_MACH_TIMEBASE_INFO check already done above
3489         # HAVE_FUTIMES check already done above
3490         # HAVE_FUTIMENS check already done above
3492         ORIG_CFLAGS="$CFLAGS"
3493         CFLAGS="$CFLAGS -Werror=sign-conversion"
3495         AC_MSG_CHECKING(for bind with unsigned addrlen)
3496         AC_TRY_LINK([
3497                 #include <sys/socket.h>
3498         ], [
3499                 int fd;
3500                 struct sockaddr* addr;
3501                 socklen_t addrLen;
3502                 bind(fd, addr, addrLen);
3503         ],[
3504                 AC_MSG_RESULT(yes)
3505                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3506         ], [
3507                 AC_MSG_RESULT(no)
3508         ])
3510         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3511         AC_TRY_LINK([
3512                 #include <netinet/in.h>
3513                 #include <netinet/tcp.h>
3514         ], [
3515                 struct ipv6_mreq opt;
3516                 unsigned int index = 0;
3517                 opt.ipv6mr_interface = index;
3518         ],[
3519                 AC_MSG_RESULT(yes)
3520                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3521         ], [
3522                 AC_MSG_RESULT(no)
3523         ])
3525         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3526         AC_TRY_LINK([
3527                 #include <sys/inotify.h>
3528         ], [
3529                 intptr_t fd;
3530                 uint32_t wd;
3531                 int result = inotify_rm_watch(fd, wd);
3532         ],[
3533                 AC_MSG_RESULT(yes)
3534                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3535         ], [
3536                 AC_MSG_RESULT(no)
3537         ])
3539         CFLAGS="$ORIG_CFLAGS"
3541         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3542         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3543                 AC_MSG_RESULT(no)
3544         elif test "x$cross_compiling" = "xyes"; then
3545                 AC_MSG_RESULT(cross compiling, assuming yes)
3546                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3547         else
3548                 AC_TRY_RUN([
3549                         #include <sys/mman.h>
3550                         #include <fcntl.h>
3551                         #include <unistd.h>
3553                         int main ()
3554                         {
3555                         #ifdef __PASE__
3556                                 /* IBM i doesn't implement this and returns SIGILL */
3557                                 return -1;
3558                         #endif
3559                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3560                                 if (fd == -1)
3561                                         return -1;
3563                                 shm_unlink("/mono_configure_shm_open");
3565                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3566                                 //       on at least the current version of Mac OS X
3568                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3569                                         return -1;
3571                                 return 0;
3572                         }
3573                 ],[
3574                         AC_MSG_RESULT(yes)
3575                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3576                 ], [
3577                         AC_MSG_RESULT(no)
3578                 ])
3579         fi
3581         AC_MSG_CHECKING(for getpriority with int who)
3582         AC_TRY_LINK([
3583                 #include <sys/resource.h>
3584         ], [
3585                 int which;
3586                 int who;
3587                 int result = getpriority(which, who);
3588         ],[
3589                 AC_MSG_RESULT(yes)
3590                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3591         ], [
3592                 AC_MSG_RESULT(no)
3593         ])
3595         AC_MSG_CHECKING(for kevent with int parameters)
3596         AC_TRY_LINK([
3597                 #include <sys/types.h>
3598                 #include <sys/event.h>
3599         ], [
3600                 int kg;
3601                 const struct kevent* chagelist;
3602                 int nchanges;
3603                 struct kevent* eventlist;
3604                 int nevents;
3605                 const struct timespec* timeout;
3606                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3607         ],[
3608                 AC_MSG_RESULT(yes)
3609                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3610         ], [
3611                 AC_MSG_RESULT(no)
3612         ])
3614         AC_CHECK_FUNCS(mkstemps)
3615         # AC_CHECK_FUNCS(mkstemp) # already done above
3617         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3618                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3619         fi
3621         AC_MSG_CHECKING(for tcp/var.h)
3622         AC_TRY_LINK([
3623                 #include <sys/types.h>
3624                 #include <sys/socketvar.h>
3625                 #include <netinet/ip.h>
3626                 #include <netinet/tcp.h>
3627                 #include <netinet/tcp_var.h>
3628         ], [
3629         ],[
3630                 AC_MSG_RESULT(yes)
3631                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3632         ], [
3633                 AC_MSG_RESULT(no)
3634         ])
3636         AC_CHECK_HEADERS([sys/cdefs.h])
3638         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3639         AC_TRY_LINK([
3640                 #ifdef HAVE_SYS_CDEFS_H
3641                 #include <sys/cdefs.h>
3642                 #endif
3643                 #include <netinet/tcp.h>
3644         ], [
3645                 int result = TCP_ESTABLISHED;
3646         ],[
3647                 AC_MSG_RESULT(yes)
3648                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3649         ], [
3650                 AC_MSG_RESULT(no)
3651         ])
3653         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3655         AC_MSG_CHECKING(for struct rt_msghdr)
3656         AC_TRY_COMPILE([
3657                 #include <sys/types.h>
3658                 #include <net/route.h>
3659         ], [
3660                 struct rt_msghdr;
3661         ],[
3662                 AC_MSG_RESULT(yes)
3663                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3664         ], [
3665                 AC_MSG_RESULT(no)
3666         ])
3668         AC_CHECK_HEADERS([sys/sysctl.h])
3669         AC_CHECK_HEADERS([linux/rtnetlink.h])
3671         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3672         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3673         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3675         ORIG_CFLAGS="$CFLAGS"
3676         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3678         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3679         AC_TRY_LINK([
3680                 #include <unistd.h>
3681         ], [
3682                 size_t namelen = 20;
3683                 char name[20];
3684                 int result = getdomainname(name, namelen);
3685         ],[
3686                 AC_MSG_RESULT(yes)
3687                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3688         ], [
3689                 AC_MSG_RESULT(no)
3690         ])
3692         CFLAGS="$ORIG_CFLAGS"
3694         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3695         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3696         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3698         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
3699                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3700         elif test "x$host_linux" = "xyes"; then
3701                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3702         fi
3704         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3705         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3706         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3707         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3709         enable_gss=no;
3710         AC_MSG_CHECKING(for GSS/GSS.h)
3711         AC_TRY_COMPILE([
3712                         #include <GSS/GSS.h>
3713         ], [
3714         ],[
3715                         AC_MSG_RESULT(yes)
3716                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3717                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3718                         enable_gss=yes
3719         ], [
3720                         AC_MSG_RESULT(no)
3721         ])
3723         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3724         AC_TRY_COMPILE([
3725                         #include <gssapi/gssapi_ext.h>
3726         ], [
3727         ],[
3728                         AC_MSG_RESULT(yes)
3729                         enable_gss=yes
3730         ], [
3731                         AC_MSG_RESULT(no)
3732         ])
3734         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3735         AC_TRY_COMPILE([
3736                         #include <gssapi/gssapi_ext.h>
3737                         #include <gssapi/gssapi_krb5.h>
3738                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3739         ], [
3740         ],[
3741                         AC_MSG_RESULT(yes)
3742                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3743         ], [
3744                         AC_MSG_RESULT(no)
3745         ])
3747         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3749         AC_CHECK_HEADERS([crt_externs.h])
3751         AC_MSG_CHECKING(for _NSGetEnviron)
3752         AC_TRY_LINK([
3753                 #include <crt_externs.h>
3754         ], [
3755                 char **result = *(_NSGetEnviron());
3756         ],[
3757                 AC_MSG_RESULT(yes)
3758                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3759         ], [
3760                 AC_MSG_RESULT(no)
3761         ])
3763         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3765         # *** End of Mono.Native checks ***
3766 else
3767         AM_CONDITIONAL(ENABLE_GSS, false)
3769         dnl *********************************
3770         dnl *** Checks for Windows compilation ***
3771         dnl *********************************
3772         AC_CHECK_HEADERS(winternl.h)
3774         jdk_headers_found=no
3775         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3776         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3777         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3778         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3779         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3780         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3781         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3783         dnl *********************************
3784         dnl *** Check for struct ip_mreqn ***
3785         dnl *********************************
3786         AC_MSG_CHECKING(for struct ip_mreqn)
3787         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3788                 struct ip_mreqn mreq;
3789                 mreq.imr_address.s_addr = 0;
3790         ], [
3791                 # Yes, we have it...
3792                 AC_MSG_RESULT(yes)
3793                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3794         ], [
3795                 # We'll just have to try and use struct ip_mreq
3796                 AC_MSG_RESULT(no)
3797                 AC_MSG_CHECKING(for struct ip_mreq)
3798                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3799                         struct ip_mreq mreq;
3800                         mreq.imr_interface.s_addr = 0;
3801                 ], [
3802                         # Yes, we have it...
3803                         AC_MSG_RESULT(yes)
3804                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3805                 ], [
3806                         # No multicast support
3807                         AC_MSG_RESULT(no)
3808                 ])
3809         ])
3811         dnl **********************************
3812         dnl *** Check for getaddrinfo ***
3813         dnl **********************************
3814         AC_MSG_CHECKING(for getaddrinfo)
3815                 AC_TRY_LINK([
3816                 #include <stdio.h>
3817                 #include <winsock2.h>
3818                 #include <ws2tcpip.h>
3819         ], [
3820                 getaddrinfo(NULL,NULL,NULL,NULL);
3821         ], [
3822                 # Yes, we have it...
3823                 AC_MSG_RESULT(yes)
3824                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3825         ], [
3826                 AC_MSG_RESULT(no)
3827         ])
3829         dnl **********************************
3830         dnl *** Check for gethostbyname ***
3831         dnl **********************************
3832         AC_MSG_CHECKING(for gethostbyname)
3833                 AC_TRY_LINK([
3834                 #include <stdio.h>
3835                 #include <winsock2.h>
3836                 #include <ws2tcpip.h>
3837         ], [
3838                 gethostbyname(NULL);
3839         ], [
3840                 # Yes, we have it...
3841                 AC_MSG_RESULT(yes)
3842                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3843         ], [
3844                 AC_MSG_RESULT(no)
3845         ])
3847         dnl **********************************
3848         dnl *** Check for getprotobyname ***
3849         dnl **********************************
3850         AC_MSG_CHECKING(for getprotobyname)
3851                 AC_TRY_LINK([
3852                 #include <stdio.h>
3853                 #include <winsock2.h>
3854                 #include <ws2tcpip.h>
3855         ], [
3856                 getprotobyname(NULL);
3857         ], [
3858                 # Yes, we have it...
3859                 AC_MSG_RESULT(yes)
3860                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3861         ], [
3862                 AC_MSG_RESULT(no)
3863         ])
3865         dnl **********************************
3866         dnl *** Check for getnameinfo ***
3867         dnl **********************************
3868         AC_MSG_CHECKING(for getnameinfo)
3869                 AC_TRY_LINK([
3870                 #include <stdio.h>
3871                 #include <winsock2.h>
3872                 #include <ws2tcpip.h>
3873         ], [
3874                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3875         ], [
3876                 # Yes, we have it...
3877                 AC_MSG_RESULT(yes)
3878                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3879         ], [
3880                 AC_MSG_RESULT(no)
3881         ])
3883         dnl **********************************
3884         dnl *** Check for inet_ntop ***
3885         dnl **********************************
3886         AC_MSG_CHECKING(for inet_ntop)
3887                 AC_TRY_LINK([
3888                 #include <stdio.h>
3889                 #include <winsock2.h>
3890                 #include <ws2tcpip.h>
3891         ], [
3892                 inet_ntop (0, NULL, NULL, 0);
3893         ], [
3894                 # Yes, we have it...
3895                 AC_MSG_RESULT(yes)
3896                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3897         ], [
3898                 AC_MSG_RESULT(no)
3899         ])
3901         dnl **********************************
3902         dnl *** Check for inet_pton ***
3903         dnl **********************************
3904         AC_MSG_CHECKING(for inet_pton)
3905                 AC_TRY_LINK([
3906                 #include <stdio.h>
3907                 #include <winsock2.h>
3908                 #include <ws2tcpip.h>
3909         ], [
3910                 #ifndef inet_pton
3911                 (void) inet_pton;
3912                 #endif
3913                 inet_pton (0, NULL, NULL);
3914         ], [
3915                 # Yes, we have it...
3916                 AC_MSG_RESULT(yes)
3917                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3918         ], [
3919                 AC_MSG_RESULT(no)
3920         ])
3922         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3923         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3924         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3925         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3926         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3927         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3928         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3931 dnl socklen_t check
3932 AC_MSG_CHECKING(for socklen_t)
3933 AC_TRY_COMPILE([
3934 #include <sys/types.h>
3935 #include <sys/socket.h>
3937   socklen_t foo;
3939 ac_cv_c_socklen_t=yes
3940         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3941         AC_MSG_RESULT(yes)
3943         AC_MSG_RESULT(no)
3946 AC_CHECK_FUNCS(execvp)
3948 dnl ****************************
3949 dnl *** Look for /dev/random ***
3950 dnl ****************************
3952 AC_MSG_CHECKING([if usage of random device is requested])
3953 AC_ARG_ENABLE(dev-random,
3954 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3955 try_dev_random=$enableval, try_dev_random=yes)
3957 AC_MSG_RESULT($try_dev_random)
3959 case "{$build}" in
3961 dnl IBM i does not have /dev/random, use unblocking only
3963     *-*-os400*)
3964     NAME_DEV_RANDOM="/dev/urandom"
3965     ;;
3967 dnl Win32 does not have /dev/random, they have their own method...
3969     *-mingw*|*-*-cygwin*)
3970     ac_cv_have_dev_random=no
3971     ;;
3973 dnl Everywhere else, it's /dev/random
3975     *)
3976     NAME_DEV_RANDOM="/dev/random"
3977     ;;
3978 esac
3980 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3982 dnl Now check if the device actually exists
3984 if test "x$try_dev_random" = "xyes"; then
3985     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3986     [if test -r "$NAME_DEV_RANDOM" ; then
3987         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3988     if test "x$ac_cv_have_dev_random" = "xyes"; then
3989         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3990     fi
3991 else
3992     AC_MSG_CHECKING(for random device)
3993     ac_cv_have_dev_random=no
3994     AC_MSG_RESULT(has been disabled)
3997 if test "x$host_win32" = "xyes"; then
3998     AC_DEFINE(HAVE_CRYPT_RNG)
4001 if test "x$ac_cv_have_dev_random" = "xno" \
4002     && test "x$host_win32" = "xno"; then
4003     AC_MSG_WARN([[
4005 *** A system-provided entropy source was not found on this system.
4006 *** Because of this, the System.Security.Cryptography random number generator
4007 *** will throw a NotImplemented exception.
4009 *** If you are seeing this message, and you know your system DOES have an
4010 *** entropy collection in place, please report an issue on GitHub and
4011 *** provide information about the system and how to access the random device.
4013 *** Otherwise you can install either egd or prngd and set the environment
4014 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
4015 ***]])
4018 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)
4020 AC_MSG_CHECKING([if big-arrays are to be enabled])
4021 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)
4022 if test "x$enable_big_arrays" = "xyes" ; then
4023     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
4024         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
4025     else
4026         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
4027     fi
4029 AC_MSG_RESULT($enable_big_arrays)
4031 dnl **************
4032 dnl *** DTRACE ***
4033 dnl **************
4035 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
4037 if test "x$enable_dtrace" = "xyes"; then
4038    if test "x$has_dtrace" = "xno"; then
4039           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
4040    fi
4041    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
4042    if test "x$DTRACE" = "xno"; then
4043           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
4044           enable_dtrace=no
4045    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
4046           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
4047           enable_dtrace=no
4048    fi
4051 dtrace_g=no
4052 if test "x$enable_dtrace" = "xyes"; then
4053         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
4054         DTRACEFLAGS=
4055         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4056                 case "$host" in
4057                         powerpc-*-darwin*)
4058                         DTRACEFLAGS="-arch ppc64"
4059                         ;;
4060                         i*86-*-darwin*)
4061                         DTRACEFLAGS="-arch x86_64"
4062                         ;;
4063                         *)
4064                         DTRACEFLAGS=-64
4065                         ;;
4066                 esac
4067         else
4068                 case "$host" in
4069                         powerpc-*-darwin*)
4070                         DTRACEFLAGS="-arch ppc"
4071                         ;;
4072                         i*86-*-darwin*)
4073                         DTRACEFLAGS="-arch i386"
4074                         ;;
4075                         *)
4076                         DTRACEFLAGS=-32
4077                         ;;
4078                 esac
4079         fi
4080         AC_SUBST(DTRACEFLAGS)
4081         case "$host" in
4082                 *-*-solaris*)
4083                 dtrace_g=yes
4084                 ;;
4085         esac
4086         AC_CHECK_HEADERS([sys/sdt.h])
4088 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
4089 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
4091 dnl **************************
4092 dnl *** AOT cross offsets  ***
4093 dnl **************************
4095 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
4096     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
4098 dnl **************
4099 dnl ***  LLVM  ***
4100 dnl **************
4102 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
4103 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
4104 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)
4105 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
4106 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
4108 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
4110 if test "x$enable_llvm" = "xdefault"; then
4111    enable_llvm=$enable_llvm_default
4114 enable_llvm_msvc_only="no"
4115 if test "x$enable_llvm" = "xyes"; then
4116         if test "x$host_win32" = "xyes"; then
4117                 if test "x$cross_compiling" = "xno"; then
4118                         case "$target" in
4119                         x86_64*)
4120                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
4121                                 enable_llvm_msvc_only="yes"
4122                                 ;;
4123                         i686*)
4124                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
4125                                 ;;
4126                         esac
4127                 fi
4128                 if test "x$enable_loadedllvm" = "xyes"; then
4129                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
4130                         enable_loadedllvm=no
4131                 fi
4132         fi
4135 internal_llvm="no"
4136 if test "x$enable_llvm" = "xyes"; then
4137         if test "x$with_llvm" != "x"; then
4138                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
4139                 if test x$host_win32 = xyes; then
4140                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
4141                 fi
4142                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
4143                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
4144                 fi
4145         else
4146                 if test x$host_win32 = xyes; then
4147                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
4148                 else
4149                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
4150                 fi
4151                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
4152                         internal_llvm=yes
4153                 fi
4154         fi
4156         LLVM_CODEGEN_LIBS="x86codegen"
4157         case "$target" in
4158         arm*)
4159                 LLVM_CODEGEN_LIBS="armcodegen"
4160                 ;;
4161         aarch64*)
4162                 LLVM_CODEGEN_LIBS="aarch64codegen"
4163                 ;;
4164         powerpc*)
4165                 LLVM_CODEGEN_LIBS="powerpccodegen"
4166                 ;;
4167         esac
4168         if test "x$host" != "x$target"; then
4169                 # No need for jit libs
4170                 LLVM_CODEGEN_LIBS=
4171         fi
4173         AC_SUBST(LLVM_CODEGEN_LIBS)
4174         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4176         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4177                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4178                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4179         fi
4180         if test "x$enable_llvm_msvc_only" != "xyes"; then
4181                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4182         else
4183                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4184         fi
4185 fi # ENABLE_LLVM
4187 # AC_DEFINE necessary for correct restore behavior on Linux
4188 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4189 if test "x$internal_llvm" != "xno"; then
4190         if test "x$enable_llvm_msvc_only" != "xyes"; then
4191                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4192         else
4193                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4194         fi
4197 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4198 if test "x$enable_llvm_asserts" != "xno"; then
4199         if test "x$enable_llvm_msvc_only" != "xyes"; then
4200                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4201         else
4202                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4203         fi
4206 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4208 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4209 if test "x$enable_loadedllvm" = "xyes"; then
4210         if test "x$enable_llvm_msvc_only" != "xyes"; then
4211                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4212         fi
4215 if test "x$enable_llvm" = "xyes"; then
4216         enable_llvm_runtime=yes
4219 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4220 if test "x$enable_llvm_runtime" = "xyes"; then
4221         if test "x$enable_llvm_msvc_only" != "xyes"; then
4222                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4223         else
4224                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4225         fi
4228 TARGET="unknown"
4229 ACCESS_UNALIGNED="yes"
4231 LIBC="libc.so.6"
4232 INTL="libc.so.6"
4233 SQLITE="libsqlite.so.0"
4234 SQLITE3="libsqlite3.so.0"
4235 ODBC="libodbc.so.2"
4236 X11="libX11.so"
4237 GDKX11="libgdk-x11-2.0.so.0"
4238 GTKX11="libgtk-x11-2.0.so.0"
4239 XINERAMA="libXinerama.so.1"
4241 sizeof_register="SIZEOF_VOID_P"
4243 jit_wanted=true
4244 boehm_supported=true
4245 BTLS_SUPPORTED=no
4246 BTLS_PLATFORM=
4248 case "$host" in
4249         wasm32*)
4250                 TARGET=WASM
4251                 arch_target=wasm
4252                 BTLS_SUPPORTED=no
4253                 ACCESS_UNALIGNED="no"
4254                 with_tls=pthread
4255                 target_wasm=yes
4256                 ;;
4257         mips*)
4258                 TARGET=MIPS;
4259                 arch_target=mips;
4260                 with_tls=pthread;
4261                 ACCESS_UNALIGNED="no"
4263                 AC_MSG_CHECKING(for mips n32)
4264                 AC_TRY_COMPILE([],[
4265                 #if _MIPS_SIM != _ABIN32
4266                 #error Not mips n32
4267                 #endif
4268                 ],[
4269                 AC_MSG_RESULT(yes)
4270                 sizeof_register=8
4271                 ],[
4272                 AC_MSG_RESULT(no)
4273                 ])
4274                 ;;
4275         i*86-*-*)
4276                 TARGET=X86;
4277                 arch_target=x86;
4278                 case $host_os in
4279                   solaris*)
4280                         LIBC="libc.so"
4281                         INTL="libintl.so"
4282                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4283                                 TARGET=AMD64
4284                                 arch_target=amd64
4285                         fi
4287                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4288                         # int astruct __attribute__ ((visibility ("hidden")));
4289                         # void foo ()
4290                         # {
4291                         #       void *p = &astruct;
4292                         # }
4293                         # gcc -fPIC --shared -o libfoo.so foo.c
4294                         # yields:
4295                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4296                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4297                         have_visibility_hidden=no
4298                         ;;
4299                   mingw*|cygwin*)
4300                         have_visibility_hidden=no
4301                         BTLS_SUPPORTED=no
4302                         BTLS_PLATFORM=i386
4303                         ;;
4304                   haiku*)
4305                         LIBC=libroot.so
4306                         ;;
4307                   linux*)
4308                         AOT_SUPPORTED="yes"
4309                         BTLS_SUPPORTED=yes
4310                         BTLS_PLATFORM=i386
4311                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4312                         ;;
4313                   darwin*)
4314                         AOT_SUPPORTED="yes"
4315                         BTLS_SUPPORTED=yes
4316                         BTLS_PLATFORM=i386
4317                         ;;
4318                   openbsd*|freebsd*|kfreebsd-gnu*)
4319                         AOT_SUPPORTED="yes"
4320                         BTLS_SUPPORTED=yes
4321                         BTLS_PLATFORM=i386
4322                         ;;
4323                 esac
4324                 ;;
4325         x86_64-*-* | amd64-*-*)
4326                 TARGET=AMD64;
4327                 arch_target=amd64;
4328                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4329                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4330                         sizeof_register=8
4331                 fi
4332                 case $host_os in
4333                   linux*)
4334                         AOT_SUPPORTED="yes"
4335                         BTLS_SUPPORTED=yes
4336                         BTLS_PLATFORM=x86_64
4337                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4338                         ;;
4339                   darwin*)
4340                         AOT_SUPPORTED="yes"
4341                         BTLS_SUPPORTED=yes
4342                         BTLS_PLATFORM=x86_64
4343                         boehm_supported=false
4344                         ;;
4345                   openbsd*|freebsd*|kfreebsd-gnu*)
4346                         AOT_SUPPORTED="yes"
4347                         BTLS_SUPPORTED=yes
4348                         BTLS_PLATFORM=x86_64
4349                         ;;
4350                   mingw*|cygwin*)
4351                         BTLS_SUPPORTED=no
4352                         BTLS_PLATFORM=x86_64
4353                         ;;
4354                 esac
4355                 ;;
4356         sparc*-*-*)
4357                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4358                    TARGET=SPARC64
4359                 else
4360                         TARGET=SPARC
4361                 fi
4362                 arch_target=sparc;
4363                 ACCESS_UNALIGNED="no"
4364                 case $host_os in
4365                   linux*) ;;
4366                   *)
4367                         LIBC="libc.so"
4368                         INTL="libintl.so"
4369                 esac
4370                 if test x"$GCC" = xyes; then
4371                         # We don't support v8 cpus
4372                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4373                 fi
4374                 if test x"$AR" = xfalse; then
4375                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4376                 fi
4377                 ;;
4378         *-mingw*|*-*-cygwin*)
4379                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4380                 have_visibility_hidden=no
4381                 INTL="intl"
4382                 case "$host" in
4383                         x86_64*mingw*)
4384                                 # Old Boehm fails to compile for x86_64-mingw.
4385                                 # It is trivial to fix, but just silently drop it.
4386                                 boehm_supported=false
4387                                 ;;
4388                 esac
4389                 ;;
4390         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4391         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4392         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4393                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4394                         TARGET=POWERPC64;
4395                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4396                         if ! (echo $CC | grep -q -- 'clang'); then
4397                                 CFLAGS="$CFLAGS -mminimal-toc"
4398                         fi
4399                 else
4400                         TARGET=POWERPC;
4401                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4402                 fi
4403                 arch_target=ppc;
4404                 case $host_os in
4405                   aix*|os400*)
4406                         BTLS_SUPPORTED=yes
4407                         BTLS_PLATFORM=powerpc
4408                         ;;
4409                   linux*)
4410                         BTLS_SUPPORTED=yes
4411                         BTLS_PLATFORM=powerpc
4412                         ;;
4413                 esac
4414                 ;;
4415         armv7k-*-darwin*)
4416                 TARGET=ARM;
4417                 TARGET_SYS=WATCHOS
4418                 arch_target=arm;
4419                 arm_fpu=VFP_HARD
4420                 ACCESS_UNALIGNED="no"
4421                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4422                 ;;
4424         arm*-darwin*)
4425                 TARGET=ARM;
4426                 arch_target=arm;
4427                 ACCESS_UNALIGNED="no"
4428                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4429                 ;;
4430         arm*-linux*)
4431                 TARGET=ARM;
4432                 arch_target=arm;
4433                 ACCESS_UNALIGNED="no"
4434                 AOT_SUPPORTED="yes"
4435                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4436                 BTLS_SUPPORTED=yes
4437                 BTLS_PLATFORM=arm
4438                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4439                 case "$target" in
4440                 arm*-linux*-gnueabi)
4441                         BTLS_PLATFORM=armsoft
4442                         ;;
4443                 esac
4444                 ;;
4445         arm*-netbsd*-eabi*)
4446                 TARGET=ARM;
4447                 arch_target=arm;
4448                 ACCESS_UNALIGNED="no"
4449                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4450                 ;;
4451         aarch64-*darwin*ilp32)
4452                 TARGET=ARM6432
4453                 arch_target=arm64
4454                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4455                 sizeof_register=8
4456                 # assuming no other target other than watchOS is using aarch64*darwin triple
4457                 TARGET_SYS=WATCHOS
4458                 ;;
4459         aarch64-*)
4460                 # https://lkml.org/lkml/2012/7/15/133
4461                 TARGET=ARM64
4462                 arch_target=arm64
4463                 boehm_supported=false
4464                 AOT_SUPPORTED="yes"
4465                 BTLS_SUPPORTED=yes
4466                 BTLS_PLATFORM=aarch64
4467                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4468                 ;;
4469         s390x-*-linux*)
4470                 TARGET=S390X;
4471                 arch_target=s390x;
4472                 ACCESS_UNALIGNED="yes"
4473                 BTLS_SUPPORTED=yes
4474                 BTLS_PLATFORM=s390x
4475                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4476                 ;;
4477         riscv32-*)
4478                 TARGET=RISCV32
4479                 ACCESS_UNALIGNED=no
4480                 AOT_SUPPORTED=no
4481                 BTLS_SUPPORTED=yes
4482                 BTLS_PLATFORM=riscv32
4483                 arch_target=riscv32
4484                 boehm_supported=false
4485                 ;;
4486         riscv64*)
4487                 TARGET=RISCV64
4488                 ACCESS_UNALIGNED=no
4489                 AOT_SUPPORTED=no
4490                 BTLS_SUPPORTED=yes
4491                 BTLS_PLATFORM=riscv64
4492                 arch_target=riscv64
4493                 boehm_supported=false
4494                 ;;
4495 esac
4497 HOST=$TARGET
4499 if test "x$host" != "x$target"; then
4500    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4501    enable_mcs_build=no
4502    enable_support_build=no
4503    BTLS_SUPPORTED=no
4504    # Can't use tls, since it depends on the runtime detection of tls offsets
4505    # in mono-compiler.h
4506    with_tls=pthread
4507    target_mach=no
4508    case "$target" in
4509    wasm32*)
4510                 TARGET=WASM
4511                 arch_target=wasm
4512                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4513                 ;;
4514    arm*-darwin*)
4515                 TARGET=ARM;
4516                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4517                 case "$target" in
4518                 armv7k-*)
4519                         arm_fpu=VFP_HARD
4520                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4521                         ;;
4522                 esac            
4523                 ;;
4524    powerpc64-ps3-linux-gnu)
4525                 TARGET=POWERPC64
4526                 arch_target=powerpc64
4527                 AC_DEFINE(TARGET_PS3, 1, [...])
4528                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4529                 # uses this define
4530                 AC_DEFINE(__mono_ppc64__, 1, [...])
4531                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4532                 sizeof_register=8
4533                 target_byte_order=G_BIG_ENDIAN
4534                 ;;
4535    powerpc64-xbox360-linux-gnu)
4536                 TARGET=POWERPC64
4537                 arch_target=powerpc64
4538                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4539                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4540                 # uses this define
4541                 sizeof_register=8
4542                 target_byte_order=G_BIG_ENDIAN
4543                 ;;
4544    arm*-linux-*)
4545                 TARGET=ARM;
4546                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4547                 ;;
4548    arm*-netbsd*-eabi*)
4549                 TARGET=ARM;
4550                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4551                 ;;
4552    i686*-linux-*)
4553                 TARGET=X86;
4554                 ;;
4555    i*86-apple-*)
4556                 TARGET=X86;
4557                 ;;
4558    x86_64*-linux-*)
4559                 TARGET=AMD64;
4560                 ;;
4561    x86_64-ps4-freebsd)
4562                 TARGET=AMD64;
4563                 AC_DEFINE(TARGET_PS4, 1, [...])
4564                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4565                 CPPFLAGS="$CPPFLAGS"
4566                 target_win32=no
4567                 ;;
4568         aarch64*darwin*_ilp32)
4569                 TARGET=ARM6432;
4570                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4571                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4572                 ;;
4573         aarch64-*)
4574                 TARGET=ARM64
4575                 ;;
4576         riscv32*)
4577                 TARGET=RISCV32
4578                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4579                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4580                 arch_target=riscv32
4581                 target_mach=no
4582                 with_tls=pthread
4583                 ;;
4584         riscv64*)
4585                 TARGET=RISCV64
4586                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4587                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4588                 arch_target=riscv64
4589                 target_mach=no
4590                 with_tls=pthread
4591                 ;;
4592         x86_64-google-fuchsia)
4593                 TARGET=AMD64
4594                 target_win32=nop
4595                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
4596                 ;;
4597         *)
4598                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4599         esac
4601         case "$target" in
4602         *-darwin*)
4603                 target_mach=yes
4604                 ;;
4605         *-linux-android*)
4606                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4607                 ;;
4608         esac
4611 case "$TARGET" in
4612 WASM)
4613         AC_DEFINE(TARGET_WASM, 1, [...])
4614         arch_target=wasm
4615         ;;
4616 X86)
4617         AC_DEFINE(TARGET_X86, 1, [...])
4618         arch_target=x86
4619         ;;
4620 AMD64)
4621         AC_DEFINE(TARGET_AMD64, 1, [...])
4622         arch_target=amd64
4623         ;;
4624 ARM)
4625         AC_DEFINE(TARGET_ARM, 1, [...])
4626         arch_target=arm
4627         ACCESS_UNALIGNED="no"
4628         ;;
4629 ARM64|ARM6432)
4630         AC_DEFINE(TARGET_ARM64, 1, [...])
4631         arch_target=arm64
4632         ;;
4633 POWERPC)
4634         AC_DEFINE(TARGET_POWERPC, 1, [...])
4635         ;;
4636 POWERPC64)
4637         AC_DEFINE(TARGET_POWERPC, 1, [...])
4638         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4639         ;;
4640 S390X)
4641         AC_DEFINE(TARGET_S390X, 1, [...])
4642         ;;
4643 MIPS)
4644         AC_DEFINE(TARGET_MIPS, 1, [...])
4645         ;;
4646 SPARC)
4647         AC_DEFINE(TARGET_SPARC, 1, [...])
4648         ;;
4649 SPARC64)
4650         AC_DEFINE(TARGET_SPARC64, 1, [...])
4651         ;;
4652 RISCV32)
4653         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4654         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4655         ;;
4656 RISCV64)
4657         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4658         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4659         ;;
4660 esac
4662 case "$TARGET" in
4663 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4664     target_sizeof_void_p=4
4665     ;;
4666 *64* | S390X)
4667     target_sizeof_void_p=8
4668     ;;
4670     AC_MSG_ERROR([unknown target])
4671     ;;
4672 esac
4674 case "$HOST" in
4675 WASM)
4676         AC_DEFINE(HOST_WASM, 1, [...])
4677         ;;
4678 X86)
4679         AC_DEFINE(HOST_X86, 1, [...])
4680         ;;
4681 AMD64)
4682         AC_DEFINE(HOST_AMD64, 1, [...])
4683         ;;
4684 ARM)
4685         AC_DEFINE(HOST_ARM, 1, [...])
4686         ;;
4687 ARM64)
4688         AC_DEFINE(HOST_ARM64, 1, [...])
4689         ;;
4690 POWERPC)
4691         AC_DEFINE(HOST_POWERPC, 1, [...])
4692         ;;
4693 POWERPC64)
4694         AC_DEFINE(HOST_POWERPC, 1, [...])
4695         AC_DEFINE(HOST_POWERPC64, 1, [...])
4696         ;;
4697 S390X)
4698         AC_DEFINE(HOST_S390X, 1, [...])
4699         ;;
4700 MIPS)
4701         AC_DEFINE(HOST_MIPS, 1, [...])
4702         ;;
4703 SPARC)
4704         AC_DEFINE(HOST_SPARC, 1, [...])
4705         ;;
4706 SPARC64)
4707         AC_DEFINE(HOST_SPARC64, 1, [...])
4708         ;;
4709 RISCV32)
4710         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4711         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4712         ;;
4713 RISCV64)
4714         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4715         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4716         ;;
4717 esac
4719 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4720 case "$HOST" in
4721 X86 | AMD64 | ARM | ARM64)
4722         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4723         ;;
4724 esac
4726 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4727 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4729 dnl *************
4730 dnl *** VTUNE ***
4731 dnl *************
4733 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4734 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4736 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4738 if test "x$enable_vtune" = "xyes"; then
4739         if test "x$with_vtune" = "x"; then
4740                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4741         else
4742                 VTUNE_PATH=$with_vtune
4743         fi
4744         VTUNE_INCLUDE=$VTUNE_PATH/include
4745         case "$TARGET" in
4746         X86)
4747                 VTUNE_LIB=$VTUNE_PATH/lib32
4748                 ;;
4749         AMD64)
4750                 VTUNE_LIB=$VTUNE_PATH/lib64
4751                 ;;
4752         *)
4753                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4754                 ;;
4755         esac
4756         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4757                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4758         fi
4759         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4760                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4761         fi
4763         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4764         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4766         AC_SUBST(VTUNE_LIBS)
4767         AC_SUBST(VTUNE_CFLAGS)
4769 dnl Use GCC atomic ops if they work on the target.
4770 if test x$GCC = "xyes"; then
4771         case $TARGET in
4772         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4773                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4774                 ;;
4775         esac
4778 if test "x$target_mach" = "xyes"; then
4780    if test "x$TARGET_SYS" = "xWATCHOS"; then
4781           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4782           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4783           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4784           BTLS_SUPPORTED=no
4785    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4786           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4787           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4788           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4789           BTLS_SUPPORTED=no
4790           target_ios=yes
4791    else
4792        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4793        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4794        #error fail this for ios
4795        #endif
4796        ], [
4797                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4798           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4799           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4800           target_osx=yes
4801        ], [
4802           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4803           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4804           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4805           BTLS_SUPPORTED=no
4806                   target_ios=yes
4807        ])
4808         fi
4809    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4812 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4814 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4816 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4817    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4818 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4819    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4820 else
4821    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4824 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4826 if test "x$sizeof_register" = "x4"; then
4827   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4828 elif test "x$sizeof_register" = "x8"; then
4829   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4830 else
4831   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4834 if test "x$have_visibility_hidden" = "xyes"; then
4835    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4838 if test "x$have_deprecated" = "xyes"; then
4839    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4842 dnl 
4843 dnl Simple Generational checks (sgen)
4845 SGEN_DEFINES=
4846 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4847 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4848 if test x$buildsgen = xyes; then
4849    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4850    SGEN_DEFINES="-DHAVE_SGEN_GC"
4852         conc_gc_msg=""
4853    if test x$with_sgen_default_concurrent != xno; then
4854        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4855            conc_gc_msg=" (concurrent by default)"
4856    fi
4858    if test "x$gc_msg" = "x"; then
4859       gc_msg="sgen$conc_gc_msg"
4860    else
4861       gc_msg="sgen$conc_gc_msg and $gc_msg"
4862    fi
4864 AC_SUBST(SGEN_DEFINES)
4865 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4867 jit_status="Building and using the JIT"
4869 libsuffix=".so"
4871 case "$host" in
4872      *-*-aix*)
4873         dnl on AIX/PASE, shared libraries can be and usually are inside archives
4874         dnl so, we specify them by libfoo.a(libfoo.so.0) for libtool's conventions,
4875         dnl or libfoo.a(shr[_64].o) for the AIX system convention,
4876         dnl or lib.so[.0](shr[_64].o) for libtool's hybrid convention
4877         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX
4878         LIBC="libc.a(shr_64.o)"
4879         # Thanks, I hate it! This is crumbly, especially the one-liner.
4880         AC_MSG_CHECKING([how to dlopen libintl])
4881         AC_LINK_IFELSE([AC_LANG_SOURCE([
4882                 /* XXX: Check for libintl header/gettext func better? */
4883                 #include <libintl.h>
4885                 int main (void) {
4886                         gettext("Dummy for autoconf");
4887                         return 1;
4888                 }
4889         ])],
4890         [
4891         INTL="$(dump -X64 -Hp conftest$EXEEXT | grep libintl | cut -c 38- | tr -s " " | awk '{print $1"("$2")"}')"
4892         AC_MSG_RESULT([yes, $INTL])
4893         ],
4894         [
4895         INTL="libintl.a(libintl.so.8)"
4896         AC_MSG_RESULT([no, falling back to $INTL])
4897         ])
4898         SQLITE3="libsqlite3.a(libsqlite3.so.0)"
4899         # it's very tempting to set a libsuffix, but it depends on the soname value
4900         ;;
4901      *-*-os400*)
4902         dnl However, IBM's packages for i try to be more "normal" than the AIX world, naming wise.
4903         dnl The library archives has "normal" .so names, but they're members with predictable "shr" names for fat libraries.
4904         LIBC="libc.a(shr_64.o)"
4905         INTL="libintl.so(shr_64.o)"
4906         SQLITE3="libsqlite3.so(shr_64.o)"
4907         # likewise, it's safer to assume ".so(shr_64.o)" due to official IBM packages being built this way, but as with AIX, others may not be guaranteed
4908         # it may be worth revisiting this in the future
4909         ;;
4910      *-*-darwin*)
4911         libsuffix=".dylib"
4912         LIBC="libc.dylib"
4913         INTL="libintl.dylib"
4914         SQLITE="libsqlite.0.dylib"
4915         SQLITE3="libsqlite3.0.dylib"
4916         X11="libX11.dylib"
4917         GDKX11="libgdk-x11-2.0.dylib"
4918         GTKX11="libgtk-x11-2.0.dylib"
4919         ;;
4920      *-*-*netbsd*)
4921         LIBC="libc.so"
4922         INTL="libintl.so"
4923         SQLITE="libsqlite.so"
4924         SQLITE3="libsqlite3.so"
4925         ;;
4926      *-*-kfreebsd*-gnu)
4927         LIBC="libc.so.0.1"
4928         INTL="libc.so.0.1"
4929         X11="libX11.so.6"
4930         ;;
4931     *-*-*freebsd*)
4932         LIBC="libc.so.7"
4933         INTL="libintl.so"
4934         SQLITE="libsqlite.so"
4935         SQLITE3="libsqlite3.so"
4936         ;;
4937     *-*-*openbsd*)
4938         LIBC="libc.so"
4939         INTL="libintl.so"
4940         SQLITE="libsqlite.so"
4941         SQLITE3="libsqlite3.so"
4942         ;;
4943     *-*-*linux*)
4944         AC_PATH_X
4945         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4946         AC_MSG_CHECKING(for the soname of libX11.so)
4947         for i in $x_libraries $dlsearch_path; do
4948                 for r in 4 5 6; do
4949                         if test -f $i/libX11.so.$r; then
4950                                 X11=libX11.so.$r
4951                                 AC_MSG_RESULT($X11)
4952                         fi
4953                 done
4954         done
4955         
4956         if test "x$X11" = "xlibX11.so"; then
4957                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4958                 X11=libX11.so.6
4959         fi
4960         ;;
4961 esac
4963 AC_SUBST(libsuffix)
4965 ######################################
4966 # EGLIB CHECKS
4967 ######################################
4969 GNUC_PRETTY=
4970 GNUC_UNUSED=
4971 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4972 if test x$GCC = xyes; then
4973    GNUC_UNUSED='__attribute__((__unused__))'
4974    GNUC_NORETURN='__attribute__((__noreturn__))'
4975    case $host_cpu in
4976      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4977    esac
4979 AC_SUBST(GNUC_PRETTY)
4980 AC_SUBST(GNUC_UNUSED)
4981 AC_SUBST(GNUC_NORETURN)
4982 AC_SUBST(BREAKPOINT)
4984 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4986 case $host in
4987 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4988     PATHSEP='\\'
4989     SEARCHSEP=';'
4990     OS="WIN32"
4991     PIDTYPE='void *'
4992     ;;
4994     PATHSEP='/'
4995     SEARCHSEP=':'
4996     OS="UNIX"
4997     PIDTYPE='int'
4998     ;;
4999 esac
5001 case $host in
5002         *-*-solaris*)
5003         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
5004         ;;
5005 esac
5007 case $target in
5008 arm*-darwin*|aarch64*-*|riscv*)
5009     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
5010     ;;
5011 i*86-*-darwin*)
5012     ORDER=G_LITTLE_ENDIAN
5013     ;;
5014 *-*-haiku*)
5015     LDFLAGS="$LDFLAGS -ltextencoding"
5016     ;;
5017 *-*-openbsd*)
5018     CFLAGS="$CFLAGS -pthread"
5019     LDFLAGS="$LDFLAGS -pthread"
5020     ;;
5021 esac
5023 AC_SUBST(ORDER)
5024 AC_SUBST(PATHSEP)
5025 AC_SUBST(SEARCHSEP)
5026 AC_SUBST(OS)
5027 AC_SUBST(PIDTYPE)
5029 # Defined for all targets/platforms using classic Windows API support.
5030 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
5031 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
5033 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
5034 AC_CHECK_FUNCS(getrlimit)
5035 AC_CHECK_FUNCS(fork execv execve)
5036 AC_CHECK_FUNCS(waitpid)
5038 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
5040 if test x$with_overridable_allocators = xyes; then
5041         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5042   AC_MSG_NOTICE([Overridable allocator support enabled])
5043 else
5044   AC_MSG_NOTICE([Overridable allocator support disabled])
5048 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
5049 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
5050 # removed once support for 10.6 is dropped.
5052 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
5054 if test x$target_osx = xyes; then
5055 AC_CHECK_FUNCS(getpwuid_r)
5056 elif test x$target_ios = xno; then
5057 AC_CHECK_FUNCS(strndup getpwuid_r)
5060 AC_SEARCH_LIBS(sqrtf, m)
5062 # nanosleep may not be part of libc, also search it in other libraries
5063 AC_SEARCH_LIBS(nanosleep, rt)
5065 AC_SEARCH_LIBS(dlopen, dl)
5066 old_ldflags="${LDFLAGS}"
5067 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
5068 if test $lt_cv_prog_gnu_ld = yes; then
5069         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic,-Bsymbolic"
5070 else
5071         case $host in
5072         *-*-aix*|*-*-os400*)
5073                 LDFLAGS="${LDFLAGS} -bsymbolic"
5074                 ;;
5075         *)
5076                 dnl Try to use export-dynamic anyways
5077                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic,-Bsymbolic"
5078                 ;;
5079         esac
5081 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
5082 if test $found_export_dynamic = no; then
5083         LDFLAGS="${old_ldflags}"
5086 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
5087 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
5088 AC_CHECK_LIB(iconv, iconv_open)
5089 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
5090 AC_SUBST(HAVE_ALLOCA_H)
5092 # Get the exact type of size_t, not just its size.
5093 # This is so we can find an exact printf format among u, lu, llu, I64u.
5094 # To avoid warnings about slight mismatches.
5095 # C99 runtime "zu" dependency is being avoided here.
5097 # We have to compile as C++ because C is too lenient
5098 # and lets the wrong thing compile, with warnings.
5100 # Note: "zu" or ifdef <something> have the advantage
5101 # of producing installable "biarch" headers. i.e. one Mac header
5102 # for Mac/x86 and Mac/amd64.
5104 AC_LANG_PUSH(C++)
5106 # Check long before int because it is the overwhelming Unix answer,
5107 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
5109 # long ahead of int also tends to produce biarch-compatible headers except Windows.
5111 AC_MSG_CHECKING(if size_t is unsigned long)
5112 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5113         #include <stddef.h>
5114         unsigned long *a = (size_t*)0;
5115 ])], [
5116         AC_MSG_RESULT(yes)
5117         AC_SUBST(GSIZE_FORMAT, '"lu"')
5118 ], [
5119         AC_MSG_RESULT(no)
5120         AC_MSG_CHECKING(if size_t is unsigned int)
5121         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5122                 #include <stddef.h>
5123                 unsigned *a = (size_t*)0;
5124         ])], [
5125                 AC_MSG_RESULT(yes)
5126                 AC_SUBST(GSIZE_FORMAT, '"u"')
5127         ], [
5128 # At this point the majority of systems have their answer,
5129 # and we descend into non-standard or new-standard territory.
5131 # Check __int64 first because I64 on some systems predates ll, enabling
5132 # new compiler/old runtime interop, and the types always have the same size.
5133                 AC_MSG_RESULT(no)
5134                 AC_MSG_CHECKING(if size_t is unsigned __int64)
5135                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5136                         #include <stddef.h>
5137                         unsigned __int64 *a = (size_t*)0;
5138                 ])], [
5139                         AC_MSG_RESULT(yes)
5140                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
5141                 ], [
5142                         AC_MSG_RESULT(no)
5143                         AC_MSG_CHECKING(if size_t is unsigned long long)
5144                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5145                                 #include <stddef.h>
5146                                 unsigned long long *a = (size_t*)0;
5147                         ])], [
5148                                 AC_MSG_RESULT(yes)
5149                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
5150                         ], [
5151                                 AC_MSG_RESULT(no)
5152                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
5153                         ] )
5154                 ] )
5155         ] )
5156 ] )
5158 AC_LANG_POP
5160 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
5161 # This provides for an exact match with functions that
5162 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
5163 # uintptr_t is not necessarily the same.
5165 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
5166 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
5168 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
5169    GSIZE="size_t"
5170    GSSIZE="ptrdiff_t"
5171 else
5172    GSIZE="uintptr_t"
5173    GSSIZE="intptr_t"
5176 AC_SUBST(GSIZE)
5177 AC_SUBST(GSSIZE)
5178 AC_SUBST(GSIZE_FORMAT)
5181 # END OF EGLIB CHECKS
5184 AC_ARG_WITH([libgdiplus],
5185         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
5186         [], [with_libgdiplus=installed])
5188 # default install location
5189 libgdiplus_install_loc=libgdiplus${libsuffix}
5190 case "$host" in
5191     *-*-*linux*)
5192     libgdiplus_install_loc=libgdiplus${libsuffix}.0
5193     ;;
5194 esac
5196 case $with_libgdiplus in
5197     no)
5198     libgdiplus_loc=
5199     ;;
5201     installed)
5202     libgdiplus_loc=
5203     if test x$cross_compiling = xno; then
5204         if test x$host_darwin = xyes; then
5205             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
5206             if test -x $a; then
5207               libgdiplus_install_loc=$a
5208               libgdiplus_loc=$a
5209             fi
5210         fi
5211     fi
5212     ;;
5214     yes|sibling)
5215     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5216     ;;
5218     /*) # absolute path, assume it is an install location
5219     libgdiplus_loc=$with_libgdiplus
5220     libgdiplus_install_loc=$with_libgdiplus
5221     ;;
5223     *)
5224     libgdiplus_loc=`pwd`/$with_libgdiplus
5225     ;;
5226 esac
5227 AC_SUBST(libgdiplus_loc)
5228 AC_SUBST(libgdiplus_install_loc)
5230 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)
5231 if test "x$icall_symbol_map" = "xyes"; then
5232    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5235 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5236 if test "x$icall_export" = "xyes"; then
5237    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5240 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5241 if test "x$icall_tables" = "xno"; then
5242    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5245 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5247 if test "x$with_tls" = "x__thread"; then
5248         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5249         # Pass the information to libgc
5250         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5251         AC_MSG_CHECKING(if the tls_model attribute is supported)
5252         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5253                 ], [
5254                         AC_MSG_RESULT(yes)
5255                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5256                 ], [
5257                         AC_MSG_RESULT(no)
5258         ])
5261 if test ${TARGET} = ARM; then
5262         dnl ******************************************
5263         dnl *** Check to see what FPU is available ***
5264         dnl ******************************************
5265         AC_MSG_CHECKING(which FPU to use)
5267         #
5268         # This is a bit tricky:
5269         #
5270         # if (__ARM_PCS_VFP) {
5271         #       /* mfloat-abi=hard == VFP with hard ABI */
5272         # } elif (!__SOFTFP__) {
5273         #       /* mfloat-abi=softfp == VFP with soft ABI */
5274         # } else {
5275         #       /* mfloat-abi=soft == no VFP */
5276         # }
5277         #
5278         # The exception is iOS (w/ GCC) where none of the above
5279         # are defined (but iOS always uses the 'softfp' ABI).
5280         #
5281         # No support for FPA.
5282         #
5284         fpu=NONE
5286         # iOS GCC always uses the 'softfp' ABI.
5287         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5288                 fpu=VFP
5289         fi
5291         # Are we using the 'hard' ABI?
5292         if test x$fpu = xNONE; then
5293                 AC_TRY_COMPILE([], [
5294                         #ifndef __ARM_PCS_VFP
5295                         #error "Float ABI is not 'hard'"
5296                         #endif
5297                 ], [
5298                         fpu=VFP_HARD
5299                 ], [
5300                         fpu=NONE
5301                 ])
5302         fi
5304         # No 'hard' ABI. 'soft' or 'softfp'?
5305         if test x$fpu = xNONE; then
5306                 AC_TRY_COMPILE([], [
5307                         #ifdef __SOFTFP__
5308                         #error "Float ABI is not 'softfp'"
5309                         #endif
5310                 ], [
5311                         fpu=VFP
5312                 ], [
5313                         fpu=NONE
5314                 ])
5315         fi
5317         if test x$arm_fpu != x; then
5318            fpu=$arm_fpu
5319         fi
5321         AC_MSG_RESULT($fpu)
5322         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5323         unset fpu
5325         dnl *********************************************
5326         dnl *** Check which ARM version(s) we can use ***
5327         dnl *********************************************
5328         AC_MSG_CHECKING(which ARM version to use)
5330         AC_TRY_COMPILE([], [
5331                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5332                 #error Not on ARM v5.
5333                 #endif
5334         ], [
5335                 arm_v5=yes
5337                 arm_ver=ARMv5
5338         ], [])
5340         AC_TRY_COMPILE([], [
5341                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5342                 #error Not on ARM v6.
5343                 #endif
5344         ], [
5345                 arm_v5=yes
5346                 arm_v6=yes
5348                 arm_ver=ARMv6
5349         ], [])
5351         AC_TRY_COMPILE([], [
5352                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5353                 #error Not on ARM v7.
5354                 #endif
5355         ], [
5356                 arm_v5=yes
5357                 arm_v6=yes
5358                 arm_v7=yes
5360                 arm_ver=ARMv7
5361         ], [])
5363         AC_MSG_RESULT($arm_ver)
5365         if test x$arm_v5 = xyes; then
5366                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5367                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5368         fi
5370         if test x$arm_v6 = xyes; then
5371                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5372                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5373         fi
5375         if test x$arm_v7 = xyes; then
5376                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5377                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5378         fi
5380         if test x$host_linux = xyes; then
5381                 RID="linux-arm"
5382                 COREARCH="arm"
5383                 if test x$fpu = xNONE; then
5384                         RID="linux-armel"
5385                         COREARCH="armel"
5386                 fi
5387         fi
5390 AC_SUBST(RID)
5391 AC_SUBST(COREARCH)
5392 AC_SUBST(CORETARGETS)
5394 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5395         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5397         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5399         if test x$fpabi = xauto; then
5400                 AC_TRY_COMPILE([], [
5401                         #ifdef __riscv_float_abi_double
5402                         #error "double"
5403                         #endif
5404                 ], [
5405                         fpabi=auto
5406                 ], [
5407                         fpabi=double
5408                 ])
5409         fi
5411         if test x$fpabi = xauto; then
5412                 AC_TRY_COMPILE([], [
5413                         #ifdef __riscv_float_abi_single
5414                         #error "single"
5415                         #endif
5416                 ], [
5417                         fpabi=auto
5418                 ], [
5419                         fpabi=single
5420                 ])
5421         fi
5423         if test x$fpabi = xauto; then
5424                 AC_TRY_COMPILE([], [
5425                         #ifdef __riscv_float_abi_soft
5426                         #error "soft"
5427                         #endif
5428                 ], [
5429                         fpabi=auto
5430                 ], [
5431                         fpabi=soft
5432                 ])
5433         fi
5435         case $fpabi in
5436         double)
5437                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5438                 AC_MSG_RESULT([double-precision])
5439                 ;;
5440         single)
5441                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5442                 AC_MSG_ERROR([single-precision, not supported])
5443                 ;;
5444         soft)
5445                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5446                 AC_MSG_RESULT([soft float])
5447                 ;;
5448         auto)
5449                 AC_MSG_ERROR([unknown])
5450                 ;;
5451         *)
5452                 AC_MSG_ERROR([invalid option: $fpabi])
5453                 ;;
5454         esac
5457 if test ${TARGET} = unknown; then
5458         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5459         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5462 if test "x$platform_android" = "xyes"; then
5463         case "x${TARGET}" in
5464         xARM)
5465                 case "x$arm_ver" in
5466                 xARMv5)
5467                         BTLS_SUPPORTED=yes
5468                         BTLS_PLATFORM=android-armv5
5469                         ;;
5470                 xARMv6)
5471                         BTLS_SUPPORTED=yes
5472                         BTLS_PLATFORM=android-armv6
5473                         ;;
5474                 xARMv7)
5475                         BTLS_SUPPORTED=yes
5476                         BTLS_PLATFORM=android-armv7
5477                         ;;
5478                 *)
5479                         BTLS_SUPPORTED=no
5480                         ;;
5481                 esac
5482                 ;;
5483         xARM64)
5484                 BTLS_SUPPORTED=yes
5485                 BTLS_PLATFORM=android-v8a
5486                 ;;
5487         xX86)
5488                 BTLS_SUPPORTED=yes
5489                 BTLS_PLATFORM=android-x86
5490                 ;;
5491         xAMD64)
5492                 BTLS_SUPPORTED=yes
5493                 BTLS_PLATFORM=android-x64
5494                 ;;
5495         *)
5496                 BTLS_SUPPORTED=no
5497                 ;;
5498         esac
5501 if test ${ACCESS_UNALIGNED} = no; then
5502         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5505 if test x$host_darwin = xyes; then
5506         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5507         AS_IF(
5508                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5509                 [AC_MSG_RESULT([no])],
5510                 [
5511                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5512                         AR_FLAGS="Scru"
5513                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5514                         AC_MSG_RESULT([yes])
5515                 ]
5516         )
5519 case "x$libgc" in
5520         xincluded)
5521                 # Pass CPPFLAGS to libgc configure
5522                 # We should use a separate variable for this to avoid passing useless and
5523                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5524                 # This should be executed late so we pick up the final version of CPPFLAGS
5525                 # The problem with this approach, is that during a reconfigure, the main
5526                 # configure scripts gets invoked with these arguments, so we use separate
5527                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5528                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5529                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5530                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5531                 fi
5532                 # Don't pass -finstrument-for-thread-suspension in, 
5533                 # if these are instrumented it will be very bad news 
5534                 # (infinite recursion, undefined parking behavior, etc)
5535                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5536                 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\""
5537                 if test "x$support_boehm" = "xyes"; then
5538                         AC_CONFIG_SUBDIRS(libgc)
5539                 fi
5540                 ;;
5541 esac
5543 MALLOC_MEMPOOLS=no
5544 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5545         if test x$with_malloc_mempools = xyes; then
5546                 MALLOC_MEMPOOLS=yes
5547                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5548         fi
5552 DISABLE_MCS_DOCS=default
5553 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5554         if test x$with_mcs_docs != xyes; then
5555                 DISABLE_MCS_DOCS=yes
5556         fi
5558 if test -n "$INSTALL_4_x_TRUE"; then :
5559         DISABLE_MCS_DOCS=yes
5561 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5562    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5565 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)],[
5566         if test x$with_lazy_gc_thread_creation != xno ; then
5567                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5568         fi
5569 ], [with_lazy_gc_thread_creation=no])
5571 dnl *****************************
5572 dnl *** Thread suspend policy ***
5573 dnl *****************************
5575 dnl Set a default hybrid or cooperative suspend on some platforms
5577 dnl Coop default is set by the bitcode preset.
5579 dnl If coop isn't on by default, maybe hybrid should be?
5580 if test x$enable_cooperative_suspend_default != xyes; then
5581         case $HOST in
5582         X86 | AMD64)
5583                 dnl Some host/target confusion, there's no host_osx (and
5584                 dnl host_darwin would be true on iOS not just macOS).
5585                 if test x$target_osx = xyes; then
5586                         enable_hybrid_suspend_default=yes
5587                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5588                         enable_hybrid_suspend_default=yes
5589                 fi
5590                 ;;
5591         esac
5594 dnl Now check if there were flags overriding the defaults
5596 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])
5597 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5599 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5600         enable_cooperative_suspend=$with_cooperative_gc
5603 if test x$enable_cooperative_suspend = xdefault; then
5604         enable_cooperative_suspend=$enable_cooperative_suspend_default
5607 if test x$enable_cooperative_suspend != xno; then
5608         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5611 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5613 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])
5615 if test x$enable_hybrid_suspend = xdefault; then
5616    enable_hybrid_suspend=$enable_hybrid_suspend_default
5619 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5620         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5623 if test x$enable_hybrid_suspend != xno ; then
5624         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5627 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5629 dnl End of thread suspend policy
5631 dnl *******************************
5632 dnl *** Copy stack data support ***
5633 dnl *******************************
5635 dnl Disable copy_stack_data on platforms supporting full context and
5636 dnl having access to full stack of running threads.
5637 if test x$enable_copy_stack_data_default != xno; then
5638         case $HOST in
5639         X86 | AMD64)
5640                 if test x$target_osx = xyes; then
5641                         dnl Some host/target confusion, there's no host_osx (and
5642                         dnl host_darwin would be true on iOS not just macOS).
5643                         enable_copy_stack_data_default=no
5644                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5645                         enable_copy_stack_data_default=no
5646                 fi
5647                 ;;
5648         esac
5651 AC_ARG_ENABLE(copy_stack_data, [ --enable-copy-stack-data     Enable copy_stack_data feature for hybrid/cooperative suspend scenarios, (defaults to yes)], [], [enable_copy_stack_data=default])
5653 if test x$enable_copy_stack_data = xdefault; then
5654    enable_copy_stack_data=$enable_copy_stack_data_default
5657 if test x$enable_copy_stack_data != xno ; then
5658         AC_DEFINE(ENABLE_COPY_STACK_DATA,1,[Enable copy_stack_data feature for hybrid/cooperative suspend scenarios])
5661 dnl End of Copy stack data support
5663 dnl ***************************
5664 dnl *** feature experiments ***
5665 dnl ***************************
5667 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5668 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5670         if test x$enable_experiment != x ; then
5671                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5672         fi
5673         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5674                 eval "mono_experiment_test_enable_$feature='yes'"
5675         done
5677         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5678                 eval "mono_experiment_test_enable_null='yes'"
5679                 true
5680         fi
5682         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5683                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5684         fi
5685 ],[])
5687 dnl **********************
5688 dnl *** checked builds ***
5689 dnl **********************
5691 AC_ARG_ENABLE(checked_build, [  --enable-checked-build=LIST      To enable checked build (expensive asserts), configure with a comma-separated LIST of checked build modules and then include that same list in the environment variable MONO_CHECK_MODE at runtime. Recognized checked build modules: all, gc, metadata, thread, private_types, crash_reporting],[
5693         if test x$enable_checked_build != x ; then
5694                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5695         fi
5696         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5697                 eval "mono_checked_build_test_enable_$feature='yes'"
5698         done
5700         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5701                 eval "mono_checked_build_test_enable_gc='yes'"
5702                 eval "mono_checked_build_test_enable_metadata='yes'"
5703                 eval "mono_checked_build_test_enable_thread='yes'"
5704                 eval "mono_checked_build_test_enable_private_types='yes'"
5705                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5706         fi
5708         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5709                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5710         fi
5712         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5713                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5714         fi
5716         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5717                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5718         fi
5720         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5721                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5722         fi
5724         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5725                 # Required
5726                 with_overridable_allocators=yes
5727                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5729                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5730         fi
5731 ], [])
5733 dnl End of checked builds
5735 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5737 AC_CHECK_HEADER([malloc.h], 
5738                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5739                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5741 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5742 # instead of libmono-static.a
5743 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5744    LIBMONO_LA=libmini-static.la
5745 else
5746    if test x$buildsgen = xyes; then
5747       LIBMONO_LA=libmonosgen-$API_VER.la
5748    else
5749       LIBMONO_LA=libmonoboehm-$API_VER.la
5750    fi
5752 AC_SUBST(LIBMONO_LA)
5754 dnl **************
5755 dnl ***  Btls  ***
5756 dnl **************
5758 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5759 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5760 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5761 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5762 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5763 AC_ARG_WITH(btls_android_ndk_asm_workaround, [  --with-btls-android-ndk-asm-workaround        Work around a problem with NDK r18+ clang compiler when compiling some AES assembly for ARM])
5765 if test "x$with_btls_android_api" = "x" ; then
5766         case "$BTLS_PLATFORM" in
5767                 android-armv5)
5768                         with_btls_android_api=16" ;;
5769                 android-armv6)
5770                         with_btls_android_api=16" ;;
5771                 android-armv7)
5772                         with_btls_android_api=16 ;;
5773                 android-v8a)
5774                         with_btls_android_api=21 ;;
5775                 android-x86)
5776                         with_btls_android_api=16 ;;
5777                 android-x64)
5778                         with_btls_android_api=21 ;;
5779         esac
5782 if test "x$enable_btls" = "xno"; then
5783    enable_btls_lib=no
5786 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5788 btls_android=no
5789 if test "x$enable_btls" = "xyes"; then
5790         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5791         if test "x$CMAKE" = "xno"; then
5792                 AC_MSG_ERROR("cmake not found")
5793         fi
5795         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5796         AC_SUBST(BTLS_ROOT)
5798         btls_arch=
5799         btls_cflags=
5800         BTLS_CMAKE_ARGS=
5802         if test "x$host_win32" = "xyes"; then
5803                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5804         fi
5806         case "$BTLS_PLATFORM" in
5807         i386)
5808                 btls_arch=i386
5809                 btls_cflags="-m32"
5810                 case $host_os in
5811                         darwin*)
5812                                 btls_cflags="$btls_cflags -arch i386"
5813                                 ;;
5814                         mingw*|cygwin*)
5815                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5816                                 if test "x$HAVE_YASM" != "xyes"; then
5817                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5818                                 fi
5819                                 ;;
5820                 esac
5821                 ;;
5822         x86_64)
5823                 btls_arch=x86_64
5824                 case $host_os in
5825                         mingw*|cygwin*)
5826                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5827                                 if test "x$HAVE_YASM" != "xyes"; then
5828                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5829                                 fi
5830                                 ;;
5831                 esac
5832                 ;;
5833         arm)
5834                 btls_arch=arm
5835                 btls_cflags="-DOPENSSL_NO_ASM=1"
5836                 ;;
5837         armsoft)
5838                 btls_arch=arm
5839                 btls_cflags="-DOPENSSL_NO_ASM=1"
5840                 ;;
5841         aarch64)
5842                 btls_arch=aarch64
5843                 btls_cflags="-march=armv8-a+crypto"
5844                 ;;
5845         s390x)
5846                 btls_arch=s390x
5847                 ;;
5848         powerpc)
5849                 btls_arch=powerpc
5850                 case $host_os in
5851                         aix*|os400*)
5852                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5853                                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5854                 esac
5855                 ;;
5856         android-armv5)
5857                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5858                 ;;
5859         android-armv6)
5860                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5861                 ;;
5862         android-armv7)
5863                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5864                 ;;
5865         android-v8a)
5866                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5867                 ;;
5868         android-x86)
5869                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5870                 ;;
5871         android-x64)
5872                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5873                 ;;
5874         riscv32)
5875                 btls_arch=riscv32
5876                 ;;
5877         riscv64)
5878                 btls_arch=riscv64
5879                 ;;
5880         *)
5881                 AC_MSG_ERROR(Invalid BTLS platform)
5882         esac
5884         if test "x$platform_android" = "xyes"; then
5885                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5886                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5887                 fi
5889                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5890                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5891                 fi
5893                 btls_android=yes
5894                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5895                 if test "x$with_btls_android_ndk" != "x"; then
5896                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5897                 else
5898                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5899                 fi
5900         fi
5902         if test "x$btls_arch" != "x"; then
5903                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5904         fi
5906         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5907         AC_SUBST(BTLS_ARCH)
5908         AC_SUBST(BTLS_CFLAGS)
5909         AC_SUBST(BTLS_PLATFORM)
5910         AC_SUBST(BTLS_CMAKE_ARGS)
5912         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5913 else
5914         enable_btls=no
5917 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5919 if test x$DISABLE_MCS_DOCS = xyes; then
5920    docs_dir=""
5921 else
5922    docs_dir=docs
5924 AC_SUBST(docs_dir)
5926 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5927 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5928 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5930 libmono_ldflags="$libmono_ldflags $LIBS"
5932 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5933 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5934 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5935 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5936 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5937 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5938 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5939 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5940 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5941 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5942 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5943 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5944 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5945 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5946 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5947 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5948 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5949 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5950 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5951 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5952 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5953 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5954 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5955 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5957 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5959 AC_SUBST(LIBC)
5960 AC_SUBST(INTL)
5961 AC_SUBST(SQLITE)
5962 AC_SUBST(SQLITE3)
5963 AC_SUBST(ODBC)
5964 AC_SUBST(X11)
5965 AC_SUBST(GDKX11)
5966 AC_SUBST(GTKX11)
5967 AC_SUBST(XINERAMA)
5968 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5969 AC_SUBST(arch_target)
5971 #This must always be defined when building the runtime
5972 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5974 mono_build_root=`pwd`
5975 AC_SUBST(mono_build_root)
5977 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5978 if test x$host_win32 = xno; then
5979         if test x$enable_msvc = xyes; then
5980                 echo "Error, --enable-msvc only supported for Windows builds."
5981                 exit 1
5982         fi
5984 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5986 if test "x$enable_msvc" = "xyes"; then
5987         if test "x$support_boehm" = "xyes"; then
5988                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5989                 exit 1
5990         fi
5991         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5992         if test "x$host_cpu" = "xi686"; then
5993                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5994                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5995                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5996                 mono_runtime_wrapper=$mono_runtime
5997         else
5998                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5999                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
6000                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
6001                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
6002         fi
6003         AC_SUBST(mono_msvc_build_dir)
6004         AC_SUBST(mono_msvc_build_lib_dir)
6005         AC_SUBST(mono_msvc_build_bin_dir)
6006 else
6007         mono_runtime=mono/mini/mono
6008         mono_runtime_wrapper=$mono_runtime
6011 AC_SUBST(mono_runtime)
6012 AC_SUBST(mono_runtime_wrapper)
6014 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.1.0-release/csc.exe
6015 VBCS_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.1.0-release/VBCSCompiler.exe
6017 if test $csc_compiler = mcs; then
6018   CSC=$mcs_topdir/class/lib/build/mcs.exe
6019 else
6020   CSC=$CSC_LOCATION
6023 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
6025 mono_cfg_root=$mono_build_root/runtime
6026 if test x$host_win32 = xyes; then
6027   if test "x$cross_compiling" = "xno"; then
6028     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
6029     CSC=`cygpath -m -a $CSC`
6030     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
6031     VBCS_LOCATION=`cygpath -m -a $VBCS_LOCATION`
6032   else
6033     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
6034   fi
6035 else
6036   mono_cfg_dir=$mono_cfg_root/etc
6039 if test "x$platform_android" = "xyes"; then
6040   mono_cfg_dir=
6043 AC_SUBST(mono_cfg_dir)
6045 AC_SUBST(CSC)
6047 AC_CONFIG_FILES([po/mcs/Makefile.in])
6049 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
6050 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
6051 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
6053 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
6054 [   depth=../../../..
6055     case $srcdir in
6056     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6057     .) reldir=$depth ;;
6058     *) reldir=$depth/$srcdir ;;
6059     esac
6060     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
6061     cd runtime/etc/mono/1.0
6062     rm -f machine.config
6063     $LN_S $reldir/data/net_1_1/machine.config machine.config
6064     cd $depth
6065 ],[LN_S='$LN_S'])
6067 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
6068 [   depth=../../../..
6069     case $srcdir in
6070     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6071     .) reldir=$depth ;;
6072     *) reldir=$depth/$srcdir ;;
6073     esac
6074     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6075     cd runtime/etc/mono/2.0
6076     rm -f machine.config
6077     $LN_S $reldir/data/net_2_0/machine.config machine.config
6078     cd $depth
6079 ],[LN_S='$LN_S'])
6081 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
6082 [   depth=../../../..
6083     case $srcdir in
6084     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6085     .) reldir=$depth ;;
6086     *) reldir=$depth/$srcdir ;;
6087     esac
6088     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6089     cd runtime/etc/mono/2.0
6090     rm -f web.config
6091     $LN_S $reldir/data/net_2_0/web.config web.config
6092     cd $depth
6093 ],[LN_S='$LN_S'])
6095 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
6096 [   depth=../../..
6097     case $srcdir in
6098     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6099     .) reldir=$depth ;;
6100     *) reldir=$depth/$srcdir ;;
6101     esac
6102     $ac_aux_dir/install-sh -d runtime/etc/mono/
6103     cd runtime/etc/mono/
6104     rm -f browscap.ini
6105     $LN_S $reldir/data/browscap.ini browscap.ini
6106     cd $depth
6107 ],[LN_S='$LN_S'])
6109 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
6110 [   depth=../../../../..
6111     case $srcdir in
6112     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6113     .) reldir=$depth ;;
6114     *) reldir=$depth/$srcdir ;;
6115     esac
6116     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
6117     cd runtime/etc/mono/2.0/Browsers
6118     rm -f Compat.browser
6119     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6120     cd $depth
6121 ],[LN_S='$LN_S'])
6123 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
6124 [   depth=../../../../..
6125     case $srcdir in
6126     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6127     .) reldir=$depth ;;
6128     *) reldir=$depth/$srcdir ;;
6129     esac
6130     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
6131     cd runtime/etc/mono/4.0/Browsers
6132     rm -f Compat.browser
6133     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6134     cd $depth
6135 ],[LN_S='$LN_S'])
6137 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
6138 [   depth=../../../../..
6139     case $srcdir in
6140     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6141     .) reldir=$depth ;;
6142     *) reldir=$depth/$srcdir ;;
6143     esac
6144     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
6145     cd runtime/etc/mono/4.5/Browsers
6146     rm -f Compat.browser
6147     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6148     cd $depth
6149 ],[LN_S='$LN_S'])
6151 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
6152 [   depth=../../../..
6153     case $srcdir in
6154     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6155     .) reldir=$depth ;;
6156     *) reldir=$depth/$srcdir ;;
6157     esac
6158     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6159     cd runtime/etc/mono/4.0
6160     rm -f machine.config
6161     $LN_S $reldir/data/net_4_0/machine.config machine.config
6162     cd $depth
6163 ],[LN_S='$LN_S'])
6165 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
6166 [   depth=../../../..
6167     case $srcdir in
6168     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6169     .) reldir=$depth ;;
6170     *) reldir=$depth/$srcdir ;;
6171     esac
6172     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6173     cd runtime/etc/mono/4.0
6174     rm -f web.config
6175     $LN_S $reldir/data/net_4_0/web.config web.config
6176     cd $depth
6177 ],[LN_S='$LN_S'])
6179 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
6180 [   depth=../../../..
6181     case $srcdir in
6182     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6183     .) reldir=$depth ;;
6184     *) reldir=$depth/$srcdir ;;
6185     esac
6186     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6187     cd runtime/etc/mono/4.5
6188     rm -f machine.config
6189     $LN_S $reldir/data/net_4_5/machine.config machine.config
6190     cd $depth
6191 ],[LN_S='$LN_S'])
6193 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
6194 [   depth=../../../..
6195     case $srcdir in
6196     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6197     .) reldir=$depth ;;
6198     *) reldir=$depth/$srcdir ;;
6199     esac
6200     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6201     cd runtime/etc/mono/4.5
6202     rm -f web.config
6203     $LN_S $reldir/data/net_4_5/web.config web.config
6204     cd $depth
6205 ],[LN_S='$LN_S'])
6207 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])
6208 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])
6209 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
6212 # Mono.Native Support
6213 # -------------------
6214 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
6215 # It is built as a stand-alone shared library and not bundled with the runtime because we
6216 # may need to build two different versions of it.
6218 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
6219 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
6221 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
6222 # implementation accordingly.  We build a single `libmono-native` shared library.
6224 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
6226 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
6227 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
6228 # depending on platform.
6230 # We build two versions of the shared library:
6231 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
6232 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
6234 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
6235 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
6236 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
6238 # This can be called by automated tests both to ensure that the library has been correctly installed and also
6239 # to verify that it's the correct version of it.
6242 AC_MSG_CHECKING([Mono.Native support])
6243 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
6244 if test x$disable_mono_native = xyes; then
6245         mono_native=no
6246 elif test x$target_osx = xyes; then
6247         MONO_NATIVE_CC=$CC
6248         MONO_NATIVE_CXX=$CXX
6249         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6250         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6251         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6252         MONO_NATIVE_CFLAGS=$CFLAGS
6253         MONO_NATIVE_LDFLAGS=$LDFLAGS
6255         mono_native=yes
6256         MONO_NATIVE_PLATFORM=macos
6257         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6259         if test x$enable_gss = xyes; then
6260                 MONO_NATIVE_LDFLAGS="$MONO_NATIVE_LDFLAGS -framework GSS"
6261         fi
6263         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6264                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6266         if test x$mono_native_compat = xyes; then
6267                 mono_native_compat=yes
6268                 mono_native_text="Mac OSX (compat + unified v10.12)"
6269                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6270                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6271                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6272                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6273                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6275                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6276                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6277                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6278                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6279                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6280                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6281         else
6282                 mono_native_compat=no
6283                 mono_native_text="Mac OSX"
6284         fi
6285 elif test x$mono_native_platform_ios = xyes; then
6286         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6288         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6289                 if test x$mono_native_ios_sim = xyes; then
6290                         mono_native_ios_target=ios-simulator
6291                         mono_native_text="iOS Simulator"
6292                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6293                 else
6294                         mono_native_ios_target=iphoneos
6295                         mono_native_text="iOS Device"
6296                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6297                 fi
6298                 mono_native_unified_version="10.0"
6299                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6300         ], [
6301                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6302                         if test x$mono_native_ios_sim = xyes; then
6303                                 mono_native_ios_target=tvos-simulator
6304                                 mono_native_text="AppleTV Simulator"
6305                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6306                         else
6307                                 mono_native_ios_target=tvos
6308                                 mono_native_text="AppleTV Device"
6309                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6310                         fi
6311                         mono_native_unified_version="10.0"
6312                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6313                 ], [
6314                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6315                                 if test x$mono_native_ios_sim = xyes; then
6316                                         mono_native_ios_target=watchos-simulator
6317                                         mono_native_text="Apple Watch Simulator"
6318                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6319                                 else
6320                                         mono_native_ios_target=watchos
6321                                         mono_native_text="Apple Watch Device"
6322                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6323                                 fi
6324                                 mono_native_unified_version="5.0"
6325                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6326                         ], [
6327                                 AC_MSG_ERROR([Unknown iOS Target])
6328                         ])
6329                 ])
6330         ])
6332         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6334         if test x$with_bitcode = xyes; then
6335                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6336                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6337         else
6338                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6339         fi
6341         if test x$enable_gss = xyes; then
6342                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6343         fi
6345         MONO_NATIVE_CC=$CC
6346         MONO_NATIVE_CXX=$CXX
6347         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6348         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6349         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6350         MONO_NATIVE_CFLAGS=$CFLAGS
6351         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6353         if test x$mono_native_compat = xyes; then
6354                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6355                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6356                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6357                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6358                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6359                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6361                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6362                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6363                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6364                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6365                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6366                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6367         fi
6369         mono_native=yes
6370         MONO_NATIVE_PLATFORM=ios
6371 elif test x$host_linux = xyes; then
6372         mono_native_text="Linux"
6373         MONO_NATIVE_CC=$CC
6374         MONO_NATIVE_CXX=$CXX
6375         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6376         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6377         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6378         MONO_NATIVE_CFLAGS=$CFLAGS
6379         MONO_NATIVE_LDFLAGS=$LDFLAGS
6381         mono_native=yes
6382         mono_native_compat=no
6383         MONO_NATIVE_PLATFORM=linux
6385         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6386 elif test x$target_wasm = xyes; then
6387         mono_native_text="wasm"
6388         MONO_NATIVE_CC=$CC
6389         MONO_NATIVE_CXX=$CXX
6390         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6391         # The system.native code uses _WASM_ to check for wasm
6392         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6393         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6394         MONO_NATIVE_CFLAGS=$CFLAGS
6395         MONO_NATIVE_LDFLAGS=$LDFLAGS
6397         mono_native=yes
6398         mono_native_compat=no
6399         MONO_NATIVE_PLATFORM=linux
6401         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6402 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6403         mono_native_text="AIX"
6404         MONO_NATIVE_CC=$CC
6405         MONO_NATIVE_CXX=$CXX
6406         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6407         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6408         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6409         MONO_NATIVE_CFLAGS=$CFLAGS
6410         dnl nosymbolic- is a hack in case -G for linking is used, as -G seems
6411         dnl to change the way unresolved symbols work on library load in an
6412         dnl incompatible manner. (as references to runtime functions are
6413         dnl resolved later) Default params otherwise are that, so seems OK.
6414         dnl Likewise, we don't seem to need to cover the entire runtime with
6415         dnl it either, on both AIX and PASE. -brtl from -G does seem to spew
6416         dnl Big Scary TOC Warnings (tm) from the linker, but it doesn't seem
6417         dnl problematic with gcc's -mminimal-toc.
6418         dnl ----
6419         dnl flock in AIX exists in libbsd (not the same as freedesktop.org
6420         dnl libbsd) which Mono.Native needs.
6421         dnl Because of the way that the library is built by default, unresolved
6422         dnl references are kept and resolved at runtime. Often, the dependency
6423         dnl chain means libbsd is loaded anyways, but not necessarily. It's
6424         dnl better to explicitly link it, even though it has it shadows libc's
6425         dnl ioctl with its own. (As for the other unresolved imports, those
6426         dnl should be provided by the Mono runtime loaded.)
6427         MONO_NATIVE_LDFLAGS="$LDFLAGS -lbsd -Wl,-bnosymbolic-"
6429         mono_native=yes
6430         mono_native_compat=no
6431         MONO_NATIVE_PLATFORM=aix
6433         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6434 elif case $host_os in freebsd*) true;; *) false;; esac; then
6435         mono_native_text="FreeBSD"
6436         MONO_NATIVE_CC=$CC
6437         MONO_NATIVE_CXX=$CXX
6438         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6439         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6440         MONO_NATIVE_CFLAGS=$CFLAGS
6441         MONO_NATIVE_LDFLAGS=$LDFLAGS
6443         mono_native=yes
6444         mono_native_compat=no
6445         MONO_NATIVE_PLATFORM=freebsd
6446         AC_MSG_CHECKING([Mono.Native support])
6447         AC_MSG_RESULT(freebsd)
6449         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_FREEBSD"
6450 elif test x$platform_android = xyes; then
6451         mono_native_text="Android"
6452         MONO_NATIVE_CC=$CC
6453         MONO_NATIVE_CXX=$CXX
6454         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6455         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6456         MONO_NATIVE_CFLAGS=$CFLAGS
6457         MONO_NATIVE_LDFLAGS=$LDFLAGS
6458         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6460         mono_native=yes
6461         mono_native_compat=no
6462         MONO_NATIVE_PLATFORM=android
6464         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6465 else
6466         mono_native=no
6467         mono_native_text="no"
6470 AC_MSG_RESULT($mono_native_text)
6472 if test x$mono_native_compat = xyes; then
6473         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6474 else
6475         MONO_NATIVE_LIBRARY_NAME=libmono-native
6478 AC_SUBST(MONO_NATIVE_PLATFORM)
6479 AC_SUBST(MONO_NATIVE_CC)
6480 AC_SUBST(MONO_NATIVE_CXX)
6481 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6482 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6483 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6484 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6485 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6486 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6487 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6488 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6489 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6490 AC_SUBST(MONO_NATIVE_CFLAGS)
6491 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6492 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6493 AC_SUBST(MONO_NATIVE_LDFLAGS)
6494 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6495 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6496 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6497 AC_SUBST(MONO_NATIVE_LIBADD)
6499 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6500 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6501 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6502 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6503 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6504 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6505 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6506 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_FREEBSD, test x$MONO_NATIVE_PLATFORM = xfreebsd)
6508 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6509 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6510 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6511 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6512 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6514 ### C++ Linker selection
6516 # We have to lie to autotools, sometimes.
6518 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6519 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6520 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6521 # except if we're linking with LLVM which relies on it.
6523 # Explanation of the hack:
6525 # According to
6526 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6527 # automake chooses the linker that it used to compile a target based on the
6528 # _SOURCES for that target.  If the target is comprised of only C code, it
6529 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6530 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6531 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6533 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6534 # or libc++) linked in - even when Mono is written in C++, we take care not to
6535 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6536 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6537 # C++ linker - LLVM doesn't have the same restrictions.
6539 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6540 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6541 #  automake's autodetection and lets us use the linker that we want.
6543 if test "x$enable_llvm_runtime" = "xyes"; then
6544         AC_SUBST(MONO_CXXLD, [$CXX])
6545 else
6546         AC_SUBST(MONO_CXXLD, [$CC])
6549 ### Set -Werror options
6551 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6553 if test x"$GCC" = xyes; then
6555         if test "x$with_jemalloc" != "xyes"; then
6557                 # incompatible-pointer-types requires gcc circa 5.x
6559                 ORIG_CFLAGS=$CFLAGS
6560                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6561                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6562                 AC_TRY_COMPILE([],[
6563                 ], [
6564                         AC_MSG_RESULT(yes)
6565                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6566                 ], [
6567                         AC_MSG_RESULT(no)
6568                         CFLAGS=$ORIG_CFLAGS
6569                 ])
6571                 CFLAGS="$CFLAGS -Werror=return-type"
6572         fi
6574         # Implicit function declarations are not 64 bit safe
6575         # Do this late, since this causes lots of configure tests to fail
6576         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6577         # jay has a lot of implicit declarations
6578         JAY_CFLAGS="-Wno-implicit-function-declaration"
6581 AC_SUBST(CFLAGS)
6582 AC_SUBST(CPPFLAGS)
6583 AC_SUBST(LDFLAGS)
6585 # Update all submodules recursively to ensure everything is checked out
6586 if test "x$with_core" != "xonly"; then
6587         (cd $srcdir && scripts/update_submodules.sh)
6590 AC_OUTPUT([
6591 Makefile
6592 mono-uninstalled.pc
6593 acceptance-tests/Makefile
6594 llvm/Makefile
6595 scripts/mono-find-provides
6596 scripts/mono-find-requires
6597 mk/Makefile
6598 mono/Makefile
6599 mono/btls/Makefile
6600 mono/native/Makefile
6601 mono/utils/Makefile
6602 mono/utils/jemalloc/Makefile
6603 mono/metadata/Makefile
6604 mono/dis/Makefile
6605 mono/cil/Makefile
6606 mono/arch/Makefile
6607 mono/arch/x86/Makefile
6608 mono/arch/amd64/Makefile
6609 mono/arch/ppc/Makefile
6610 mono/arch/sparc/Makefile
6611 mono/arch/s390x/Makefile
6612 mono/arch/arm/Makefile
6613 mono/arch/arm64/Makefile
6614 mono/arch/mips/Makefile
6615 mono/arch/riscv/Makefile
6616 mono/sgen/Makefile
6617 mono/native/platform-type.c
6618 mono/native/platform-type-compat.c
6619 mono/native/platform-type-unified.c
6620 mono/tests/Makefile
6621 mono/tests/assembly-load-reference/Makefile
6622 mono/tests/tests-config
6623 mono/tests/gc-descriptors/Makefile
6624 mono/tests/testing_gac/Makefile
6625 mono/tests/fullaot-mixed/Makefile
6626 mono/tests/llvmonly-mixed/Makefile
6627 mono/unit-tests/Makefile
6628 mono/benchmark/Makefile
6629 mono/mini/Makefile
6630 mono/profiler/Makefile
6631 mono/eglib/Makefile
6632 mono/eglib/eglib-config.h
6633 mono/eglib/test/Makefile
6634 m4/Makefile
6635 ikvm-native/Makefile
6636 scripts/Makefile
6637 man/Makefile
6638 docs/Makefile
6639 data/Makefile
6640 data/net_2_0/Makefile
6641 data/net_4_0/Makefile
6642 data/net_4_5/Makefile
6643 data/net_2_0/Browsers/Makefile
6644 data/net_4_0/Browsers/Makefile
6645 data/net_4_5/Browsers/Makefile
6646 data/mint.pc
6647 data/mono-2.pc
6648 data/monosgen-2.pc
6649 data/mono.pc
6650 data/mono-cairo.pc
6651 data/mono-options.pc
6652 data/mono-lineeditor.pc
6653 data/monodoc.pc
6654 data/dotnet.pc
6655 data/dotnet35.pc
6656 data/wcf.pc
6657 data/cecil.pc
6658 data/system.web.extensions_1.0.pc
6659 data/system.web.extensions.design_1.0.pc
6660 data/system.web.mvc.pc
6661 data/system.web.mvc2.pc
6662 data/system.web.mvc3.pc
6663 data/aspnetwebstack.pc
6664 data/reactive.pc
6665 samples/Makefile
6666 support/Makefile
6667 data/config
6668 tools/Makefile
6669 tools/locale-builder/Makefile
6670 tools/sgen/Makefile
6671 tools/pedump/Makefile
6672 runtime/Makefile
6673 msvc/Makefile
6674 po/Makefile
6677 if test x$host_win32 = xyes; then
6678    # Get rid of 'cyg' prefixes in library names
6679    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6680    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6681    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6682    # executable doesn't work...
6683    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6686 if test x$host_darwin = xyes; then
6687    # This doesn't seem to be required and it slows down parallel builds
6688    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6691 AC_MSG_CHECKING([compiler server])
6692 AC_ARG_WITH(compiler-server, [  --with-compiler-server=yes,no,default      Enables or disables compiler server],[
6693    if test x$withval = xyes; then
6694        enable_compiler_server=yes;
6695    elif test x$withval = xno; then
6696        enable_compiler_server=no;
6697    elif test x$withval = xdefault; then
6698        enable_compiler_server=yes;
6699    else
6700        AC_MSG_ERROR([You must supply one of "yes", "no" or "default" to the --with-compiler-server option])
6701    fi
6702 ],[enable_compiler_server=yes])
6704 if test x$enable_compiler_server = xyes; then
6705    if test x$csc_compiler = xmcs; then
6706        AC_MSG_WARN([mcs does not support the compiler server])
6707        enable_compiler_server=no;
6708    fi
6712   case $prefix in
6713   NONE) prefix=$ac_default_prefix ;;
6714   esac
6715   case $exec_prefix in
6716   NONE) exec_prefix='${prefix}' ;;
6717   esac
6719   #
6720   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6721   # any existing config.make.  This allows people to share the same source tree
6722   # with different build directories, one native and one cross
6723   #
6724   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6726     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6728     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6729     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6730     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6731     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6732     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6733     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6734     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6735     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6736     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6737     echo "VERSION = $VERSION" >> $mcs_topdir/build/config.make
6739     case $INSTALL in
6740     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6741     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6742     esac
6744     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6746     export VERSION
6747     [myver=$($AWK 'BEGIN {
6748       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6749       if(length(vsplit [1]) > 4) {
6750         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6751       }
6752       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6753     }')]
6755     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6756     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6758     if test x$host_darwin = xyes; then
6759       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6760       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6761       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6762     elif test x$host_win32 = xyes; then
6763       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6764       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6765       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6766     elif test x$host_linux = xyes; then
6767       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6768       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6769       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6770     else
6771       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6772       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6773       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6774     fi
6776     echo "PLATFORM_AOT_PREFIX = $PLATFORM_AOT_PREFIX" >> $mcs_topdir/build/config.make
6777     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6778       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6779     fi
6781         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6782            enable_system_aot=yes
6783         fi
6785     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6786       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6787     fi
6789     if test x$DISABLE_MCS_DOCS = xyes; then
6790       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6791     fi
6793     if test x$has_extension_module != xno; then
6794         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6795     fi
6796     
6797     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6798     
6799     if test "x$test_bcl_opt" = "xyes"; then    
6800       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6801     fi
6803     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6804     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6805     echo "VBCS_LOCATION?=$VBCS_LOCATION" >> $srcdir/$mcsdir/build/config.make
6807     if test $csc_compiler = mcs; then
6808       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6809     fi
6811     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6812       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6813       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6815       if test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" = "xno"; then
6816         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS,$MONO_LLVM_PATH_OPTION" >> $srcdir/$mcsdir/build/config.make
6817       else
6818         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6819       fi
6820     fi
6822     if test "x$AOT_MODE" != "x" ; then
6823       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6824     fi
6826     if test "x$enable_btls" = "xyes"; then
6827       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6828     fi
6830     if test "x$mono_native" = "xyes"; then
6831       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6832     else
6833       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6834     fi
6836     if test x$mono_native_compat = xyes; then
6837       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6838     else
6839       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6840     fi
6842     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6843     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6844     if test x$enable_compiler_server = xyes; then
6845       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6846     else
6847       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6848     fi
6849     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6851   fi
6855 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6857 btls_platform_string=
6858 if test x$enable_btls = xyes; then
6859         if test x$btls_android = xyes; then
6860                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6861         else
6862                 btls_platform_string=" ($BTLS_PLATFORM)"
6863         fi
6866 thread_suspend_msg=
6867 if test x$buildsgen = xyes; then
6868         if test x$enable_cooperative_suspend != xno; then
6869                 thread_suspend_msg="Suspend:       Cooperative"
6870         elif test x$enable_hybrid_suspend != xno; then
6871                 thread_suspend_msg="Suspend:       Hybrid"
6872         else
6873                 thread_suspend_msg="Suspend:       Preemptive"
6874         fi
6877 if test "x$with_core" == "xonly"; then
6878   echo "RID = $RID" >> netcore/config.make
6879   echo "COREARCH = $COREARCH" >> netcore/config.make
6880   echo "CORETARGETS = $CORETARGETS" >> netcore/config.make
6881   echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> netcore/config.make
6883   if test x$host_darwin = xyes; then
6884     echo "HOST_PLATFORM ?= macos" >> netcore/config.make
6885   elif test x$host_win32 = xyes; then
6886     echo "HOST_PLATFORM ?= win32" >> netcore/config.make
6887   elif test x$host_linux = xyes; then
6888     echo "HOST_PLATFORM ?= linux" >> netcore/config.make
6889   else
6890     echo "HOST_PLATFORM ?= unix" >> netcore/config.make
6891   fi
6894         
6895 echo "
6896         mcs source:    $mcsdir
6897         C# Compiler:   $csc_compiler
6898         CompilerServer:$enable_compiler_server
6900    Engine:
6901         Host:          $host
6902         Target:        $target
6903         GC:            $gc_msg 
6904         $thread_suspend_msg
6905         TLS:           $with_tls
6906         SIGALTSTACK:   $with_sigaltstack
6907         Engine:        $jit_status
6908         BigArrays:     $enable_big_arrays
6909         DTrace:        $enable_dtrace
6910         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6911         Spectre:       $spectre_mitigation_status
6912         Mono.Native:   $mono_native_text
6914    Libraries:
6915         .NET 4.x:        $with_profile4_x
6916         Xamarin.Android: $with_monodroid
6917         Xamarin.iOS:     $with_monotouch
6918         Xamarin.WatchOS: $with_monotouch_watch
6919         Xamarin.TVOS:    $with_monotouch_tv
6920         Xamarin.Mac:     $with_xammac
6921         Windows AOT:     $with_winaot
6922         Orbis:           $with_orbis
6923         Unreal:          $with_unreal
6924         WebAssembly:     $with_wasm
6925         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid), AOT Full Interp ($with_testing_aot_full_interp), Windows Full AOT Interp ($with_testing_winaot_interp)
6926         JNI support:     $jdk_headers_found
6927         libgdiplus:      $libgdiplus_msg
6928         zlib:            $zlib_msg
6929         BTLS:            $enable_btls$btls_platform_string
6930         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6931         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6932         .NET Core:       $with_core
6933         $disabled
6935 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6936    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)