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