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