[master] Bump msbuild to track xplat-master (#20189)
[mono-project.git] / configure.ac
blob1c8d9ccd4415cdd0495ab3770f480d00c80fc15f
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.13.0],
8         [https://github.com/mono/mono/issues/new])
10 AC_CONFIG_SRCDIR([Makefile.am])
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 subdir-objects]
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=1A5E0066-58DC-428A-B21C-0AD6CDAE2789
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
142 host_sunos=no
144 case "$host" in
145         wasm32*)
146                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
147                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
148                 libgc_threads=pthreads
149                 host_wasm=yes
150                 # FIXME:
151                 RID="osx-x64"
152                 COREARCH="wasm32"
153                 CORETARGETS="-p:TargetsUnix=true -p:TargetsOSX=true"
154                 build_darwin=yes
155                 ;;
156         *-mingw*|*-*-cygwin*)
157                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
158                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
159                 host_win32=yes
160                 mono_cv_clang=no
161                 if test "x$cross_compiling" = "xno"; then
162                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
163                                 target_win32=yes
164                         fi
165                 else
166                         if test "x$host" = "x$target"; then
167                                 target_win32=yes
168                         fi
169                 fi
170                 HOST_CC="gcc"
171                 RID="win-x86"
172                 CORETARGETS="-p:TargetsWindows=true"
173                 COREARCH="x86"
174                 # Boehm not supported on 64-bit Windows.
175                 case "$host" in
176                 x86_64-*-* | amd64-*-*)
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
195                 ;;
196         *-*-*netbsd*)
197                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
198                 libmono_cflags="-D_REENTRANT"
199                 LDFLAGS="$LDFLAGS -pthread"
200                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
201                 libmono_ldflags="-pthread"
202                 need_link_unlink=yes
203                 libgc_threads=pthreads
204                 with_sigaltstack=no
205                 use_sigposix=yes
206                 with_sgen_default_concurrent=yes
207                 ;;
208         *-*-kfreebsd*-gnu)
209                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
210                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
211                 libmono_ldflags="-lpthread -pthread"
212                 libgc_threads=pthreads
213                 need_link_unlink=yes
214                 with_sigaltstack=no
215                 use_sigposix=yes
216                 with_sgen_default_concurrent=yes
217                 ;;
218         *-*-*freebsd*)
219                 dnl For close_my_fds
220                 LDFLAGS="$LDFLAGS -lutil"
221                 if test "x$PTHREAD_CFLAGS" = "x"; then
222                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
223                         libmono_cflags=
224                 else
225                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
226                         libmono_cflags="$PTHREAD_CFLAGS"
227                 fi
228                 if test "x$PTHREAD_LIBS" = "x"; then
229                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
230                         libmono_ldflags="-pthread"
231                 else
232                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
233                         libmono_ldflags="$PTHREAD_LIBS"
234                 fi
235                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
236                 need_link_unlink=yes
237                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
238                 libgc_threads=pthreads
239                 use_sigposix=yes
240                 has_dtrace=yes
241                 case "$host" in
242                 aarch64-*)
243                         support_boehm=no
244                         with_gc=sgen
245                         ;;
246                 riscv*)
247                         support_boehm=no
248                         with_gc=sgen
249                         ;;
250                 esac
251                 with_sgen_default_concurrent=yes
252                 ;;
253         *-*-*openbsd*)
254                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
255                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
256                 if test "x$disable_munmap" != "xyes"; then
257                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
258                 fi
259                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
260                 LDFLAGS="$LDFLAGS -pthread"
261                 need_link_unlink=yes
262                 AC_DEFINE(PTHREAD_POINTER_ID)
263                 libgc_threads=pthreads
264                 with_tls=pthread
265                 with_sigaltstack=no
266                 use_sigposix=yes
267                 with_sgen_default_concurrent=yes
268                 ;;
269         *-*-linux-android*)
270                 platform_android=yes
271                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
272                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
274                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
275                 if test "x$disable_munmap" != "xyes"; then
276                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
277                 fi
278                 libmono_cflags="-D_REENTRANT"
279                 libgc_threads=pthreads
280                 use_sigposix=yes
282                 with_tls=pthread
283                 with_sigaltstack=no
284                 with_static_mono=no
286                 # Android doesn't support boehm, as it's missing <link.h>
287                 support_boehm=no
288                 with_gc=sgen
290                 # isinf(3) requires -lm
291                 LDFLAGS="$LDFLAGS -lm"
293                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
294                 # PAGE_SIZE; breaks mono/io-layer/collection.c
295                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
296                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
297                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
299                 # FIXME? Only if __ANDROID_API__ < 24?
300                 # FILE32API means "long", which is stuck at 32bits for 32bit ABI (64bits for 64bit ABI).
301                 # ABI 24 introduces the "o" for "file offset" variations, which can be widened to 64bits for 32bit ABI (and still 64bits for 64bit).
302                 # Android itself uses FILE32API, and mono should use system zlib on Android anyway.
303                 ZLIB_CFLAGS="$ZLIB_CFLAGS -DUSE_FILE32API"
305                 # to bypass the underscore linker check, can't work when cross-compiling
306                 mono_cv_uscore=yes
307                 mono_cv_clang=no
308                 ;;
309         *-*-linux*)
310                 host_linux=yes
311                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
312                 if test "x$disable_munmap" != "xyes"; then
313                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
314                 fi
315                 libmono_cflags="-D_REENTRANT"
316                 libgc_threads=pthreads
317                 CORETARGETS="-p:TargetsUnix=true"
318                 use_sigposix=yes
319                 if test "x$cross_compiling" != "xno"; then
320                         # to bypass the underscore linker check, not
321                         # available during cross-compilation
322                         mono_cv_uscore=no
323                 fi
324                 case "$host" in
325                 *-musl)
326                         AC_DEFINE(MUSL, 1, [musl libc])
327                         ;;
328                 esac
329                 case "$host" in
330                 *-tizen-linux-*)
331                         platform_tizen=yes
332                         ;;
333                 esac
334                 case "$host" in
335                 ppc64-*)
336                         RID="linux-ppc64"
337                         ;;
338                 ppc64le-*)
339                         RID="linux-ppc64el"
340                         ;;
341                 mipsel-*)
342                         RID="linux-mipsel"
343                         ;;
344                 x86-*)
345                         RID="linux-x86"
346                         COREARCH="x86"
347                         ;;
348                 x86_64-*)
349                         RID="linux-x64"
350                         COREARCH="x64"
351                         ;;
352                 arm-*)
353                         # deal with this in the FPU detection section, since
354                         # we cannot determine FPU from triplet and don't want
355                         # to duplicate the logic
356                         ;;
357                 aarch64-*)
358                         support_boehm=no
359                         with_gc=sgen
360                         RID="linux-arm64"
361                         COREARCH="arm64"
362                         ;;
363                 powerpc*-*-linux*)
364                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
365                         disable_munmap=yes
366                         ;;
367                 powerpc*-*-freebsd*)
368                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
369                         disable_munmap=yes
370                         ;;
371                 riscv*)
372                         support_boehm=no
373                         with_gc=sgen
374                         ;;
375                 esac
376                 with_sgen_default_concurrent=yes
377                 ;;
378         *-*-nacl*)
379                 echo "nacl no longer supported."
380                 exit 1
381                 ;;
382         *-*-hpux*)
383                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
384                 # +ESdbgasm only valid on bundled cc on RISC
385                 # silently ignored for ia64
386                 if test $GCC != "yes"; then
387                         CFLAGS="$CFLAGS +ESdbgasm"
388                         # Arrange for run-time dereferencing of null
389                         # pointers to produce a SIGSEGV signal.
390                         LDFLAGS="$LDFLAGS -z"
391                 fi
392                 CFLAGS="$CFLAGS +ESdbgasm"
393                 LDFLAGS="$LDFLAGS -z"
394                 libmono_cflags="-D_REENTRANT"
395                 libmono_ldflags="-lpthread"
396                 libgc_threads=pthreads
397                 need_link_unlink=yes
398                 use_sigposix=yes
399                 ;;
400         *-*-solaris*)
401                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS -D__EXTENSIONS__ -D_XPG4_2"
402                 need_link_unlink=yes
403                 libmono_cflags="-D_REENTRANT"
404                 libgc_threads=pthreads
405                 has_dtrace=yes
406                 use_sigposix=yes
407                 enable_solaris_tar_check=yes
408                 host_sunos=yes
409                 ;;
410         *-*-darwin*)
411                 # Temporary workaround for Apple Silicon
412                 # config.guess returns arm-apple-darwin20.0.0
413                 if test $ac_cv_host = arm-apple-darwin20.0.0 -o $ac_cv_target = arm-apple-darwin20.0.0; then
414                    echo "You are running on Apple Silicon, but using an old config.guess, invoke configure like this:"
415                    echo "Run configure using ./configure --host=aarch64-apple-darwin20.0.0 --target=aarch64-apple-darwin20.0.0"
416                    exit 1
417                 fi
418                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
419                 host_darwin=yes
420                 target_mach=yes
421                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
422                 libmono_cflags="-D_THREAD_SAFE"
423                 need_link_unlink=yes
424                 AC_DEFINE(PTHREAD_POINTER_ID)
425                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
426                 CORETARGETS="-p:TargetsUnix=true -p:TargetsOSX=true"
427                 libgc_threads=pthreads
428                 has_dtrace=yes
429                 if test "x$cross_compiling" = "xyes"; then
430                         has_broken_apple_cpp=yes
431                 fi
432                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
433                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
434                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
435                 case "$host" in
436                         dnl Snow Leopard and newer config.guess reports as this
437                         i*86-*-darwin*)
438                                 BROKEN_DARWIN_FLAGS="-arch i386"
439                                 BROKEN_DARWIN_CPPFLAGS=""
440                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
441                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
442                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
443                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
444                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
445                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
446                                 with_sgen_default_concurrent=yes
447                                 RID="osx-x86"
448                                 COREARCH="x86"
449                                 ;;
450                         x*64-*-darwin*)
451                                 with_sgen_default_concurrent=yes
452                                 RID="osx-x64"
453                                 COREARCH="x64"
454                                 ;;
455                         arm*-darwin*)
456                                 platform_ios=yes
457                                 has_dtrace=no
458                                 ;;
459                         aarch64*-darwin20*)
460                                 # OSX/arm64
461                                 support_boehm=no
462                                 ;;
463                         aarch64*-darwin*)
464                                 platform_ios=yes
465                                 ;;
466                 esac
467                 ;;
468         *-*-haiku*)
469                 dnl BSD_SOURCE is for getifaddrs
470                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
471                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
472                 LIBS="$LIBS -lnetwork -ltextencoding"
473                 need_link_unlink=yes
474                 AC_DEFINE(PTHREAD_POINTER_ID)
475                 dnl Haiku does not support static TLS with __thread
476                 with_tls=pthread
477                 libgc_threads=pthreads
478                 use_sigposix=yes
479                 with_sigaltstack=no
480                 ;;
481         *-*-fuchsia*)
482                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
483                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
484                 fuchsia=true
485                 with_tls=pthread
486                 with_sigaltstack=yes
487                 with_static_mono=no
488                 support_boehm=no
489                 with_gc=sgen
490                 mono_cv_uscore=yes
491                 mono_cv_clang=no
492                 ;;
493         *-*-aix*|*-*-os400*)
494                 AC_DEFINE(HOST_AIX,1,[Targeting the AIX and PASE platforms])
495                 host_aix=yes
496                 dnl IMPORTANT: For svr4 sonames on AIX, you should set
497                 dnl `OBJECT_MODE=64` when configuring.
498                 dnl libtool cannot generate functioning svr4 sonames on
499                 dnl 64-bit without it.
500                 dnl Unfortunately, everything is complicated by the fact that
501                 dnl gcc doesn't respect this variable. (otherwise we could set
502                 dnl it for build time for configure and make)
503                 dnl On IBM i PASE using IBM's packages, GCC *does* respect this
504                 dnl variable, and builds are 64-bit by default. svr4 sonames
505                 dnl must still be specified when configuring on i, however.
506                 dnl As such, because Mono doesn't support 32-bit AIX or PASE,
507                 dnl set up a 64-bit build (assming GCC; XLC not supported)
508                 dnl regardless of what variable is used.
509                 case $host_os in
510                         aix*)
511                         if test "x$OBJECT_MODE" = "x64" && test "x$CC" = "x" && test "x$CXX" = "x"; then
512                                 dnl HACK: Set -maix64 at the GCC invocation
513                                 dnl level explicitly to work around the fact
514                                 dnl GCC in default maix32 mode explodes when
515                                 dnl binutils respects OBJECT_MODE.
516                                 dnl When that check occurs, flags are not
517                                 dnl passed to to the compiler, so GCC has no
518                                 dnl chance to change its mode.
519                                 dnl Otherwise, it may enter a state where it
520                                 dnl runs, but uses the libtool "compile"
521                                 dnl wrapper, which subtly breaks other things.
522                                 dnl This should propagate to all uses of CC.
523                                 dnl This is only set if not manually set.
524                                 CC="gcc -maix64"
525                                 CXX="g++ -maix64"
526                                 echo
527                         fi
528                         ;;
529                         dnl Not needed on i because it defaults to 64-bit and
530                         dnl has a GCC smart enough to respect OBJECT_MODE.
531                 esac
532                 dnl We still set this for *FLAGS, however, because we may not
533                 dnl be setting OBJECT_MODE.
534                 LDFLAGS="$LDFLAGS -maix64"
535                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -pthread -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
536                 libmono_cflags="-pthread -D_THREAD_SAFE -D_REENTRANT"
537                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
538                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
539                 dnl specifiy 64-bit mode for tools. (OBJECT_MODE is finicky with cmake.)
540                 dnl XXX: We should stop the hardcoding madness
541                 AR="/usr/bin/ar -X64"
542                 NM="/usr/bin/nm -X64"
543                 STRIP="/usr/bin/strip -X64"
544                 RANLIB="/usr/bin/ranlib -X64"
545                 dnl SGen is the future (changes to Boehm support code would be
546                 dnl required if you wish to re-enable Boehm)
547                 support_boehm=no
548                 with_gc=sgen
549                 need_link_unlink=yes
550                 use_sigposix=yes
551                 dnl Similar limitation to macOS about the first thread and the
552                 dnl guard page, except sometimes the runtime hangs. Disable for
553                 dnl now until cause can be determined or it seems OK enough.
554                 with_sigaltstack=no
555                 dnl use pthread TLS, __thread has issues with the compiler flags we use
556                 with_tls=pthread
557                 dnl ppc Linux is the same? test further
558                 disable_munmap=yes
559                 RID="aix-ppc64"
560                 CORETARGETS="-p:TargetsUnix=true"
561                 ;;
562         *)
563                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
564                 ;;
565 esac
567 AC_MSG_RESULT(ok)
569 if test x$need_link_unlink = xyes; then
570    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
573 if test x$host_win32 = xyes; then
574    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
577 if test x$target_win32 = xyes; then
578    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
581 if test x$host_darwin = xyes; then
582    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
585 # Defined for all targets/platforms using classic Windows API support.
586 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
587 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
589 AC_SUBST(extra_runtime_ldflags)
590 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
591 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
592 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
593 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
594 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
595 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
596 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
597 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
598 AM_CONDITIONAL(HOST_WASM, test x$host_wasm = xyes)
599 AM_CONDITIONAL(HOST_AIX, test x$host_aix = xyes)
601 if test -z "$HOST_DARWIN_TRUE"; then :
602 PLATFORM_AOT_SUFFIX=.dylib
603 PLATFORM_AOT_PREFIX=lib
606 if test -z "$HOST_LINUX_TRUE"; then :
607 PLATFORM_AOT_SUFFIX=.so
608 PLATFORM_AOT_PREFIX=lib
611 if test -z "$HOST_WIN32_TRUE"; then :
612 PLATFORM_AOT_SUFFIX=.dll
613 PLATFORM_AOT_PREFIX=
616 AC_SUBST(PLATFORM_AOT_SUFFIX)
617 AC_SUBST(PLATFORM_AOT_PREFIX)
619 if test -z "$HOST_WASM_TRUE"; then :
620 AC_DEFINE(HAVE_UTIME)
621 AC_DEFINE(HAVE_UTIMES)
624 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
626 AC_CHECK_TOOL(CC, gcc, gcc)
627 AC_PROG_CC
628 AC_CHECK_TOOL(CXX, g++, g++)
629 AC_PROG_CXX
630 AM_PATH_PYTHON([3.2])
631 AM_PROG_AS
632 AC_PROG_INSTALL
633 AC_PROG_AWK
634 AM_PROG_CC_C_O
635 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
636 : ${CCAS='$(CC)'}
637 # Set ASFLAGS if not already set.
638 : ${CCASFLAGS='$(CFLAGS)'}
639 AC_SUBST(CCAS)
640 AC_SUBST(CCASFLAGS)
642 if test "x$CXX" = "xno"; then
643         AC_MSG_ERROR([No c++ compiler found. You need to install a c++ compiler])
646 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
647 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
648 if test "x$CXX" = "xg++"; then
649         if test "x$GXX" != "xyes"; then
650                 # automake/libtool is so broken, it requires g++ even if the c++ sources
651                 # are inside automake conditionals
652                 AC_MSG_ERROR([You need to install g++])
653         fi
656 dnl may require a specific autoconf version
657 dnl AC_PROG_CC_FOR_BUILD
658 dnl CC_FOR_BUILD not automatically detected
659 CC_FOR_BUILD=$CC
660 CFLAGS_FOR_BUILD=$CFLAGS
661 BUILD_EXEEXT=
662 if test "x$cross_compiling" = "xyes"; then
663         CC_FOR_BUILD=cc
664         CFLAGS_FOR_BUILD=
665         BUILD_EXEEXT=""
667 AC_SUBST(CC_FOR_BUILD)
668 AC_SUBST(CFLAGS_FOR_BUILD)
669 AC_SUBST(HOST_CC)
670 AC_SUBST(BUILD_EXEEXT)
672 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
673 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
675 # Set STDC_HEADERS
676 AC_HEADER_STDC
677 AC_LIBTOOL_WIN32_DLL
678 # This causes monodis to not link correctly
679 #AC_DISABLE_FAST_INSTALL
681 #lookup makedev() header
682 AC_HEADER_MAJOR
684 AM_PROG_LIBTOOL
685 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
686 DOLT
688 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
689 AC_SUBST(export_ldflags)
691 # Test whenever ld supports -version-script
692 AC_PROG_LD
693 AC_PROG_LD_GNU
695 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)
696 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)
698 # zlib/configure checks for unistd.h existence and defines HAVE_UNISTD_H on the compiler
699 # command line (not config.h) if it is present.
700 AC_CHECK_HEADER(unistd.h,
701     [HAVE_UNISTD_H=1
702      ZLIB_CFLAGS="$ZLIB_CFLAGS -DHAVE_UNISTD_H"],
703     [HAVE_UNISTD_H=0])
705 AC_SUBST(HAVE_UNISTD_H)
707 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
708                   [], [], [#include <stddef.h>
709                   #include <sys/socket.h>
710                   #include <linux/socket.h>])
712 AC_CHECK_HEADERS(sys/user.h, [], [],
714 #ifdef HAVE_SYS_PARAM_H
715 # include <sys/param.h>
716 #endif
719 AC_CHECK_HEADERS(linux/serial.h)
721 case "$host" in
722         # Use bundled zlib on Windows to be sure it is static.
723         *-mingw*|*-cygwin*)
724                 have_sys_zlib=no
725                 zlib_msg="bundled zlib"
726                 ;;
727         # Use bundled zlib on RISC-V for now to make cross-compiling easier.
728         riscv*)
729                 have_sys_zlib=no
730                 zlib_msg="bundled zlib"
731                 ;;
732         *)
733                 AC_CHECK_HEADER(zlib.h, [have_sys_zlib=yes], [have_sys_zlib=no])
734                 if test x$have_sys_zlib = xyes; then
735                         AC_TRY_COMPILE([#include <zlib.h>], [
736                                 #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
737                                 #else
738                                 #error No good zlib found
739                                 #endif
740                         ],[
741                                 AC_MSG_RESULT(Using system zlib)
742                                 zlib_msg="system zlib"
743                                 have_sys_zlib=yes
744                         ],[
745                                 AC_MSG_RESULT(zlib too old, using embedded zlib)
746                                 have_sys_zlib=no
747                                 zlib_msg="bundled zlib"
748                         ])
749                 else
750                         AC_MSG_RESULT(zlib not found, using embedded zlib)
751                         have_sys_zlib=no
752                         zlib_msg="bundled zlib"
753                 fi
754                 ;;
755 esac
757 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=])
758 if test "x$STATIC_ZLIB_PATH" != "x"; then
759         have_static_zlib=yes
760         have_sys_zlib=no
761         zlib_msg="static zlib from $STATIC_ZLIB_PATH"
762         AC_SUBST(STATIC_ZLIB_PATH)
765 AM_CONDITIONAL(HAVE_STATIC_ZLIB, test x$have_static_zlib = xyes)
766 AM_CONDITIONAL(HAVE_SYS_ZLIB, test x$have_sys_zlib = xyes)
767 if test x$have_static_zlib = xyes; then
768         AC_DEFINE(HAVE_STATIC_ZLIB, 1, [Use static zlib])
770 if test x$have_sys_zlib = xyes; then
771         AC_DEFINE(HAVE_SYS_ZLIB, 1, [Use OS-provided zlib])
773 # for mono/metadata/debug-symfile.c
774 AC_CHECK_HEADERS(elf.h)
776 # for perf jit dump support
777 AC_CHECK_HEADERS(sys/mman.h)
778 if test "x$host_linux" = "xyes" -a x$ac_cv_header_sys_mman_h = xyes -a  x$ac_cv_header_elf_h = xyes -a x$ac_cv_header_sys_syscall_h = xyes; then
779         AC_DEFINE(ENABLE_JIT_DUMP, 1, [Enable jit dump support on Linux])
782 # for support
783 AC_CHECK_HEADERS(poll.h)
784 AC_CHECK_HEADERS(sys/poll.h)
785 AC_CHECK_HEADERS(sys/wait.h)
786 AC_CHECK_HEADERS(grp.h)
787 AC_CHECK_HEADERS(syslog.h)
788 AC_CHECK_FUNCS(vsyslog)
790 # for mono/dis
791 AC_CHECK_HEADERS(wchar.h)
793 # for Linux statfs support
794 AC_CHECK_HEADERS(linux/magic.h)
796 # For Android NDK unified headers
797 if test x$platform_android = xyes; then
798         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
799         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
800         AC_CHECK_HEADERS(android/ndk-version.h)
802         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
803         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
804         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
805         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
806         # doesn't contain the required definitions (NDK 14)
807         if test x$have_android_signal_inlines = xyes; then
808                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
809                 AC_COMPILE_IFELSE([
810                         AC_LANG_PROGRAM([#include <signal.h>
811                                 #include <android/legacy_signal_inlines.h>],[
812                                 int i;
813                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
814                                 }
815                         ])],[
816                                 AC_MSG_RESULT(yes)
817                                 android_sigrtminmax_work=yes
818                         ],[
819                                 AC_MSG_RESULT(no)
820                                 android_sigrtminmax_work=no
821                         ]
822                 )
824                 if test x$android_sigrtminmax_work = xno; then
825                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
826                 fi
827         fi
829         # Attempt to detect whether we're using Android NDK unified headers
830         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
831         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
833         android_unified_headers=no
834         if test x$have_android_api_level = xyes; then
835                 if test x$have_android_versioning = xyes; then
836                         AC_MSG_CHECKING([whether using Android NDK unified headers])
838                         # Both macros are defined only in the NDK unified headers
839                         AC_COMPILE_IFELSE([
840                                 AC_LANG_PROGRAM([
841                                         #include <android/api-level.h>
842                                         #include <android/versioning.h>
843                                 ],[
844                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
845                                         #else
846                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
847                                         #endif
848                                 ])],[
849                                         AC_MSG_RESULT(yes)
850                                         android_unified_headers=yes
851                                 ],[
852                                         AC_MSG_RESULT(no)
853                                         android_unified_headers=no
854                                 ]
855                         )
856                 fi
857         fi
859         if test x$android_unified_headers = xyes; then
860                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
861         fi
862 fi # Android
864 # not 64 bit clean in cross-compile
865 AC_CHECK_SIZEOF(void *)
866 AC_CHECK_SIZEOF(long)
868 AC_CHECK_SIZEOF(int)
869 AC_CHECK_SIZEOF(long long)
871 AC_CACHE_CHECK([for clang],
872         mono_cv_clang,[
873         AC_TRY_COMPILE([], [
874                 #ifdef __clang__
875                 #else
876                 #error "FAILED"
877                 #endif
878         ],
879         [mono_cv_clang=yes],
880         [mono_cv_clang=no],
881         [])
884 AC_ARG_ENABLE(visibility-hidden,
885 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
886    disable_visibility_hidden=yes, disable_visibility_hidden=no)
888 WARN=''
889 if test x"$GCC" = xyes; then
890                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
891                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
893                 # We require C99 with some GNU extensions, e.g. `linux` macro
894                 CFLAGS="$CFLAGS -std=gnu99"
896                 # The runtime code does not respect ANSI C strict aliasing rules
897                 CFLAGS="$CFLAGS -fno-strict-aliasing"
899                 # We rely on signed overflow to behave
900                 CFLAGS="$CFLAGS -fwrapv"
902                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
903                 if test x"$disable_visibility_hidden" = xno; then
904                    # Don't export any symbols by default
905                    SHARED_CFLAGS="-fvisibility=hidden"
906                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
907                 fi
909                 ORIG_CFLAGS=$CFLAGS
910                 # Check for the normal version, since gcc ignores unknown -Wno options
911                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
912                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
913                 AC_TRY_COMPILE([],[
914                 ], [
915                    AC_MSG_RESULT(yes)
916                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
917                 ], [
918                    AC_MSG_RESULT(no)
919                    CFLAGS=$ORIG_CFLAGS
920                 ])
922                 if test "x$mono_cv_clang" = "xyes"; then
923                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
924                    WARN="$WARN -Qunused-arguments"
925                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
926                    # We rely on zero length arrays in structs
927                    WARN="$WARN -Wno-zero-length-array"
928                 fi
929 else
930         # The Sun Forte compiler complains about inline functions that access static variables
931         # so disable all inlining.
932         case "$host" in
933         *-*-solaris*)
934                 CFLAGS="$CFLAGS -Dinline="
935                 ;;
936         esac
938 CFLAGS="$WARN $CFLAGS -g"
939 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
940 CPPFLAGS="$WARN $CPPFLAGS -g"
942 # Where's the 'mcs' source tree?
943 if test -d $srcdir/mcs; then
944   mcsdir=mcs
945 else
946   mcsdir=../mcs
949 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
950         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
951                 mcsdir=$with_mcs_path
952         fi
955 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
957 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
958 if test x$with_core = xonly; then
959     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
960     with_runtime_preset=netcore
962 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
965 # A sanity check to catch cases where the package was unpacked
966 # with an ancient tar program (Solaris)
968 AC_ARG_ENABLE(solaris-tar-check,
969 [  --disable-solaris-tar-check    disable solaris tar check],
970    do_solaris_tar_check=no, do_solaris_tar_check=yes)
972 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
973         AC_MSG_CHECKING(integrity of package)
974         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
975         then
976                 AC_MSG_RESULT(ok)
977         else
978                 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"
979                 AC_MSG_ERROR([$errorm])
980         fi
983 if test "x$with_mcs_path" != "x"; then
984 mcs_topdir=$(cd "$mcsdir" && pwd)
985 mcs_topdir_from_srcdir=$mcs_topdir
986 else
987 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
988 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
991 # Convert mcs_topdir* paths to Windows syntax.
992 if test x$cross_compiling$host_win32 = xnoyes; then
993   mcs_topdir=$(cygpath -m $mcs_topdir)
994   case $mcs_topdir_from_srcdir in
995     /cygdrive/*)
996         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
997         ;;
998   esac
1001 AC_SUBST([mcs_topdir])
1002 AC_SUBST([mcs_topdir_from_srcdir])
1004 # gettext: prepare the translation directories. 
1005 # we do not configure the full gettext, as we consume it dynamically from C#
1006 AM_PO_SUBDIRS
1008 if test "x$USE_NLS" = "xyes"; then
1009    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
1011    if test "x$HAVE_MSGFMT" = "xno"; then
1012           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
1013    fi
1016 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
1018 pkg_config_path=
1019 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
1020         if test x$with_crosspkgdir = "x"; then
1021                 if test -s $PKG_CONFIG_PATH; then
1022                         pkg_config_path=$PKG_CONFIG_PATH
1023                 fi
1024         else
1025                 pkg_config_path=$with_crosspkgdir
1026                 PKG_CONFIG_PATH=$pkg_config_path
1027                 export PKG_CONFIG_PATH
1028         fi
1031 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
1032 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
1033 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
1035 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
1036 if test x$werror_flag = xyes; then
1037         WERROR_CFLAGS="-Werror"
1039 AC_SUBST([WERROR_CFLAGS])
1040 AC_SUBST([SHARED_CFLAGS])
1042 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
1043   
1044 AC_SUBST(GLIB_CFLAGS)
1046 # Enable support for fast thread-local storage
1047 # Some systems have broken support, so we allow to disable it.
1048 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
1050 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
1051 # This does not work on some platforms (bug #55253)
1052 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
1054 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
1055 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
1056 # Same as --with-shared_mono=no
1057 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
1059 if test "x$enable_static" = "xno"; then
1060    with_static_mono=no
1063 if test "x$enable_shared" = "xno"; then
1064    with_shared_mono=no
1067 if test "x$enable_libraries" = "xno"; then
1068    with_shared_mono=no
1071 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
1073 if test "x$host_win32" = "xyes"; then
1074    # Boehm GC requires the runtime to be in its own dll
1075    with_static_mono=no
1078 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
1079 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
1080 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
1081 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
1083 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
1084 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
1085         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
1086         ORIG_CFLAGS=$CFLAGS
1087         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
1088         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
1089         AC_TRY_COMPILE([], [
1090         ], [
1091            AC_MSG_RESULT(yes)
1092            # Pass it to libgc as well
1093            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
1094         ], [
1095            AC_MSG_RESULT(no)
1096            CFLAGS=$ORIG_CFLAGS
1097         ])
1100 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
1102 if test x$enable_small_config = xyes; then
1103         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
1104         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
1107 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)
1109 DISABLED_FEATURES=none
1110 csc_compiler=default
1111 endian=unknown
1112 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
1113 AC_MSG_CHECKING([CSharp compiler to use])
1114 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
1115    if test x$withval = xmcs; then
1116        csc_compiler=mcs
1117    elif test x$withval = xroslyn; then
1118        csc_compiler=roslyn
1119    elif test x$withval = xdefault; then
1120        :
1121    else
1122        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
1123    fi
1124 ],[csc_compiler=default])
1126 if test $csc_compiler = default; then
1127    if test $endian = big; then
1128       case "$host" in
1129         s390x*) csc_compiler=roslyn ;;
1130         *) csc_compiler=mcs
1131       esac
1132    elif test $endian = little; then
1133       case "$host" in
1134         powerpc*) csc_compiler=mcs ;;
1135         *) csc_compiler=roslyn ;;
1136       esac
1137    else
1138       csc_compiler=mcs
1139    fi
1141 AC_MSG_RESULT($csc_compiler)
1143 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
1144 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
1145 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])
1148 if test x$target_win32 = xyes; then
1149 with_jemalloc=no
1150 with_jemalloc_assert=no
1151 with_jemalloc_always=no
1154 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
1155 if test "x$with_jemalloc_assert" = "xyes"; then
1156 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
1157 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
1158 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
1161 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
1162 if test "x$with_jemalloc_always" = "xyes"; then
1163 with_jemalloc=yes
1164 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
1165 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
1166 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
1169 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
1170 if test "x$with_jemalloc" = "xyes"; then
1171 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
1172 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
1173 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
1175 if test "x$target_mach" = "xyes"; then
1176         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
1179 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
1180 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
1182 AC_SUBST(JEMALLOC_CFLAGS)
1183 AC_SUBST(JEMALLOC_CPPFLAGS)
1184 AC_SUBST(JEMALLOC_LDFLAGS)
1185 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
1188 # Terminology:
1189 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
1190 # MERP - The MS telemetry profile. Not for general use.
1191 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
1193 # 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.
1195 #--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.
1196 #--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.
1197 #--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.
1198 #--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.
1200 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])
1201 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])
1202 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1204 if test "x$with_crash_privacy" = "xyes"; then
1205 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1208 if test "x$with_structured_crashes" = "xno"; then
1209 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1212 case "$host" in
1213         *-mingw*|*-*-cygwin*)
1214                 crash_reporting=no
1215                 ;;
1216 esac
1218 if test "x$crash_reporting" != "xyes"; then
1219 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1220 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1222 AM_CONDITIONAL(DISABLE_CRASH_REPORTING, test x$crash_reporting != xyes)
1224 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1225 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1227 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1228 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1230 if test x$enable_monodroid = xyes; then
1231         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1234 if test x$enable_monotouch = xyes; then
1235         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1238 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1239 AM_CONDITIONAL(ENABLE_CXX, test x$enable_cxx = xyes)
1241 # mono/corefx/native has a lot of invalid C++98 in its headers
1242 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1243 # use these C99 print macros in the command line, since glib may not win first inttypes include
1244 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1245 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1246 CXXFLAGS_COMMON="$CXXFLAGS_COMMON -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
1247 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1249 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1250 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1251 # and add it whenever we're running clang on Darwin.
1252 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1253         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1256 AC_SUBST(CXXFLAGS_COMMON)
1258 if test "x$enable_cxx" = "xyes"; then
1260         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1262         # -std=gnu99 -xc++ is not allowed and errors.
1263         CXX_REMOVE_CFLAGS=-std=gnu99
1264         # These give warnings and should be removed. They are C-only.
1265         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1266         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1267         # Likewise with CentOS 6 gcc 4.4.
1268         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1270         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1271         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1272         # generates a warning every time we run gcc which is very unsightly.
1273         # The warning is for e.g. sprintf(foo, "") which can just be
1274         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1275         # and completely legal and valid.
1276         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1277         # Alternatively, just run $CXX -xc++ -c /dev/null.
1278         AC_LANG_PUSH(C++)
1279         ORIG_CXXFLAGS=$CXXFLAGS
1280         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1281         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1282         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1283                                  [ AC_MSG_RESULT(no)
1284                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1285         CXXFLAGS=$ORIG_CXXFLAGS
1286         AC_LANG_POP(C++)
1288 AC_SUBST(CXX_ADD_CFLAGS)
1289 AC_SUBST(CXX_REMOVE_CFLAGS)
1292 # Set the build profiles and options before things which use them
1295 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])
1296 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1297 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1298 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])
1299 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])
1300 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1301 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1302 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])
1303 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])
1304 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])
1305 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1306 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])
1307 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1308 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1309 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1312 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])
1313 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])
1314 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])
1315 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])
1317 AC_ARG_WITH(static_icu, [  --with-static-icu=yes|no      Integrate ICU statically into the runtime (defaults to no)],[
1318         if test x$with_static_icu = xyes ; then
1319                 AC_DEFINE(STATIC_ICU,1,[Integrate ICU statically into the runtime.])
1320         fi
1321 ], [with_static_icu=no])
1324 dnl Spectre compiler mitigation flag checks
1326 if test "x$with_spectre_mitigation" = "xyes"; then
1327    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1328    SPECTRE_CFLAGS=
1329    SPECTRE_INDIRECT_BRANCH_KIND=
1330    case "x$with_spectre_indirect_branch_choice" in
1331        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1332        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1333        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1334        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1335        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1336    esac
1338    SPECTRE_FUNCTION_RETURN_KIND=""
1339    case "x$with_spectre_function_return_choice" in
1340        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1341        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1342        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1343        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1344        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1345    esac
1347    AX_CHECK_COMPILE_FLAG(
1348         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1349         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1350    )
1352    AX_CHECK_COMPILE_FLAG(
1353         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1354         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1355    )
1357    if test "x$SPECTRE_CFLAGS" != "x" ; then
1358         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1359         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1360         spectre_mitigation_status="mitigation enabled"
1361    fi
1362 else
1363         spectre_mitigation_status="no mitigation"
1367 dnl Profile defaults
1369 TEST_PROFILE=default
1370 enable_llvm_default=no
1372 with_profile4_x_default=no
1373 with_monodroid_default=no
1374 with_monotouch_default=no
1375 with_monotouch_watch_default=no
1376 with_monotouch_tv_default=no
1377 with_xammac_default=no
1378 with_testing_aot_full_interp_default=no
1379 with_testing_aot_hybrid_default=no
1380 with_testing_aot_full_default=no
1381 with_winaot_default=no
1382 with_testing_winaot_interp_default=no
1383 with_orbis_default=no
1384 with_unreal_default=no
1385 with_wasm_default=no
1387 with_bitcode_default=no
1388 enable_cooperative_suspend_default=no
1389 enable_hybrid_suspend_default=no
1391 # For the sake of clearer error messages, these numbers should all be different from each other.
1392 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4400,nftnptr-arg-trampolines=4000,nrgctx-trampolines=21000
1394 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1396 MONO_LLVM_PATH_OPTION=llvm-path="`pwd`/llvm/usr/bin"
1398 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1399    DISABLE_MCS_DOCS_default=yes
1402 if test x$with_runtime_preset = xnetcore; then
1403    # Keep in sync with winconfig.h netcore configuration.
1404    DISABLE_MCS_DOCS_default=yes
1405    BTLS_SUPPORTED=no
1406    enable_mcs_build=no
1407    enable_support_build=no
1409    mono_feature_disable_remoting='yes'
1410    mono_feature_disable_reflection_emit_save='yes'
1411    mono_feature_disable_appdomains='yes'
1412    mono_feature_disable_cleanup='yes'
1413    mono_feature_disable_assembly_remapping='yes'
1414    mono_feature_disable_security='yes'
1415    mono_feature_disable_mdb='yes'
1416    mono_feature_disable_com='yes'
1417    mono_feature_disable_gac='yes'
1418    mono_feature_disable_perfcounters='yes'
1419    mono_feature_disable_attach='yes'
1420    mono_feature_disable_cfgdir_config='yes'
1421    if test "x$enable_monodroid" = "x" -a "x$enable_monotouch" = "x"; then
1422      mono_feature_disable_dllmap='yes' # FIXME: the mobile products use this
1423    fi
1424    disable_mono_native=yes
1425    support_boehm=no
1426 elif test x$with_runtime_preset = xnet_4_x; then
1427    with_profile4_x_default=yes
1428    TEST_PROFILE=net_4_x
1429 elif test x$with_runtime_preset = xall; then
1430    with_profile4_x_default=yes
1431    with_monodroid_default=yes
1432    with_monotouch_default=yes
1433    with_monotouch_watch_default=yes
1434    with_monotouch_tv_default=yes
1435    with_xammac_default=yes
1436    with_winaot_default=yes
1437    with_testing_winaot_interp_default=yes
1438    with_orbis_default=yes
1439    with_unreal_default=yes
1440    with_wasm_default=yes
1441    with_testing_aot_full_interp_default=yes
1442    with_testing_aot_hybrid_default=yes
1443    with_testing_aot_full_default=yes
1444    TEST_PROFILE=net_4_x
1445 elif test x$with_runtime_preset = xbitcode; then
1446    DISABLE_MCS_DOCS_default=yes
1447    with_testing_aot_full_default=yes
1448    with_bitcode_default=yes
1449    enable_cooperative_suspend_default=yes
1450    # FIXME: use TEST_PROFILE=testing_aot_full
1451    TEST_PROFILE=testing_aot_bitcode
1452    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1453    enable_llvm_default=yes
1455    mono_feature_disable_com='yes'
1456    mono_feature_disable_remoting='yes'
1457    mono_feature_disable_reflection_emit_save='yes'
1458    mono_feature_disable_reflection_emit='yes'
1459    mono_feature_disable_appdomains='yes'
1461    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1462    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1463    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1464    AOT_MODE="llvmonly"
1465 elif test x$with_runtime_preset = xbitcodeinterp; then
1466    with_testing_aot_full_interp_default=yes
1467    with_bitcode_default=yes
1468    enable_cooperative_suspend_default=yes
1469    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1470    TEST_PROFILE=testing_aot_bitcode_interp
1471    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1472    enable_llvm_default=yes
1474    # mscorlib.dll aot compilation crashes
1475    mono_feature_disable_com='yes'
1477    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1478    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1479    AOT_RUN_FLAGS="--llvmonly-interp"
1480 elif test x$with_runtime_preset = xfullaot; then
1481    DISABLE_MCS_DOCS_default=yes
1482    with_testing_aot_full_default=yes
1483    TEST_PROFILE=testing_aot_full
1485    mono_feature_disable_com='yes'
1486    mono_feature_disable_remoting='yes'
1487    mono_feature_disable_reflection_emit_save='yes'
1488    mono_feature_disable_reflection_emit='yes'
1489    mono_feature_disable_appdomains='yes'
1491    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1492    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1493    AOT_MODE="full"
1494 elif test x$with_runtime_preset = xfullaot_llvm; then
1495    DISABLE_MCS_DOCS_default=yes
1496    with_testing_aot_full_default=yes
1497    TEST_PROFILE=testing_aot_full
1499    mono_feature_disable_com='yes'
1500    mono_feature_disable_remoting='yes'
1501    mono_feature_disable_reflection_emit_save='yes'
1502    mono_feature_disable_reflection_emit='yes'
1503    mono_feature_disable_appdomains='yes'
1505    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1506    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1507    AOT_MODE="full"
1508 elif test x$with_runtime_preset = xhybridaot; then
1509    DISABLE_MCS_DOCS_default=yes
1510    with_testing_aot_hybrid_default=yes
1511    TEST_PROFILE=testing_aot_hybrid 
1513    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1514    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1515 elif test x$with_runtime_preset = xhybridaot_llvm; then
1516    DISABLE_MCS_DOCS_default=yes
1517    with_testing_aot_hybrid_default=yes
1518    TEST_PROFILE=testing_aot_hybrid
1520    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1521    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1522 elif test x$with_runtime_preset = xfullaotinterp; then
1523    with_testing_aot_full_interp_default=yes
1524    TEST_PROFILE=testing_aot_full_interp
1526    # mscorlib.dll aot compilation crashes
1527    mono_feature_disable_com='yes'
1529    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1530    AOT_RUN_FLAGS="--full-aot-interp"
1531 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1532    with_testing_aot_full_interp_default=yes
1533    TEST_PROFILE=testing_aot_full_interp
1535    # mscorlib.dll aot compilation crashes
1536    mono_feature_disable_com='yes'
1538    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1539    AOT_RUN_FLAGS="--full-aot-interp"
1540 elif test x$with_runtime_preset = xaot; then
1541    with_profile4_x_default=yes
1543    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1544    AOT_RUN_FLAGS=""
1546    DISABLE_MCS_DOCS_default=yes
1547 elif test x$with_runtime_preset = xaot_llvm; then
1548    with_profile4_x_default=yes
1550    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1551    AOT_RUN_FLAGS=""
1553    DISABLE_MCS_DOCS_default=yes
1554 elif test x$with_runtime_preset = xwinaot; then
1555    DISABLE_MCS_DOCS_default=yes
1556    with_winaot_default=yes
1557    TEST_PROFILE=winaot
1559    mono_feature_disable_com='yes'
1560    mono_feature_disable_remoting='yes'
1561    mono_feature_disable_reflection_emit_save='yes'
1562    mono_feature_disable_reflection_emit='yes'
1563    mono_feature_disable_appdomains='yes'
1565    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1566    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1567    AOT_MODE="full"
1568 elif test x$with_runtime_preset = xwinaotinterp; then
1569    DISABLE_MCS_DOCS_default=yes
1570    with_testing_winaot_interp_default=yes
1571    TEST_PROFILE=testing_winaot_interp
1573    mono_feature_disable_com='yes'
1574    mono_feature_disable_remoting='yes'
1575    mono_feature_disable_appdomains='yes'
1577    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1578    AOT_RUN_FLAGS="--full-aot-interp"
1579 elif test x$with_runtime_preset = xwinaotinterp_llvm; then
1580    DISABLE_MCS_DOCS_default=yes
1581    with_testing_winaot_interp_default=yes
1582    TEST_PROFILE=testing_winaot_interp
1584    mono_feature_disable_com='yes'
1585    mono_feature_disable_remoting='yes'
1586    mono_feature_disable_appdomains='yes'
1588    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1589    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1590    AOT_RUN_FLAGS="--full-aot-interp"
1591 elif test x$with_runtime_preset = xwinaot_llvm; then
1592    DISABLE_MCS_DOCS_default=yes
1593    with_winaot_default=yes
1594    TEST_PROFILE=winaot
1596    mono_feature_disable_com='yes'
1597    mono_feature_disable_remoting='yes'
1598    mono_feature_disable_reflection_emit_save='yes'
1599    mono_feature_disable_reflection_emit='yes'
1600    mono_feature_disable_appdomains='yes'
1602    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1603    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1604    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1605    AOT_MODE="full"
1606 elif test x$with_runtime_preset = xorbis; then
1607    DISABLE_MCS_DOCS_default=yes
1608    with_orbis_default=yes
1609    TEST_PROFILE=orbis
1611    mono_feature_disable_com='yes'
1612    mono_feature_disable_remoting='yes'
1613    mono_feature_disable_reflection_emit_save='yes'
1614    mono_feature_disable_reflection_emit='yes'
1615    mono_feature_disable_appdomains='yes'
1617    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1618    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1619    AOT_MODE="full"
1620 elif test x$with_runtime_preset = xunreal; then
1621    DISABLE_MCS_DOCS_default=yes
1622    with_unreal_default=yes
1623    TEST_PROFILE=unreal
1625    mono_feature_disable_com='yes'
1626    mono_feature_disable_remoting='yes'
1627    mono_feature_disable_appdomains='no'
1629    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1630    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1631 elif test x$with_runtime_preset = xwasm; then
1632    DISABLE_MCS_DOCS_default=yes
1633    with_wasm_default=yes
1634    TEST_PROFILE=wasm
1636    mono_feature_disable_com='yes'
1637    mono_feature_disable_remoting='yes'
1638    mono_feature_disable_reflection_emit_save='yes'
1639    mono_feature_disable_reflection_emit='yes'
1640    mono_feature_disable_appdomains='yes'
1642    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1643    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1644 else
1645    TEST_PROFILE=net_4_x
1646    with_profile4_x_default=yes
1649 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1650    AC_SUBST(AOT_BUILD_FLAGS)
1651    AC_SUBST(AOT_RUN_FLAGS)
1652    # For llvmonlycheck + fullaotcheck
1653    AC_SUBST(INVARIANT_AOT_OPTIONS)
1656 AC_SUBST(TEST_PROFILE)
1658 if test "x$with_profile4_x" = "xdefault"; then
1659    with_profile4_x=$with_profile4_x_default
1661 if test "x$with_monodroid" = "xdefault"; then
1662    with_monodroid=$with_monodroid_default
1664 if test "x$with_monotouch" = "xdefault"; then
1665    with_monotouch=$with_monotouch_default
1667 if test "x$with_monotouch_watch" = "xdefault"; then
1668    with_monotouch_watch=$with_monotouch_watch_default
1670 if test "x$with_monotouch_tv" = "xdefault"; then
1671    with_monotouch_tv=$with_monotouch_tv_default
1673 if test "x$with_bitcode" = "xdefault"; then
1674    with_bitcode=$with_bitcode_default
1676 if test "x$with_xammac" = "xdefault"; then
1677    with_xammac=$with_xammac_default
1679 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1680    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1682 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1683    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1685 if test "x$with_testing_aot_full" = "xdefault"; then
1686    with_testing_aot_full=$with_testing_aot_full_default
1688 if test "x$with_winaot" = "xdefault"; then
1689    with_winaot=$with_winaot_default
1691 if test "x$with_testing_winaot_interp" = "xdefault"; then
1692    with_testing_winaot_interp=$with_testing_winaot_interp_default
1694 if test "x$with_orbis" = "xdefault"; then
1695    with_orbis=$with_orbis_default
1697 if test "x$with_unreal" = "xdefault"; then
1698    with_unreal=$with_unreal_default
1700 if test "x$with_wasm" = "xdefault"; then
1701    with_wasm=$with_wasm_default
1705 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1706 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1707 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1708 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1709 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1710 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1711 AM_CONDITIONAL(STATIC_ICU, test "x$with_static_icu" = "xyes")
1712 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1713 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1714 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1715 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1716 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1717 AM_CONDITIONAL(INSTALL_TESTING_WINAOT_INTERP, [test "x$with_testing_winaot_interp" != "xno"])
1718 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1719 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1720 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1721 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1723 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1724 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"])
1725 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"])
1726 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1728 default_profile=net_4_x
1729 if test -z "$INSTALL_MONODROID_TRUE"; then :
1730    default_profile=monodroid
1732 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1733    default_profile=monotouch
1735 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1736    default_profile=xammac
1738 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1739    default_profile=testing_aot_full_interp
1741 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1742    default_profile=testing_aot_hybrid
1744 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1745    default_profile=testing_aot_full
1747 if test -z "$INSTALL_WINAOT_TRUE"; then :
1748    default_profile=winaot
1750 if test -z "$INSTALL_TESTING_WINAOT_INTERP_TRUE"; then :
1751    default_profile=testing_winaot_interp
1753 if test -z "$INSTALL_ORBIS_TRUE"; then :
1754    default_profile=orbis
1756 if test -z "$INSTALL_UNREAL_TRUE"; then :
1757    default_profile=unreal
1759 if test -z "$INSTALL_WASM_TRUE"; then :
1760    default_profile=wasm
1762 if test -z "$INSTALL_4_x_TRUE"; then :
1763    default_profile=net_4_x
1765 DEFAULT_PROFILE=$default_profile
1766 AC_SUBST(DEFAULT_PROFILE)
1769 # End build profile configuration
1772 if test x$USE_NLS = xprofile_default; then
1774         AC_MSG_CHECKING([NLS used])
1776         # We make the default value for USE_NLS
1777         # "no" on OSX because it isn't available on most
1778         # default OSX installs. The most common configurations will
1779         # all disable it, so this saves us typing.
1780         if test x$host_darwin = xyes; then
1781                 USE_NLS=no;
1782         else
1783                 USE_NLS=yes;
1784         fi
1786         AC_SUBST([USE_NLS])
1787         AC_MSG_RESULT([$USE_NLS])
1790 AC_ARG_ENABLE(static-gcc-libs, [  --enable-static-gcc-libs      Statically link GCC support libs (for MinGW32)])
1791 if test "x$enable_static_gcc_libs" = "xyes"; then
1792         # llvm/build.mk doesn't use automake, so make a regular make variable for it.
1793         AC_SUBST(STATIC_GCC_LIBS,1)
1795 AM_CONDITIONAL(ENABLE_STATIC_GCC_LIBS, test "x$enable_static_gcc_libs" = "xyes")
1797 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1798      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, dllmap, reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting, security, lldb, mdb, assert_messages, config, cfgdir_config, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_toggleref, sgen_debug_helpers, sgen_binary_protocol, sockets, gac, threads, processes, eventpipe.],
1800         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1801                 eval "mono_feature_disable_$feature='yes'"
1802         done
1803         DISABLED_FEATURES=$enable_minimal
1804         disabled="Disabled:      $enable_minimal"
1805 ],[])
1807 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1809 if test "x$mono_feature_disable_aot" = "xyes"; then
1810         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1811         enable_system_aot=no
1812         AC_MSG_NOTICE([Disabled AOT compiler])
1815 if test "x$mono_feature_disable_profiler" = "xyes"; then
1816         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1817         AC_MSG_NOTICE([Disabled support for the profiler])
1819 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1821 if test "x$mono_feature_disable_decimal" = "xyes"; then
1822         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1823         AC_MSG_NOTICE([Disabled support for decimal])
1826 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1827         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1828         AC_MSG_NOTICE([Disabled support for P/Invoke])
1831 if test "x$mono_feature_disable_debug" = "xyes"; then
1832         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1833         AC_MSG_NOTICE([Disabled support for runtime debugging])
1836 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1837         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1838         mono_feature_disable_reflection_emit_save=yes
1839         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1842 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1843         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1844         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1847 if test "x$mono_feature_disable_large_code" = "xyes"; then
1848         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1849         AC_MSG_NOTICE([Disabled support for large assemblies])
1852 if test "x$mono_feature_disable_logging" = "xyes"; then
1853         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1854         AC_MSG_NOTICE([Disabled support for logging])
1857 if test "x$mono_feature_disable_com" = "xyes"; then
1858         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1859         AC_MSG_NOTICE([Disabled COM support])
1862 if test "x$mono_feature_disable_ssa" = "xyes"; then
1863         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1864         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1867 if test "x$mono_feature_disable_generics" = "xyes"; then
1868         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1869         AC_MSG_NOTICE([Disabled Generics Support])
1872 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1873         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1874         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1877 if test "x$mono_feature_disable_portability" = "xyes"; then
1878         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1879         AC_MSG_NOTICE([Disabled IO Portability layer])
1882 if test "x$mono_feature_disable_attach" = "xyes"; then
1883         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1884         AC_MSG_NOTICE([Disabled agent attach])
1887 if test "x$mono_feature_disable_verifier" = "xyes"; then
1888         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1889         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1892 if test "x$mono_feature_disable_jit" = "xyes"; then
1893         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1894         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1897 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1899 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1900         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1901         AC_MSG_NOTICE([Disabled the interpreter])
1904 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1906 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1907         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1910 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1912 if test "x$mono_feature_disable_simd" = "xyes"; then
1913         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1914         AC_MSG_NOTICE([Disabled SIMD support])
1917 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1918         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1919         AC_MSG_NOTICE([Disabled Soft Debugger.])
1922 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1924 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1925         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1926         AC_MSG_NOTICE([Disabled Performance Counters.])
1928 if test "x$mono_feature_disable_normalization" = "xyes"; then
1929         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1930         AC_MSG_NOTICE([Disabled String normalization support.])
1933 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1934 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1935         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1936         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1939 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1940         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1941         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1944 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1945         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1946         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1949 if test "x$mono_feature_disable_remoting" = "xyes"; then
1950         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1951         AC_MSG_NOTICE([Disabled remoting])
1954 if test "x$mono_feature_disable_security" = "xyes"; then
1955         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1956         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1959 if test "x$mono_feature_disable_lldb" = "xyes"; then
1960         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1961         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1964 if test "x$mono_feature_disable_mdb" = "xyes"; then
1965         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1966         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1969 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1970         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1971         AC_MSG_NOTICE([Disabled assertion messages.])
1974 if test "x$mono_feature_disable_cfgdir_config" = "xyes"; then
1975         AC_DEFINE(DISABLE_CFGDIR_CONFIG, 1, [Disable config directories.])
1976         AC_MSG_NOTICE([Disabled config directories.])
1979 if test "x$mono_feature_disable_config" = "xyes"; then
1980         AC_DEFINE(DISABLE_CONFIG, 1, [Disable .config file support.])
1981         AC_MSG_NOTICE([Disabled .config file support.])
1984 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1985         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1986         AC_MSG_NOTICE([Disabled runtime cleanup.])
1989 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1990         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1991         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1994 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1995         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1996         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1999 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
2000         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
2001         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
2004 if test "x$mono_feature_disable_sgen_toggleref" = "xyes"; then
2005         AC_DEFINE(DISABLE_SGEN_TOGGLEREF, 1, [Disable toggleref support in SGEN.])
2006         AC_MSG_NOTICE([Disabled toggleref support in SGEN.])
2009 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
2010         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
2011         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
2014 if test "x$mono_feature_disable_sgen_binary_protocol" = "xyes"; then
2015         AC_DEFINE(DISABLE_SGEN_BINARY_PROTOCOL, 1, [Disable binary protocol logging in SGEN.])
2016         AC_MSG_NOTICE([Disabled binary protocol logging in SGEN.])
2019 if test "x$mono_feature_disable_sockets" = "xyes"; then
2020         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
2021         AC_MSG_NOTICE([Disabled sockets])
2024 if test "x$mono_feature_disable_gac" = "xyes"; then
2025         AC_DEFINE(DISABLE_GAC, 1, [Disable GAC])
2026         AC_MSG_NOTICE([Disabled GAC support])
2029 if test "x$mono_feature_disable_dllmap" = "xyes"; then
2030     AC_DEFINE(DISABLE_DLLMAP,1,[Disables use of DllMaps in MonoVM])
2031     AC_MSG_NOTICE([Disabled DllMap in the loader.])
2034 if test "x$mono_feature_disable_threads" = "xyes"; then
2035         AC_DEFINE(DISABLE_THREADS, 1, [Disable Threads])
2036         AC_MSG_NOTICE([Disabled threading support])
2039 if test "x$mono_feature_disable_processes" = "xyes"; then
2040         AC_DEFINE(DISABLE_PROCESSES, 1, [Disable process support])
2041         AC_MSG_NOTICE([Disabled process support])
2044 if test "x$mono_feature_disable_eventpipe" = "xyes"; then
2045         AC_DEFINE(DISABLE_EVENTPIPE, 1, [Disable EventPipe support])
2046         AC_MSG_NOTICE([Disabled EventPipe support])
2047         enable_perftracing=no
2050 if test x$enable_perftracing = x -a x$with_core = xonly; then
2051         if test -f $srcdir/mono/eventpipe/ep.h; then
2052                 enable_perftracing=yes
2053         fi
2055 if test x$enable_perftracing = xyes; then
2056         AC_DEFINE(ENABLE_PERFTRACING,1,[Enables support for eventpipe library])
2058 AM_CONDITIONAL(ENABLE_PERFTRACING, test x$enable_perftracing = xyes)
2060 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
2061 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
2063 has_extension_module=no
2064 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
2066         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
2067                 if test x$extension = xdefault ; then
2068                         has_extension_module=yes;
2069                 fi
2070         done
2071         if test x$enable_extension_module = xyes; then
2072                 has_extension_module=yes;
2073         fi
2074 ], [])
2076 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
2078 if test x$has_extension_module != xno ; then
2079         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
2080         AC_MSG_NOTICE([Enabling mono extension module.])
2083 # Deprecated
2084 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
2086 AC_MSG_CHECKING(for visibility __attribute__)
2087 AC_COMPILE_IFELSE([
2088         AC_LANG_SOURCE([[
2089                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
2090                 int main () { doit (); return 0; }
2091         ]])
2092 ], [
2093    have_visibility_hidden=yes
2094    AC_MSG_RESULT(yes)
2095 ], [
2096    have_visibility_hidden=no
2097    AC_MSG_RESULT(no)
2101 dnl Boehm GC configuration
2104 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
2106 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
2107 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
2109 if test "x$support_boehm" = "xyes"; then
2111         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
2112         if test x$enable_parallel_mark = xyes; then
2113                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
2114         fi
2116         gc_msg=""
2117         LIBGC_CPPFLAGS=
2118         LIBGC_LIBS=
2119         LIBGC_STATIC_LIBS=
2120         case "x$libgc" in
2121                 xincluded)
2122                         LIBGC_CPPFLAGS='-I$(top_srcdir)/external/bdwgc/include -I$(top_srcdir)/external/bdwgc/libatomic_ops/src'
2123                         LIBGC_LIBS='$(top_builddir)/external/bdwgc/libgc.la'
2124                         LIBGC_STATIC_LIBS='$(top_builddir)/external/bdwgc/libgc-static.la'
2126                         BOEHM_DEFINES="-DHAVE_BOEHM_GC -DGC_THREADS"
2128                         if test x$target_win32 = xyes; then
2129                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
2130                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
2131                         fi
2133                         gc_msg="Included Boehm GC with typed GC"
2134                         if test x$enable_parallel_mark = xyes; then
2135                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
2136                                 gc_msg="$gc_msg and parallel mark"
2137                         else
2138                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
2139                         fi
2140                         ;;
2142                 xboehm|xbohem|xyes)
2143                         AC_MSG_WARN("External Boehm is no longer supported")
2144                         ;;
2146                 xsgen)
2147                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
2148                         ;;
2150                 xnone)
2151                         AC_MSG_WARN("Compiling mono without GC.")
2152                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
2153                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
2154                         gc_msg="none"
2155                         ;;
2156                 *)
2157                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
2158                         ;;
2159         esac
2161         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])
2162         if test "x$large_heap" = "xyes"; then
2163            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
2164         fi
2166         AC_SUBST(LIBGC_CPPFLAGS)
2167         AC_SUBST(LIBGC_LIBS)
2168         AC_SUBST(LIBGC_STATIC_LIBS)
2169         AC_SUBST(BOEHM_DEFINES)
2172 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
2175 dnl End of Boehm GC Configuration
2178 dnl *************************************
2179 dnl *** Checks for zero length arrays ***
2180 dnl *************************************
2181 AC_MSG_CHECKING(whether $CC supports zero length arrays)
2182 AC_TRY_COMPILE([
2183         struct s {
2184                 int  length;
2185                 char data [0];
2186         };
2187 ], [], [
2188         AC_MSG_RESULT(yes)
2189         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
2190 ], [
2191         AC_MSG_RESULT(no)
2192         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
2195 dnl ***********************************
2196 dnl *** Checks for signals
2197 dnl ***********************************
2198 AC_CHECK_HEADERS(signal.h)
2199 AC_CHECK_FUNCS(sigaction)
2200 AC_CHECK_FUNCS(kill)
2201 AC_CHECK_FUNCS(signal)
2203 # signal() is declared inline in Android headers
2204 # so we need to workaround it by overriding the check.
2205 if test x$platform_android = xyes; then
2206         AC_DEFINE(HAVE_SIGNAL,1)
2209 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
2210 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
2212 if test x$host_win32 = xno; then
2213         dnl *************************************
2214         dnl *** Checks for time capabilities ***
2215         dnl *************************************
2217         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
2218         AC_TRY_COMPILE([#include <time.h>], [
2219                 const int foo = CLOCK_MONOTONIC;
2220         ],[
2221                 AC_MSG_RESULT(yes)
2222                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
2223         ], [
2224                 AC_MSG_RESULT(no)
2225         ])
2227         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
2228         AC_TRY_COMPILE([#include <time.h>], [
2229                 const int foo = CLOCK_MONOTONIC_COARSE;
2230         ],[
2231                 AC_MSG_RESULT(yes)
2232                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
2233         ], [
2234                 AC_MSG_RESULT(no)
2235         ])
2237         AC_MSG_CHECKING(for CLOCK_REALTIME)
2238         AC_TRY_COMPILE([#include <time.h>], [
2239                 const int foo = CLOCK_REALTIME;
2240         ],[
2241                 AC_MSG_RESULT(yes)
2242                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
2243         ], [
2244                 AC_MSG_RESULT(no)
2245         ])
2247         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
2248         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
2249         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
2250         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
2251         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
2252         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
2254         AC_CHECK_TYPES([clockid_t], [AC_DEFINE(HAVE_CLOCKID_T)], [],
2255                 [#include <sys/types.h>])
2257         dnl hires monotonic clock support
2258         AC_SEARCH_LIBS(clock_gettime, rt)
2259         AC_CHECK_FUNCS(clock_nanosleep)
2261         dnl dynamic loader support
2262         AC_CHECK_FUNC(dlopen, DL_LIB="",
2263                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
2264         )
2265         if test x$dl_support = xno; then
2266                 AC_MSG_WARN([No dynamic loading support available])
2267         else
2268                 LIBS="$LIBS $DL_LIB"
2269                 dnl from glib's configure.ac
2270                 if test "x$cross_compiling" = "xyes"; then
2271                    AC_MSG_RESULT(cross compiling, assuming no)
2272                    mono_cv_uscore=no
2273                 else
2274                         AC_CACHE_CHECK([for preceeding underscore in symbols],
2275                           mono_cv_uscore,[
2276                           AC_TRY_RUN([#include <dlfcn.h>
2277                           int mono_underscore_test (void) { return 42; }
2278                           int main() {
2279                             void *f1 = (void*)0, *f2 = (void*)0, *handle;
2280                             handle = dlopen ((void*)0, 0);
2281                             if (handle) {
2282                               f1 = dlsym (handle, "mono_underscore_test");
2283                               f2 = dlsym (handle, "_mono_underscore_test");
2284                             } return (!f2 || f1);
2285                           }],
2286                                 [mono_cv_uscore=yes],
2287                                 [mono_cv_uscore=no],
2288                           [])
2289                   ])
2290                 fi
2291                 if test "x$mono_cv_uscore" = "xyes"; then
2292                         AC_DEFINE(MONO_DL_NEED_USCORE, 1, [Does dlsym require leading underscore.])
2293                 fi
2294                 AC_CHECK_FUNC(dlerror)
2295         fi
2297         dnl ******************************************************************
2298         dnl *** Checks for the IKVM JNI interface library                  ***
2299         dnl ******************************************************************
2300         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])
2302         if test x$with_ikvm_native = xyes; then
2303                 jdk_headers_found="IKVM Native"
2304         fi
2306         AC_CHECK_HEADERS(execinfo.h)
2308         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2310         AC_CHECK_FUNCS(getgrgid_r)
2311         AC_CHECK_FUNCS(getgrnam_r)
2312         AC_CHECK_FUNCS(getresuid)
2313         AC_CHECK_FUNCS(setresuid)
2314         AC_CHECK_FUNCS(kqueue)
2315         # IBM provides a compatibility library for offering this function.
2316         # BSDs and others, have execinfo in base or packages.
2317         AC_SEARCH_LIBS(backtrace_symbols, execinfo util)
2318         # Two-step so it sets it in config.h
2319         AC_CHECK_FUNCS(backtrace_symbols)
2320         AC_CHECK_FUNCS(mkstemp)
2321         AC_CHECK_FUNCS(mmap)
2322         AC_CHECK_FUNCS(getrusage)
2323         AC_CHECK_FUNCS(getpriority)
2324         AC_CHECK_FUNCS(setpriority)
2325         AC_CHECK_FUNCS(dl_iterate_phdr)
2326         AC_CHECK_FUNCS(dladdr)
2327         AC_CHECK_FUNCS(sysconf)
2328         AC_CHECK_FUNCS(getrlimit)
2329         AC_CHECK_FUNCS(prctl)
2330         AC_CHECK_FUNCS(arc4random)
2331         AC_CHECK_FUNCS(nl_langinfo)
2333         AC_CHECK_FUNCS(sched_getaffinity)
2334         AC_CHECK_FUNCS(sched_setaffinity)
2335         AC_CHECK_FUNCS(sched_getcpu)
2337         if test x$platform_android != xyes; then
2338                 AC_CHECK_FUNCS(getpwnam_r)
2339                 AC_CHECK_FUNCS(getpwuid_r)
2340         fi
2342         AC_CHECK_FUNCS(readlink)
2343         AC_CHECK_FUNCS(chmod)
2344         AC_CHECK_FUNCS(lstat)
2345         AC_CHECK_FUNCS(getdtablesize)
2347         AC_CHECK_FUNCS(ftruncate)
2348         AC_CHECK_FUNCS(msync)
2350         AC_CHECK_FUNCS(gethostname getpeername)
2351         AC_CHECK_FUNCS(utime utimes)
2353         AC_CHECK_FUNCS(openlog closelog)
2354         AC_CHECK_FUNCS(atexit)
2355         AC_CHECK_FUNCS(popen)
2357         AC_FUNC_STRERROR_R()
2359         dnl ****************************************************************
2360         dnl *** Check for sched_setaffinity from glibc versions before   ***
2361         dnl *** 2.3.4. The older versions of the function only take 2    ***
2362         dnl *** parameters, not 3.                                       ***
2363         dnl ***                                                          ***
2364         dnl *** Because the interface change was not made in a minor     ***
2365         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2366         dnl *** won't always indicate the interface sched_affinity has.  ***
2367         dnl ****************************************************************
2368         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2369         AC_TRY_COMPILE([#include <sched.h>], [
2370             int mask = 1; 
2371             sched_setaffinity(0, &mask);
2372         ], [
2373                 # Yes, we have it...
2374                 AC_MSG_RESULT(yes)
2375                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2376         ], [
2377                 # We have the new, three-parameter version
2378                 AC_MSG_RESULT(no)
2379         ])
2380         AC_TRY_COMPILE([#include <sched.h>], [
2381              CPU_COUNT((void *) 0);
2382         ], [
2383                 AC_MSG_RESULT(yes)
2384                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2385         ], [
2386                 # We have the new, three-parameter version
2387                 AC_MSG_RESULT(no)
2388         ])
2390         dnl ******************************************************************
2391         dnl *** Check for large file support                               ***
2392         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2393         dnl ******************************************************************
2394         
2395         # Check that off_t can represent 2**63 - 1 correctly, working around
2396         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2397         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2398         large_offt=no
2399         AC_DEFUN([LARGE_FILES], [
2400                 large_CPPFLAGS=$CPPFLAGS
2401                 CPPFLAGS="$CPPFLAGS $1"
2402                 AC_TRY_COMPILE([
2403                         #include <sys/types.h>
2404                         #include <limits.h>
2405                 ], [
2406                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2407                         #define COMPILE_TIME_ASSERT(pred) \
2408                                 switch(0){case 0:case pred:;}
2409                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2410                 ], [
2411                         AC_MSG_RESULT(ok)
2412                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2413                         large_CPPFLAGS="$large_CPPFLAGS $1"
2414                         large_offt=yes
2415                 ], [
2416                         AC_MSG_RESULT(no)
2417                 ])
2418                 CPPFLAGS=$large_CPPFLAGS
2419         ])
2421         AC_MSG_CHECKING(if off_t is 64 bits wide)
2422         LARGE_FILES("")
2423         if test $large_offt = no; then
2424                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2425                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2426         fi
2427         if test $large_offt = no; then
2428                 AC_MSG_WARN([No 64 bit file size support available])
2429         fi
2430         
2431         dnl *****************************
2432         dnl *** Checks for libsocket  ***
2433         dnl *****************************
2434         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2436         dnl *****************************
2437         dnl *** Checks for IPPROTO_IP ***
2438         dnl *****************************
2439         AC_MSG_CHECKING(for IPPROTO_IP)
2440         AC_TRY_COMPILE([#include <netinet/in.h>], [
2441                 int level = IPPROTO_IP;
2442         ], [
2443                 # Yes, we have it...
2444                 AC_MSG_RESULT(yes)
2445                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2446         ], [
2447                 # We'll have to use getprotobyname
2448                 AC_MSG_RESULT(no)
2449         ])
2451         dnl *******************************
2452         dnl *** Checks for IPPROTO_IPV6 ***
2453         dnl *******************************
2454         AC_MSG_CHECKING(for IPPROTO_IPV6)
2455         AC_TRY_COMPILE([#include <netinet/in.h>], [
2456                 int level = IPPROTO_IPV6;
2457         ], [
2458                 # Yes, we have it...
2459                 AC_MSG_RESULT(yes)
2460                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2461         ], [
2462                 # We'll have to use getprotobyname
2463                 AC_MSG_RESULT(no)
2464         ])
2466         dnl ******************************
2467         dnl *** Checks for IPPROTO_TCP ***
2468         dnl ******************************
2469         AC_MSG_CHECKING(for IPPROTO_TCP)
2470         AC_TRY_COMPILE([#include <netinet/in.h>], [
2471                 int level = IPPROTO_TCP;
2472         ], [
2473                 # Yes, we have it...
2474                 AC_MSG_RESULT(yes)
2475                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2476         ], [
2477                 # We'll have to use getprotobyname
2478                 AC_MSG_RESULT(no)
2479         ])
2481         dnl *****************************
2482         dnl *** Checks for SOL_IP     ***
2483         dnl *****************************
2484         AC_MSG_CHECKING(for SOL_IP)
2485         AC_TRY_COMPILE([#include <netdb.h>], [
2486                 int level = SOL_IP;
2487         ], [
2488                 # Yes, we have it...
2489                 AC_MSG_RESULT(yes)
2490                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2491         ], [
2492                 # We'll have to use getprotobyname
2493                 AC_MSG_RESULT(no)
2494         ])
2496         dnl *****************************
2497         dnl *** Checks for SOL_IPV6     ***
2498         dnl *****************************
2499         AC_MSG_CHECKING(for SOL_IPV6)
2500         AC_TRY_COMPILE([#include <netdb.h>], [
2501                 int level = SOL_IPV6;
2502         ], [
2503                 # Yes, we have it...
2504                 AC_MSG_RESULT(yes)
2505                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2506         ], [
2507                 # We'll have to use getprotobyname
2508                 AC_MSG_RESULT(no)
2509         ])
2511         dnl *****************************
2512         dnl *** Checks for SOL_TCP    ***
2513         dnl *****************************
2514         AC_MSG_CHECKING(for SOL_TCP)
2515         AC_TRY_COMPILE([#include <netdb.h>], [
2516                 int level = SOL_TCP;
2517         ], [
2518                 # Yes, we have it...
2519                 AC_MSG_RESULT(yes)
2520                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2521         ], [
2522                 # We'll have to use getprotobyname
2523                 AC_MSG_RESULT(no)
2524         ])
2526         dnl *****************************
2527         dnl *** Checks for IP_PKTINFO ***
2528         dnl *****************************
2529         AC_MSG_CHECKING(for IP_PKTINFO)
2530         AC_TRY_COMPILE([#include <linux/in.h>], [
2531                 int level = IP_PKTINFO;
2532         ], [
2533                 # Yes, we have it...
2534                 AC_MSG_RESULT(yes)
2535                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2536         ], [
2537                 AC_MSG_RESULT(no)
2538         ])
2540         dnl *****************************
2541         dnl *** Checks for IPV6_PKTINFO ***
2542         dnl *****************************
2543         AC_MSG_CHECKING(for IPV6_PKTINFO)
2544         AC_TRY_COMPILE([#include <netdb.h>], [
2545                 int level = IPV6_PKTINFO;
2546         ], [
2547                 # Yes, we have it...
2548                 AC_MSG_RESULT(yes)
2549                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2550         ], [
2551                 AC_MSG_RESULT(no)
2552         ])
2554         dnl **********************************
2555         dnl *** Checks for IP_DONTFRAG     ***
2556         dnl **********************************
2557         AC_MSG_CHECKING(for IP_DONTFRAG)
2558         AC_TRY_COMPILE([#include <netinet/in.h>], [
2559                 int level = IP_DONTFRAG;
2560         ], [
2561                 # Yes, we have it...
2562                 AC_MSG_RESULT(yes)
2563                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2564         ], [
2565                 AC_MSG_RESULT(no)
2566         ])
2568         dnl **********************************
2569         dnl *** Checks for IP_DONTFRAGMENT ***
2570         dnl **********************************
2571         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2572         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2573                 int level = IP_DONTFRAGMENT;
2574         ], [
2575                 # Yes, we have it...
2576                 AC_MSG_RESULT(yes)
2577                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2578         ], [
2579                 AC_MSG_RESULT(no)
2580         ])
2582         dnl **********************************
2583         dnl *** Checks for IP_MTU_DISCOVER ***
2584         dnl **********************************
2585         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2586         AC_TRY_COMPILE([#include <linux/in.h>], [
2587                 int level = IP_MTU_DISCOVER;
2588         ], [
2589                 # Yes, we have it...
2590                 AC_MSG_RESULT(yes)
2591                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2592         ], [
2593                 AC_MSG_RESULT(no)
2594         ])
2596         dnl **********************************
2597         dnl *** Checks for  IP_PMTUDISC_DO ***
2598         dnl **********************************
2599         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2600         AC_TRY_COMPILE([#include <linux/in.h>], [
2601                 int level = IP_PMTUDISC_DO;
2602         ], [
2603                 # Yes, we have it...
2604                 AC_MSG_RESULT(yes)
2605                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2606         ], [
2607                 AC_MSG_RESULT(no)
2608         ])
2610         dnl *********************************
2611         dnl *** Check for struct ip_mreqn ***
2612         dnl *********************************
2613         AC_MSG_CHECKING(for struct ip_mreqn)
2614         AC_TRY_COMPILE([#include <netinet/in.h>], [
2615                 struct ip_mreqn mreq;
2616                 mreq.imr_address.s_addr = 0;
2617         ], [
2618                 # Yes, we have it...
2619                 AC_MSG_RESULT(yes)
2620                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2621         ], [
2622                 # We'll just have to try and use struct ip_mreq
2623                 AC_MSG_RESULT(no)
2624                 AC_MSG_CHECKING(for struct ip_mreq)
2625                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2626                         struct ip_mreq mreq;
2627                         mreq.imr_interface.s_addr = 0;
2628                 ], [
2629                         # Yes, we have it...
2630                         AC_MSG_RESULT(yes)
2631                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2632                 ], [
2633                         # No multicast support
2634                         AC_MSG_RESULT(no)
2635                 ])
2636         ])
2637         
2638         dnl **********************************
2639         dnl *** Check for getaddrinfo ***
2640         dnl **********************************
2641         AC_MSG_CHECKING(for getaddrinfo)
2642                 AC_TRY_LINK([
2643                 #include <stdio.h>
2644                 #include <netdb.h>
2645         ], [
2646                 getaddrinfo(NULL,NULL,NULL,NULL);
2647         ], [
2648                 # Yes, we have it...
2649                 AC_MSG_RESULT(yes)
2650                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2651         ], [
2652                 AC_MSG_RESULT(no)
2653         ])
2655         dnl **********************************
2656         dnl *** Check for gethostbyname2_r ***
2657         dnl **********************************
2658         AC_MSG_CHECKING(for gethostbyname2_r)
2659                 AC_TRY_LINK([
2660                 #include <stdio.h>
2661                 #include <netdb.h>
2662         ], [
2664                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2665         ], [
2666                 # Yes, we have it...
2667                 AC_MSG_RESULT(yes)
2668                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2669         ], [
2670                 AC_MSG_RESULT(no)
2671         ])
2673         dnl **********************************
2674         dnl *** Check for gethostbyname2 ***
2675         dnl **********************************
2676         AC_MSG_CHECKING(for gethostbyname2)
2677                 AC_TRY_LINK([
2678                 #include <stdio.h>
2679                 #include <netdb.h>
2680         ], [
2681                 gethostbyname2(NULL,0);
2682         ], [
2683                 # Yes, we have it...
2684                 AC_MSG_RESULT(yes)
2685                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2686         ], [
2687                 AC_MSG_RESULT(no)
2688         ])
2690         dnl **********************************
2691         dnl *** Check for gethostbyname ***
2692         dnl **********************************
2693         AC_MSG_CHECKING(for gethostbyname)
2694                 AC_TRY_LINK([
2695                 #include <stdio.h>
2696                 #include <netdb.h>
2697         ], [
2698                 gethostbyname(NULL);
2699         ], [
2700                 # Yes, we have it...
2701                 AC_MSG_RESULT(yes)
2702                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2703         ], [
2704                 AC_MSG_RESULT(no)
2705         ])
2707         dnl **********************************
2708         dnl *** Check for getprotobyname ***
2709         dnl **********************************
2710         AC_MSG_CHECKING(for getprotobyname)
2711                 AC_TRY_LINK([
2712                 #include <stdio.h>
2713                 #include <netdb.h>
2714         ], [
2715                 getprotobyname(NULL);
2716         ], [
2717                 # Yes, we have it...
2718                 AC_MSG_RESULT(yes)
2719                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2720         ], [
2721                 AC_MSG_RESULT(no)
2722         ])
2724         dnl **********************************
2725         dnl *** Check for getprotobyname_r ***
2726         dnl **********************************
2727         AC_MSG_CHECKING(for getprotobyname_r)
2728                 AC_TRY_LINK([
2729                 #include <stdio.h>
2730                 #include <netdb.h>
2731         ], [
2732                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2733         ], [
2734                 # Yes, we have it...
2735                 AC_MSG_RESULT(yes)
2736                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2737         ], [
2738                 AC_MSG_RESULT(no)
2739         ])
2741         dnl **********************************
2742         dnl *** Check for getnameinfo ***
2743         dnl **********************************
2744         AC_MSG_CHECKING(for getnameinfo)
2745                 AC_TRY_LINK([
2746                 #include <stdio.h>
2747                 #include <netdb.h>
2748         ], [
2749                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2750         ], [
2751                 # Yes, we have it...
2752                 AC_MSG_RESULT(yes)
2753                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2754         ], [
2755                 AC_MSG_RESULT(no)
2756         ])
2759         dnl **********************************
2760         dnl *** Check for inet_ntop ***
2761         dnl **********************************
2762         AC_MSG_CHECKING(for inet_ntop)
2763                 AC_TRY_LINK([
2764                 #include <stdio.h>
2765                 #include <arpa/inet.h>
2766         ], [
2767                 inet_ntop (0, NULL, NULL, 0);
2768         ], [
2769                 # Yes, we have it...
2770                 AC_MSG_RESULT(yes)
2771                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2772         ], [
2773                 AC_MSG_RESULT(no)
2774         ])
2776         dnl *****************************
2777         dnl *** Checks for libnsl     ***
2778         dnl *****************************
2779         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2781         AC_CHECK_FUNCS(inet_pton inet_aton)
2783         dnl *****************************
2784         dnl *** Checks for libxnet    ***
2785         dnl *****************************
2786         case "${host}" in
2787                 *solaris*)
2788                         AC_MSG_CHECKING(for Solaris XPG4 support)
2789                         if test -f /usr/lib/libxnet.so; then
2790                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2791                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2792                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2793                                 LIBS="$LIBS -lxnet"
2794                                 AC_MSG_RESULT(yes)
2795                         else
2796                                 AC_MSG_RESULT(no)
2797                         fi
2799                         if test "$GCC" = "yes"; then
2800                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2801                         fi
2802                 ;;
2803         esac
2805         dnl *****************************
2806         dnl *** Checks for libpthread ***
2807         dnl *****************************
2808 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2809 # and libpthread does not exist
2811         case "${host}" in
2812                 *-*-*haiku*)
2813                         dnl Haiku has pthread in libroot (libc equiv)
2814                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2815                 ;;
2816                 *-*-*freebsd*)
2817                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2818                 ;;
2819                 *-*-*openbsd*)
2820                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2821                 ;;
2822                 *)
2823                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2824                 ;;
2825         esac
2826         AC_CHECK_HEADERS(pthread.h)
2827         AC_CHECK_HEADERS(pthread_np.h)
2828         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2829         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2830         AC_CHECK_FUNCS(pthread_kill pthread_jit_write_protect_np)
2831         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2832         AC_TRY_COMPILE([ #include <pthread.h>], [
2833                 pthread_mutexattr_t attr;
2834                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2835         ], [
2836                 AC_MSG_RESULT(ok)
2837         ], [
2838                 AC_MSG_RESULT(no)
2839                 AC_ERROR(Posix system lacks support for recursive mutexes)
2840         ])
2841         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2842         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2843         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2844         dnl check that pthread_mutexattr_setprotocol is declared
2845         AC_CHECK_DECLS([pthread_mutexattr_setprotocol], [], [], [[#include <pthread.h>]])
2846         AC_CHECK_FUNCS(mincore mlock munlock)
2848         dnl ***********************************
2849         dnl *** Checks for working __thread ***
2850         dnl ***********************************
2851         AC_MSG_CHECKING(for working __thread)
2852         if test "x$with_tls" != "x__thread"; then
2853                 AC_MSG_RESULT(disabled)
2854         elif test "x$cross_compiling" = "xyes"; then
2855                 AC_MSG_RESULT(cross compiling, assuming yes)
2856         else
2857                 AC_TRY_RUN([
2858                         #if defined(__APPLE__) && defined(__clang__)
2859                         #error "__thread does not currently work with clang on Mac OS X"
2860                         #endif
2861                         
2862                         #include <unistd.h>
2863                         #include <pthread.h>
2864                         __thread int i;
2865                         static int res1, res2;
2867                         void thread_main (void *arg)
2868                         {
2869                                 i = arg;
2870                                 sleep (1);
2871                                 if (arg == 1)
2872                                         res1 = (i == arg);
2873                                 else
2874                                         res2 = (i == arg);
2875                         }
2877                         int main () {
2878                                 pthread_t t1, t2;
2880                                 i = 5;
2882                                 pthread_create (&t1, NULL, thread_main, 1);
2883                                 pthread_create (&t2, NULL, thread_main, 2);
2885                                 pthread_join (t1, NULL);
2886                                 pthread_join (t2, NULL);
2888                                 return !(res1 + res2 == 2);
2889                         }
2890                 ], [
2891                                 AC_MSG_RESULT(yes)
2892                 ], [
2893                                 AC_MSG_RESULT(no)
2894                                 with_tls=pthread
2895                 ])
2896         fi
2898         dnl **************************************
2899         dnl *** Checks for working sigaltstack ***
2900         dnl **************************************
2901         AC_MSG_CHECKING(for working sigaltstack)
2902         if test "x$with_sigaltstack" != "xyes"; then
2903                 AC_MSG_RESULT(disabled)
2904         elif test "x$cross_compiling" = "xyes"; then
2905                 AC_MSG_RESULT(cross compiling, assuming no)
2906                 with_sigaltstack=no
2907         else
2908                 AC_TRY_RUN([
2909                         #include <stdio.h>
2910                         #include <stdlib.h>
2911                         #include <unistd.h>
2912                         #include <signal.h>
2913                         #include <pthread.h>
2914                         #include <sys/wait.h>
2915                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2916                         #define SA_STACK SA_ONSTACK
2917                         #endif
2918                         static void
2919                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2920                         {
2921                                 exit (0);
2922                         }
2924                         volatile char*__ptr = NULL;
2925                         static void *
2926                         loop (void *ignored)
2927                         {
2928                                 *__ptr = 0;
2929                                 return NULL;
2930                         }
2932                         static void
2933                         child ()
2934                         {
2935                                 struct sigaction sa;
2936                                 stack_t sas;
2937                                 pthread_t id;
2938                                 pthread_attr_t attr;
2940                                 sa.sa_sigaction = sigsegv_signal_handler;
2941                                 sigemptyset (&sa.sa_mask);
2942                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2943                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2944                                         perror ("sigaction");
2945                                         return;
2946                                 }
2948                                 /* x86 darwin deliver segfaults using SIGBUS */
2949                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2950                                         perror ("sigaction");
2951                                         return;
2952                                 }
2953                                 sas.ss_sp = malloc (SIGSTKSZ);
2954                                 sas.ss_size = SIGSTKSZ;
2955                                 sas.ss_flags = 0;
2956                                 if (sigaltstack (&sas, NULL) == -1) {
2957                                         perror ("sigaltstack");
2958                                         return;
2959                                 }
2961                                 pthread_attr_init (&attr);
2962                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2963                                         printf ("pthread_create\n");
2964                                         return;
2965                                 }
2967                                 sleep (100);
2968                         }
2970                         int
2971                         main ()
2972                         {
2973                                 pid_t son;
2974                                 int status;
2975                                 int i;
2977                                 son = fork ();
2978                                 if (son == -1) {
2979                                         return 1;
2980                                 }
2982                                 if (son == 0) {
2983                                         child ();
2984                                         return 0;
2985                                 }
2987                                 for (i = 0; i < 300; ++i) {
2988                                         waitpid (son, &status, WNOHANG);
2989                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2990                                                 return 0;
2991                                         usleep (10000);
2992                                 }
2994                                 kill (son, SIGKILL);
2995                                 return 1;
2996                         }
2998                 ], [
2999                                 AC_MSG_RESULT(yes)
3000                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
3001                 ], [
3002                                 with_sigaltstack=no
3003                                 AC_MSG_RESULT(no)
3004                 ])
3005         fi
3007         dnl ********************************
3008         dnl *** Checks for sys_signame ***
3009         dnl ********************************
3010         AC_MSG_CHECKING(for sys_signame)
3011                 AC_TRY_LINK([
3012                 #include <signal.h>
3013         ], [
3014                 const char *signame = sys_signame[0];
3015         ], [
3016                 # Yes, we have it...
3017                 AC_MSG_RESULT(yes)
3018                 AC_DEFINE(HAVE_SYSSIGNAME, 1, [Have sys_signame])
3019         ], [
3020                 AC_MSG_RESULT(no)
3021         ])
3024         dnl ********************************
3025         dnl *** Checks for semaphore lib ***
3026         dnl ********************************
3027         # 'Real Time' functions on Solaris
3028         # posix4 on Solaris 2.6
3029         # pthread (first!) on Linux
3030         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
3032         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
3033         AC_CHECK_FUNCS(shm_open)
3035         dnl ********************************
3036         dnl *** Checks for timezone stuff **
3037         dnl ********************************
3038         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
3039                 AC_TRY_COMPILE([
3040                         #include <time.h>
3041                         ], [
3042                         struct tm tm;
3043                         tm.tm_gmtoff = 1;
3044                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
3045         if test $ac_cv_struct_tm_gmtoff = yes; then
3046                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
3047         else
3048                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
3049                         AC_TRY_COMPILE([
3050                                 #include <time.h>
3051                         ], [
3052                                 timezone = 1;
3053                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
3054                 if test $ac_cv_var_timezone = yes; then
3055                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
3056                 else
3057                         AC_ERROR(unable to find a way to determine timezone)
3058                 fi
3059         fi
3061         dnl *********************************
3062         dnl *** Checks for math functions ***
3063         dnl *********************************
3064         AC_SEARCH_LIBS(sqrtf, m)
3066         dnl ****************************************************************
3067         dnl *** Checks for working poll() (macosx defines it but doesn't ***
3068         dnl *** have it in the library (duh))                            ***
3069         dnl ****************************************************************
3070         AC_CHECK_FUNCS(poll)
3072         dnl **********************************
3073         dnl *** epoll                      ***
3074         dnl **********************************
3075         AC_CHECK_HEADERS(sys/epoll.h)
3076         haveepoll=no
3077         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
3078         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
3079                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
3080         fi
3082         havekqueue=no
3084         AC_CHECK_HEADERS(sys/event.h)
3085         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
3087         dnl **************************************
3088         dnl * Darwin has a race that prevents us from using reliably:
3089         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
3090         dnl * Since kqueue is mostly used for scaling large web servers, 
3091         dnl * and very few folks run Mono on large web servers on OSX, falling
3092         dnl * back 
3093         dnl **************************************
3094         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
3095                 if test "x$host_darwin" = "xno"; then
3096                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
3097                 fi
3098         fi
3100         dnl ******************************
3101         dnl *** Checks for SIOCGIFCONF ***
3102         dnl ******************************
3103         AC_CHECK_HEADERS(sys/ioctl.h)
3104         AC_CHECK_HEADERS(net/if.h, [], [],
3105            [
3106            #ifdef HAVE_SYS_TYPES_H
3107            # include <sys/types.h>
3108            #endif
3109            #ifdef HAVE_SYS_SOCKET_H
3110            # include <sys/socket.h>
3111            #endif
3112            ])
3113         AC_MSG_CHECKING(for ifreq)
3114         AC_TRY_COMPILE([
3115                 #include <stdio.h>
3116                 #include <sys/ioctl.h>
3117                 #include <net/if.h>
3118                 ], [
3119                 struct ifconf ifc;
3120                 struct ifreq *ifr;
3121                 void *x;
3122                 ifc.ifc_len = 0;
3123                 ifc.ifc_buf = NULL;
3124                 x = (void *) &ifr->ifr_addr;
3125                 ],[
3126                         AC_MSG_RESULT(yes)
3127                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
3128                 ], [
3129                         AC_MSG_RESULT(no)
3130                 ])
3131         dnl **********************************
3132         dnl ***     Checks for sin_len     ***
3133         dnl **********************************
3134         AC_MSG_CHECKING(for sockaddr_in.sin_len)
3135         AC_TRY_COMPILE([
3136                 #include <netinet/in.h>
3137                 ], [
3138                 struct sockaddr_in saddr;
3139                 saddr.sin_len = sizeof (saddr);
3140                 ],[
3141                         AC_MSG_RESULT(yes)
3142                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
3143                 ], [
3144                         AC_MSG_RESULT(no)
3145                 ])      
3146         dnl **********************************
3147         dnl ***    Checks for sin6_len     ***
3148         dnl **********************************
3149         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
3150         AC_TRY_COMPILE([
3151                 #include <netinet/in.h>
3152                 ], [
3153                 struct sockaddr_in6 saddr6;
3154                 saddr6.sin6_len = sizeof (saddr6);
3155                 ],[
3156                         AC_MSG_RESULT(yes)
3157                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
3158                 ], [
3159                         AC_MSG_RESULT(no)
3160                 ])
3161         dnl **********************************
3162         dnl *** Check for getifaddrs       ***
3163         dnl **********************************
3164         AC_MSG_CHECKING(for getifaddrs)
3165                 AC_TRY_LINK([
3166                 #include <stdio.h>
3167                 #include <sys/types.h>
3168                 #include <sys/socket.h>
3169                 #ifdef HAVE_NET_IF_H
3170                 #include <net/if.h>
3171                 #endif
3172                 #include <ifaddrs.h>
3173         ], [
3174                 getifaddrs(NULL);
3175         ], [
3176                 # Yes, we have it...
3177                 AC_MSG_RESULT(yes)
3178                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
3179         ], [
3180                 AC_MSG_RESULT(no)
3181         ])
3182         dnl **********************************
3183         dnl *** Check for if_nametoindex   ***
3184         dnl **********************************
3185         AC_MSG_CHECKING(for if_nametoindex)
3186                 AC_TRY_LINK([
3187                 #include <stdio.h>
3188                 #include <sys/types.h>
3189                 #include <sys/socket.h>
3190                 #include <net/if.h>
3191         ], [
3192                 if_nametoindex(NULL);
3193         ], [
3194                 # Yes, we have it...
3195                 AC_MSG_RESULT(yes)
3196                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
3197         ], [
3198                 AC_MSG_RESULT(no)
3199         ])
3200         dnl **********************************
3201         dnl *** Check for access ***
3202         dnl **********************************
3203         AC_MSG_CHECKING(for access)
3204                 AC_TRY_LINK([
3205                 #include <unistd.h>
3206         ], [
3207                 access(NULL,0);
3208         ], [
3209                 # Yes, we have it...
3210                 AC_MSG_RESULT(yes)
3211                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
3212         ], [
3213                 AC_MSG_RESULT(no)
3214         ])
3215                         
3216         dnl **********************************
3217         dnl *** Checks for proclib         ***
3218         dnl **********************************
3219         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.)])
3220         dnl **********************************
3221         dnl *** Checks for MonoPosixHelper ***
3222         dnl **********************************
3223         AC_CHECK_HEADERS(checklist.h)
3224         AC_CHECK_HEADERS(pathconf.h)
3225         AC_CHECK_HEADERS(fstab.h)
3226         AC_CHECK_HEADERS(attr/xattr.h)
3227         AC_CHECK_HEADERS(sys/extattr.h)
3228         AC_CHECK_HEADERS(sys/sendfile.h)
3229         AC_CHECK_HEADERS(sys/statvfs.h)
3230         AC_CHECK_HEADERS(sys/statfs.h)
3231         AC_CHECK_HEADERS(sys/vfstab.h)
3232         AC_CHECK_HEADERS(sys/xattr.h)
3233         AC_CHECK_HEADERS(sys/mman.h)
3234         AC_CHECK_HEADERS(sys/param.h)
3235         AC_CHECK_HEADERS(sys/mount.h, [], [],
3236                 [
3237                 #ifdef HAVE_SYS_PARAM_H
3238                 # include <sys/param.h>
3239                 #endif
3240                 ])
3241         AC_CHECK_HEADERS(sys/mount.h)
3242         AC_CHECK_FUNCS(confstr)
3243         AC_CHECK_FUNCS(seekdir telldir)
3244         AC_CHECK_FUNCS(getdomainname)
3245         AC_CHECK_FUNCS(setdomainname)
3246         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
3247         AC_CHECK_FUNCS(setgroups)
3248         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
3249         AC_CHECK_FUNCS(getfsstat)
3250         AC_CHECK_FUNCS(lutimes futimes)
3251         AC_CHECK_FUNCS(mremap)
3252         AC_CHECK_FUNCS(remap_file_pages)
3253         AC_CHECK_FUNCS(posix_fadvise)
3254         AC_CHECK_FUNCS(posix_fallocate)
3255         AC_CHECK_FUNCS(vsnprintf)
3256         AC_CHECK_FUNCS(sendfile)
3257         AC_CHECK_FUNCS(gethostid sethostid)
3258         AC_CHECK_FUNCS(sethostname)
3259         AC_CHECK_FUNCS(statfs)
3260         AC_CHECK_FUNCS(fstatfs)
3261         AC_CHECK_FUNCS(statvfs)
3262         AC_CHECK_FUNCS(fstatvfs)
3263         AC_CHECK_FUNCS(stime)
3264         AC_CHECK_FUNCS(ttyname_r)
3265         AC_CHECK_FUNCS(psignal)
3266         AC_CHECK_FUNCS(getlogin_r)
3267         AC_CHECK_FUNCS(lockf)
3268         AC_CHECK_FUNCS(swab)
3269         AC_CHECK_FUNCS(setusershell endusershell)
3270         AC_CHECK_FUNCS(futimens utimensat)
3271         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
3272         AC_CHECK_FUNCS(readv writev preadv pwritev)
3273         AC_CHECK_FUNCS(setpgid)
3274         AC_CHECK_FUNCS(system)
3275         AC_CHECK_FUNCS(fork execv execve)
3276         AC_CHECK_FUNCS(waitpid)
3277         AC_CHECK_FUNCS(accept4)
3278         AC_CHECK_FUNCS(localtime_r)
3279         AC_CHECK_FUNCS(mkdtemp)
3280         AC_CHECK_SIZEOF(size_t)
3281         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
3282                 [#include <sys/types.h>
3283                  #include <sys/stat.h>
3284                  #include <unistd.h>])
3285         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
3286                 [#include <sys/types.h>
3287                  #include <sys/stat.h>
3288                  #include <unistd.h>])
3289         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
3290                 [#include <sys/time.h>])
3291         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
3292                 [#include <sys/socket.h>])
3293         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
3294                 [#include <unistd.h>
3295                  #include <fcntl.h>])
3296         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
3297                 [#include <sys/uio.h>])
3298         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
3299                 [#include <sys/socket.h>])
3300         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3301                 [#include <sys/poll.h>])
3302         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3303                 [#include <sys/socket.h>])
3304         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3305                 [#include <sys/socket.h>])
3306         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3307                 [#include <netinet/in.h>])
3308         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3309                 [#include <netinet/in.h>])
3310         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3311                 [#include <sys/un.h>])
3312         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3313                 [#include <sys/types.h>
3314                  #include <sys/stat.h>
3315                  #include <unistd.h>])
3316         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3317                 [#include <time.h>])
3318         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3319                 [#include <sys/time.h>
3320                  #include <sys/types.h>
3321                  #include <utime.h>])
3322         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3323                 [#include <sys/time.h>])
3324         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3325                 [#include <sys/types.h>
3326                  #include <utime.h>])
3327         AC_CHECK_MEMBERS(
3328                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3329                 [#include <sys/types.h>
3330                  #include <dirent.h>])
3331         AC_CHECK_MEMBERS(
3332                 [struct passwd.pw_gecos],,, 
3333                 [#include <sys/types.h>
3334                  #include <pwd.h>])
3335         AC_CHECK_MEMBERS(
3336                 [struct statfs.f_flags],,, 
3337                 [#include <sys/types.h>
3338                  #include <sys/vfs.h>])
3339         AC_CHECK_MEMBERS(
3340                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3341                 [#include <sys/types.h>
3342                  #include <sys/stat.h>
3343                  #include <unistd.h>])
3345         dnl Favour xattr through glibc, but use libattr if we have to
3346         AC_CHECK_FUNC(lsetxattr, ,
3347                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3348         )
3349         AC_SUBST(XATTR_LIB)
3351         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3352         AC_CHECK_MEMBERS(
3353                 [struct kinfo_proc.kp_proc],,, 
3354                 [#include <sys/types.h>
3355                  #include <sys/param.h>
3356                  #include <sys/sysctl.h>
3357                  #include <sys/proc.h>
3358                  ])
3360         dnl *********************************
3361         dnl *** Checks for Windows compilation ***
3362         dnl *********************************
3363         AC_CHECK_HEADERS(sys/time.h)
3364         AC_CHECK_HEADERS(sys/param.h)
3365         AC_CHECK_HEADERS(dirent.h)
3367         dnl ******************************************
3368         dnl *** Checks for OSX and iOS compilation ***
3369         dnl ******************************************
3370         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3372         dnl *********************************
3373         dnl *** Check for Console 2.0 I/O ***
3374         dnl *********************************
3375         AC_CHECK_HEADERS([curses.h])
3376         AC_CHECK_HEADERS([term.h], [], [],
3377         [#if HAVE_CURSES_H
3378          #include <curses.h>
3379          #endif
3380         ])
3381         AC_CHECK_HEADERS([termios.h])
3383         dnl *********************************
3384         dnl *** Checks for random         ***
3385         dnl *********************************
3386         if test x$host_darwin = xno; then
3387                 AC_CHECK_HEADERS(sys/random.h)
3388                 AC_CHECK_FUNCS(getrandom getentropy)
3389         fi
3391         dnl *********************************
3392         dnl *** Checks for Mono.Native    ***
3393         dnl *********************************
3395         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3396         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3398         AC_MSG_CHECKING(for linux/in.h)
3399         AC_TRY_COMPILE([
3400                 #include <sys/socket.h>
3401                 #include <linux/in.h>
3402         ], [
3403         ],[
3404                 AC_MSG_RESULT(yes)
3405                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3406         ], [
3407                 AC_MSG_RESULT(no)
3408         ])
3410         AC_CHECK_HEADERS([linux/if_packet.h])
3412         AC_MSG_CHECKING(for struct in_pktinfo)
3413         AC_TRY_COMPILE([
3414                 #ifdef HAVE_LINUX_IN_H
3415                 #include <sys/socket.h>
3416                 #include <linux/in.h>
3417                 #else
3418                 #include <netinet/in.h>
3419                 #endif
3420         ], [
3421                 struct in_pktinfo pktinfo;
3422         ],[
3423                 AC_MSG_RESULT(yes)
3424                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3425         ], [
3426                 AC_MSG_RESULT(no)
3427         ])
3429         AC_MSG_CHECKING(for struct ip_mreqn)
3430         AC_TRY_COMPILE([
3431                 #if HAVE_LINUX_IN_H
3432                 #include <sys/socket.h>
3433                 #include <linux/in.h>
3434                 #else
3435                 #include <netinet/in.h>
3436                 #endif
3437         ], [
3438                 struct ip_mreqn mreqn;
3439         ],[
3440                 AC_MSG_RESULT(yes)
3441                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3442         ], [
3443                 AC_MSG_RESULT(no)
3444         ])
3446         if test x$host_darwin = xno; then
3447                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3448         fi
3450         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3451         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3453         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3454         AC_CHECK_FUNC(Qp2getifaddrs,     [AC_DEFINE(HAVE_QP2GETIFADDRS, 1, [Qp2getifaddrs])])
3456         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3457         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3458         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3459         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3461         if test "x$mono_native_platform_ios" = "xno"; then
3462                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3463                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3464                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3465         fi
3467         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3468         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3469         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3470         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3471         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
3472         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3473         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3474         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3476         if test "x$platform_android" != "xyes"; then
3477                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3478         fi
3480         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3481         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3482         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3483         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3484         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3485         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3487         AC_CHECK_DECL(lchflags,          [AC_DEFINE(HAVE_LCHFLAGS, 1, [lchflags])], [], 
3488                 [[#include <sys/types.h> 
3489                 #include <sys/stat.h>]])
3490         AC_CHECK_MEMBER(struct stat.st_flags,
3491                 [AC_DEFINE(HAVE_STAT_FLAGS, 1, [struct stat.st_flags])],
3492                 [],
3493                 [#include <sys/types.h>
3494                 #include <sys/stat.h>])
3496         AC_CHECK_MEMBER(struct stat.st_birthtimespec,
3497                 [AC_DEFINE(HAVE_STAT_BIRTHTIME, 1, [struct stat.st_birthtimespec])],
3498                 [],
3499                 [#include <sys/types.h>
3500                 #include <sys/stat.h>])
3501         AC_CHECK_MEMBER(struct stat.st_atimespec,
3502                 [AC_DEFINE(HAVE_STAT_TIMESPEC, 1, [struct stat.st_atimespec])],
3503                 [],
3504                 [#include <sys/types.h>
3505                 #include <sys/stat.h>])
3506         AC_CHECK_MEMBER(struct stat.st_atim,
3507                 [AC_DEFINE(HAVE_STAT_TIM, 1, [struct stat.st_atim])],
3508                 [],
3509                 [#include <sys/types.h>
3510                 #include <sys/stat.h>])
3511         AC_CHECK_MEMBER(struct stat.st_atimensec,
3512                 [AC_DEFINE(HAVE_STAT_NSEC, 1, [struct stat.st_atimensec])],
3513                 [],
3514                 [#include <sys/types.h>
3515                 #include <sys/stat.h>])
3516         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [#include <dirent.h>])
3517         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [#include <sys/mount.h>])
3518         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [#include <sys/mount.h>])
3520         AC_MSG_CHECKING(for struct statfs)
3521         AC_TRY_COMPILE([
3522                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3523                 #include <sys/mount.h>
3524                 #else
3525                 #include <sys/statfs.h>
3526                 #endif
3527         ], [
3528                 struct statfs;
3529         ],[
3530                 AC_MSG_RESULT(yes)
3531                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3532         ], [
3533                 AC_MSG_RESULT(no)
3534         ])
3536         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3537                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3538         fi
3540         AC_MSG_CHECKING(for readdir_r)
3541         AC_TRY_LINK([
3542                 #include <dirent.h>
3543         ], [
3544                 DIR* dir;
3545                 struct dirent* entry;
3546                 struct dirent* result;
3547                 readdir_r(dir, entry, &result);
3548         ],[
3549                 AC_MSG_RESULT(yes)
3550                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3551         ], [
3552                 AC_MSG_RESULT(no)
3553         ])
3555         AC_MSG_CHECKING(for kevent with void *data)
3556         AC_TRY_LINK([
3557                 #include <sys/types.h>
3558                 #include <sys/event.h>
3559         ], [
3560                 struct kevent event;
3561                 void* data;
3562                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3563         ],[
3564                 AC_MSG_RESULT(yes)
3565                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3566         ], [
3567                 AC_MSG_RESULT(no)
3568         ])
3570         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3571         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3573         AC_MSG_CHECKING(for sendfile with 4 arguments)
3574         AC_TRY_LINK([
3575                 #include <sys/sendfile.h>
3576         ], [
3577                 #if defined(TARGET_ANDROID)
3578                 #if !defined(__ANDROID_API__)
3579                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3580                 #elif __ANDROID_API__ < 21
3581                 #error sendfile is not supported on this Android API level
3582                 #endif
3583                 #endif
3585                 int result = sendfile(0, 0, 0, 0);
3586         ],[
3587                 AC_MSG_RESULT(yes)
3588                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3589         ], [
3590                 AC_MSG_RESULT(no)
3591         ])
3593         ORIG_CFLAGS="$CFLAGS"
3594         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3596         AC_MSG_CHECKING(for sendfile with 6 arguments)
3597         AC_TRY_LINK([
3598                 #include <stdlib.h>
3599                 #include <sys/types.h>
3600                 #include <sys/socket.h>
3601                 #include <sys/uio.h>
3602         ], [
3603                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3604         ],[
3605                 AC_MSG_RESULT(yes)
3606                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3607         ], [
3608                 AC_MSG_RESULT(no)
3609         ])
3611         CFLAGS="$ORIG_CFLAGS"
3613         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3614         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3615         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3616         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3618         ORIG_CFLAGS="$CFLAGS"
3619         CFLAGS="$CFLAGS -Werror=sign-conversion"
3621         AC_MSG_CHECKING(for getnameinfo with signed flags)
3622         AC_TRY_LINK([
3623                 #include <sys/types.h>
3624                 #include <netdb.h>
3625         ], [
3626                 const struct sockaddr *addr;
3627                 socklen_t addrlen;
3628                 char *host;
3629                 socklen_t hostlen;
3630                 char *serv;
3631                 socklen_t servlen;
3632                 int flags;
3633                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3634         ],[
3635                 AC_MSG_RESULT(yes)
3636                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3637         ], [
3638                 AC_MSG_RESULT(no)
3639         ])
3641         CFLAGS="$ORIG_CFLAGS"
3643         if test "x$host_linux" = "xyes"; then
3644                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3645         else
3646                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3647         fi
3649         # HAVE_CLOCK_MONOTONIC check already done above
3650         # HAVE_CLOCK_REALTIME check already done above
3651         # HAVE_MACH_ABSOLUTE_TIME check already done above
3652         # HAVE_MACH_TIMEBASE_INFO check already done above
3653         # HAVE_FUTIMES check already done above
3654         # HAVE_FUTIMENS check already done above
3656         ORIG_CFLAGS="$CFLAGS"
3657         CFLAGS="$CFLAGS -Werror=sign-conversion"
3659         AC_MSG_CHECKING(for bind with unsigned addrlen)
3660         AC_TRY_LINK([
3661                 #include <sys/socket.h>
3662         ], [
3663                 int fd;
3664                 struct sockaddr* addr;
3665                 socklen_t addrLen;
3666                 bind(fd, addr, addrLen);
3667         ],[
3668                 AC_MSG_RESULT(yes)
3669                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3670         ], [
3671                 AC_MSG_RESULT(no)
3672         ])
3674         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3675         AC_TRY_LINK([
3676                 #include <netinet/in.h>
3677                 #include <netinet/tcp.h>
3678         ], [
3679                 struct ipv6_mreq opt;
3680                 unsigned int index = 0;
3681                 opt.ipv6mr_interface = index;
3682         ],[
3683                 AC_MSG_RESULT(yes)
3684                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3685         ], [
3686                 AC_MSG_RESULT(no)
3687         ])
3689         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3690         AC_TRY_LINK([
3691                 #include <sys/inotify.h>
3692         ], [
3693                 intptr_t fd;
3694                 uint32_t wd;
3695                 int result = inotify_rm_watch(fd, wd);
3696         ],[
3697                 AC_MSG_RESULT(yes)
3698                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3699         ], [
3700                 AC_MSG_RESULT(no)
3701         ])
3703         case "$host" in
3704                 *-*-*freebsd*)
3705                         dnl *****************************
3706                         dnl *** Checks for libinotify ***
3707                         dnl *****************************
3708                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
3709                         if test "x$ac_cv_lib_inotify_inotify_init" = "xyes" ; then
3710                                 AC_DEFINE(HAVE_LIBINOTIFY, 1, [FreeBSD libinotify kqueue shim])
3711                                 dnl Needs to be done this way to avoid collision with various 
3712                                 dnl ports including glib and llvm*
3713                                 METADATA_CFLAGS="-I/usr/local/include"
3714                                 AC_SUBST(METADATA_CFLAGS)
3715                         fi
3716                         dnl Workaround due to inotify_rm_watch check failing without -I
3717                         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd in libinotify)
3718                         AC_TRY_LINK([
3719                                 #include </usr/local/include/sys/inotify.h>
3720                         ], [
3721                                 intptr_t fd;
3722                                 uint32_t wd;
3723                                 int result = inotify_rm_watch(fd, wd);
3724                         ],[
3725                            AC_MSG_RESULT(yes)
3726                            AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3727                         ], [
3728                                 AC_MSG_RESULT(no)
3729                         ])
3730         esac
3732         CFLAGS="$ORIG_CFLAGS"
3734         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3735         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3736                 AC_MSG_RESULT(no)
3737         elif test "x$cross_compiling" = "xyes"; then
3738                 AC_MSG_RESULT(cross compiling, assuming yes)
3739                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3740         else
3741                 AC_TRY_RUN([
3742                         #include <sys/mman.h>
3743                         #include <fcntl.h>
3744                         #include <unistd.h>
3746                         int main ()
3747                         {
3748                         #ifdef __PASE__
3749                                 /* IBM i doesn't implement this and returns SIGILL */
3750                                 return -1;
3751                         #endif
3752                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3753                                 if (fd == -1)
3754                                         return -1;
3756                                 shm_unlink("/mono_configure_shm_open");
3758                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3759                                 //       on at least the current version of Mac OS X
3761                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3762                                         return -1;
3764                                 return 0;
3765                         }
3766                 ],[
3767                         AC_MSG_RESULT(yes)
3768                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3769                 ], [
3770                         AC_MSG_RESULT(no)
3771                 ])
3772         fi
3774         AC_MSG_CHECKING(for getpriority with int who)
3775         AC_TRY_LINK([
3776                 #include <sys/resource.h>
3777         ], [
3778                 int which;
3779                 int who;
3780                 int result = getpriority(which, who);
3781         ],[
3782                 AC_MSG_RESULT(yes)
3783                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3784         ], [
3785                 AC_MSG_RESULT(no)
3786         ])
3788         AC_MSG_CHECKING(for kevent with int parameters)
3789         AC_TRY_LINK([
3790                 #include <sys/types.h>
3791                 #include <sys/event.h>
3792         ], [
3793                 int kg;
3794                 const struct kevent* chagelist;
3795                 int nchanges;
3796                 struct kevent* eventlist;
3797                 int nevents;
3798                 const struct timespec* timeout;
3799                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3800         ],[
3801                 AC_MSG_RESULT(yes)
3802                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3803         ], [
3804                 AC_MSG_RESULT(no)
3805         ])
3807         AC_CHECK_FUNCS(mkstemps)
3808         # AC_CHECK_FUNCS(mkstemp) # already done above
3810         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3811                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3812         fi
3814         AC_MSG_CHECKING(for tcp/var.h)
3815         AC_TRY_LINK([
3816                 #include <sys/types.h>
3817                 #include <sys/socketvar.h>
3818                 #include <netinet/ip.h>
3819                 #include <netinet/tcp.h>
3820                 #include <netinet/tcp_var.h>
3821         ], [
3822         ],[
3823                 AC_MSG_RESULT(yes)
3824                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3825         ], [
3826                 AC_MSG_RESULT(no)
3827         ])
3829         AC_CHECK_HEADERS([sys/cdefs.h])
3831         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3832         AC_TRY_LINK([
3833                 #ifdef HAVE_SYS_CDEFS_H
3834                 #include <sys/cdefs.h>
3835                 #endif
3836                 #include <netinet/tcp.h>
3837         ], [
3838                 int result = TCP_ESTABLISHED;
3839         ],[
3840                 AC_MSG_RESULT(yes)
3841                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3842         ], [
3843                 AC_MSG_RESULT(no)
3844         ])
3846         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3848         AC_MSG_CHECKING(for struct rt_msghdr)
3849         AC_TRY_COMPILE([
3850                 #include <sys/types.h>
3851                 #include <net/route.h>
3852         ], [
3853                 struct rt_msghdr;
3854         ],[
3855                 AC_MSG_RESULT(yes)
3856                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3857         ], [
3858                 AC_MSG_RESULT(no)
3859         ])
3861         AC_CHECK_HEADERS([sys/sysctl.h])
3862         AC_CHECK_HEADERS([linux/rtnetlink.h])
3864         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3865         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3866         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3868         ORIG_CFLAGS="$CFLAGS"
3869         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3871         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3872         AC_TRY_LINK([
3873                 #include <unistd.h>
3874         ], [
3875                 size_t namelen = 20;
3876                 char name[20];
3877                 int result = getdomainname(name, namelen);
3878         ],[
3879                 AC_MSG_RESULT(yes)
3880                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3881         ], [
3882                 AC_MSG_RESULT(no)
3883         ])
3885         CFLAGS="$ORIG_CFLAGS"
3887         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3888         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3889         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3891         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
3892                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3893         elif test "x$host_linux" = "xyes"; then
3894                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3895         fi
3897         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3898         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3899         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3900         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3902         enable_gss=no;
3903         AC_MSG_CHECKING(for GSS/GSS.h)
3904         AC_TRY_COMPILE([
3905                         #include <GSS/GSS.h>
3906         ], [
3907         ],[
3908                         AC_MSG_RESULT(yes)
3909                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3910                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3911                         enable_gss=yes
3912                         AC_DEFINE(ENABLE_GSS, 1, [ENABLE_GSS])
3913         ], [
3914                         AC_MSG_RESULT(no)
3915         ])
3917         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3918         AC_TRY_COMPILE([
3919                         #include <gssapi/gssapi_ext.h>
3920         ], [
3921         ],[
3922                         AC_MSG_RESULT(yes)
3923                         enable_gss=yes
3924                         AC_DEFINE(ENABLE_GSS, 1, [ENABLE_GSS])
3925         ], [
3926                         AC_MSG_RESULT(no)
3927         ])
3929         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3930         AC_TRY_COMPILE([
3931                         #include <gssapi/gssapi_ext.h>
3932                         #include <gssapi/gssapi_krb5.h>
3933                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3934         ], [
3935         ],[
3936                         AC_MSG_RESULT(yes)
3937                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3938         ], [
3939                         AC_MSG_RESULT(no)
3940         ])
3942         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3944         AC_CHECK_HEADERS([crt_externs.h])
3946         AC_MSG_CHECKING(for _NSGetEnviron)
3947         AC_TRY_LINK([
3948                 #include <crt_externs.h>
3949         ], [
3950                 char **result = *(_NSGetEnviron());
3951         ],[
3952                 AC_MSG_RESULT(yes)
3953                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3954         ], [
3955                 AC_MSG_RESULT(no)
3956         ])
3958         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3960         if test x$host_sunos = xyes; then
3961                 # set -Werror=strict-prototypes, to match the flags used during the compilation.
3962                 ORIG_CFLAGS="$CFLAGS"
3963                 CFLAGS="$CFLAGS -Werror=strict-prototypes"
3964         fi
3966         AC_CHECK_FUNCS(madvise)
3967         AC_CHECK_FUNCS(posix_madvise)
3969         if test x$host_sunos = xyes; then
3970                 CFLAGS="$ORIG_CFLAGS"
3971         fi
3973         # *** End of Mono.Native checks ***
3974 else
3975         AM_CONDITIONAL(ENABLE_GSS, false)
3977         dnl *********************************
3978         dnl *** Checks for Windows compilation ***
3979         dnl *********************************
3980         AC_CHECK_HEADERS(winternl.h)
3982         jdk_headers_found=no
3983         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3984         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3985         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3986         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3987         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3988         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3989         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3991         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], , [#include <ws2tcpip.h>])
3993         dnl *********************************
3994         dnl *** Check for struct ip_mreqn ***
3995         dnl *********************************
3996         AC_MSG_CHECKING(for struct ip_mreqn)
3997         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3998                 struct ip_mreqn mreq;
3999                 mreq.imr_address.s_addr = 0;
4000         ], [
4001                 # Yes, we have it...
4002                 AC_MSG_RESULT(yes)
4003                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
4004         ], [
4005                 # We'll just have to try and use struct ip_mreq
4006                 AC_MSG_RESULT(no)
4007                 AC_MSG_CHECKING(for struct ip_mreq)
4008                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
4009                         struct ip_mreq mreq;
4010                         mreq.imr_interface.s_addr = 0;
4011                 ], [
4012                         # Yes, we have it...
4013                         AC_MSG_RESULT(yes)
4014                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
4015                 ], [
4016                         # No multicast support
4017                         AC_MSG_RESULT(no)
4018                 ])
4019         ])
4021         dnl **********************************
4022         dnl *** Check for getaddrinfo ***
4023         dnl **********************************
4024         AC_MSG_CHECKING(for getaddrinfo)
4025                 AC_TRY_LINK([
4026                 #include <stdio.h>
4027                 #include <winsock2.h>
4028                 #include <ws2tcpip.h>
4029         ], [
4030                 getaddrinfo(NULL,NULL,NULL,NULL);
4031         ], [
4032                 # Yes, we have it...
4033                 AC_MSG_RESULT(yes)
4034                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
4035         ], [
4036                 AC_MSG_RESULT(no)
4037         ])
4039         dnl **********************************
4040         dnl *** Check for gethostbyname ***
4041         dnl **********************************
4042         AC_MSG_CHECKING(for gethostbyname)
4043                 AC_TRY_LINK([
4044                 #include <stdio.h>
4045                 #include <winsock2.h>
4046                 #include <ws2tcpip.h>
4047         ], [
4048                 gethostbyname(NULL);
4049         ], [
4050                 # Yes, we have it...
4051                 AC_MSG_RESULT(yes)
4052                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
4053         ], [
4054                 AC_MSG_RESULT(no)
4055         ])
4057         dnl **********************************
4058         dnl *** Check for getprotobyname ***
4059         dnl **********************************
4060         AC_MSG_CHECKING(for getprotobyname)
4061                 AC_TRY_LINK([
4062                 #include <stdio.h>
4063                 #include <winsock2.h>
4064                 #include <ws2tcpip.h>
4065         ], [
4066                 getprotobyname(NULL);
4067         ], [
4068                 # Yes, we have it...
4069                 AC_MSG_RESULT(yes)
4070                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
4071         ], [
4072                 AC_MSG_RESULT(no)
4073         ])
4075         dnl **********************************
4076         dnl *** Check for getnameinfo ***
4077         dnl **********************************
4078         AC_MSG_CHECKING(for getnameinfo)
4079                 AC_TRY_LINK([
4080                 #include <stdio.h>
4081                 #include <winsock2.h>
4082                 #include <ws2tcpip.h>
4083         ], [
4084                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
4085         ], [
4086                 # Yes, we have it...
4087                 AC_MSG_RESULT(yes)
4088                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
4089         ], [
4090                 AC_MSG_RESULT(no)
4091         ])
4093         dnl **********************************
4094         dnl *** Check for inet_ntop ***
4095         dnl **********************************
4096         AC_MSG_CHECKING(for inet_ntop)
4097                 AC_TRY_LINK([
4098                 #include <stdio.h>
4099                 #include <winsock2.h>
4100                 #include <ws2tcpip.h>
4101         ], [
4102                 inet_ntop (0, NULL, NULL, 0);
4103         ], [
4104                 # Yes, we have it...
4105                 AC_MSG_RESULT(yes)
4106                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
4107         ], [
4108                 AC_MSG_RESULT(no)
4109         ])
4111         dnl **********************************
4112         dnl *** Check for inet_pton ***
4113         dnl **********************************
4114         AC_MSG_CHECKING(for inet_pton)
4115                 AC_TRY_LINK([
4116                 #include <stdio.h>
4117                 #include <winsock2.h>
4118                 #include <ws2tcpip.h>
4119         ], [
4120                 #ifndef inet_pton
4121                 (void) inet_pton;
4122                 #endif
4123                 inet_pton (0, NULL, NULL);
4124         ], [
4125                 # Yes, we have it...
4126                 AC_MSG_RESULT(yes)
4127                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
4128         ], [
4129                 AC_MSG_RESULT(no)
4130         ])
4133 dnl socklen_t check
4134 AC_MSG_CHECKING(for socklen_t)
4135 AC_TRY_COMPILE([
4136 #include <sys/types.h>
4137 #include <sys/socket.h>
4139   socklen_t foo;
4141 ac_cv_c_socklen_t=yes
4142         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
4143         AC_MSG_RESULT(yes)
4145         AC_MSG_RESULT(no)
4148 AC_CHECK_FUNCS(execvp)
4150 dnl ****************************
4151 dnl *** Look for /dev/random ***
4152 dnl ****************************
4154 AC_MSG_CHECKING([if usage of random device is requested])
4155 AC_ARG_ENABLE(dev-random,
4156 [  --disable-dev-random    disable the use of the random device (enabled by default)],
4157 try_dev_random=$enableval, try_dev_random=yes)
4159 AC_MSG_RESULT($try_dev_random)
4161 case "{$build}" in
4163 dnl IBM i does not have /dev/random, use unblocking only
4165     *-*-os400*)
4166     NAME_DEV_RANDOM="/dev/urandom"
4167     ;;
4169 dnl Win32 does not have /dev/random, they have their own method...
4171     *-mingw*|*-*-cygwin*)
4172     ac_cv_have_dev_random=no
4173     ;;
4175 dnl Everywhere else, it's /dev/random
4177     *)
4178     NAME_DEV_RANDOM="/dev/random"
4179     ;;
4180 esac
4182 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
4184 dnl Now check if the device actually exists
4186 if test "x$try_dev_random" = "xyes"; then
4187     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
4188     [if test -r "$NAME_DEV_RANDOM" ; then
4189         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
4190     if test "x$ac_cv_have_dev_random" = "xyes"; then
4191         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
4192     fi
4193 else
4194     AC_MSG_CHECKING(for random device)
4195     ac_cv_have_dev_random=no
4196     AC_MSG_RESULT(has been disabled)
4199 if test "x$host_win32" = "xyes"; then
4200     AC_DEFINE(HAVE_CRYPT_RNG)
4203 if test "x$ac_cv_have_dev_random" = "xno" \
4204     && test "x$host_win32" = "xno"; then
4205     AC_MSG_WARN([[
4207 *** A system-provided entropy source was not found on this system.
4208 *** Because of this, the System.Security.Cryptography random number generator
4209 *** will throw a NotImplemented exception.
4211 *** If you are seeing this message, and you know your system DOES have an
4212 *** entropy collection in place, please report an issue on GitHub and
4213 *** provide information about the system and how to access the random device.
4215 *** Otherwise you can install either egd or prngd and set the environment
4216 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
4217 ***]])
4220 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)
4222 AC_MSG_CHECKING([if big-arrays are to be enabled])
4223 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)
4224 if test "x$enable_big_arrays" = "xyes" ; then
4225     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
4226         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
4227     else
4228         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
4229     fi
4231 AC_MSG_RESULT($enable_big_arrays)
4233 dnl **************
4234 dnl *** DTRACE ***
4235 dnl **************
4237 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
4239 if test "x$enable_dtrace" = "xyes"; then
4240    if test "x$has_dtrace" = "xno"; then
4241           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
4242    fi
4243    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
4244    if test "x$DTRACE" = "xno"; then
4245           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
4246           enable_dtrace=no
4247    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
4248           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
4249           enable_dtrace=no
4250    fi
4253 dtrace_g=no
4254 if test "x$enable_dtrace" = "xyes"; then
4255         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
4256         DTRACEFLAGS=
4257         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4258                 case "$host" in
4259                         powerpc-*-darwin*)
4260                         DTRACEFLAGS="-arch ppc64"
4261                         ;;
4262                         i*86-*-darwin*)
4263                         DTRACEFLAGS="-arch x86_64"
4264                         ;;
4265                         *)
4266                         DTRACEFLAGS=-64
4267                         ;;
4268                 esac
4269         else
4270                 case "$host" in
4271                         powerpc-*-darwin*)
4272                         DTRACEFLAGS="-arch ppc"
4273                         ;;
4274                         i*86-*-darwin*)
4275                         DTRACEFLAGS="-arch i386"
4276                         ;;
4277                         *)
4278                         DTRACEFLAGS=-32
4279                         ;;
4280                 esac
4281         fi
4282         AC_SUBST(DTRACEFLAGS)
4283         case "$host" in
4284                 *-*-solaris*)
4285                 dtrace_g=yes
4286                 ;;
4287         esac
4288         AC_CHECK_HEADERS([sys/sdt.h])
4290 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
4291 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
4293 dnl **************************
4294 dnl *** AOT cross offsets  ***
4295 dnl **************************
4297 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
4298     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
4300 dnl **************
4301 dnl ***  LLVM  ***
4302 dnl **************
4304 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
4305 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
4306 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)
4307 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
4308 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
4310 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
4312 if test "x$enable_llvm" = "xdefault"; then
4313    enable_llvm=$enable_llvm_default
4316 if test "x$enable_loadedllvm" = "xyes"; then
4317    AC_MSG_WARN("Loadable LLVM is no longer supported. Enabling default LLVM support instead.")
4318    enable_llvm=yes
4321 enable_llvm_msvc_only="no"
4322 if test "x$enable_llvm" = "xyes"; then
4323         if test "x$host_win32" = "xyes"; then
4324                 if test "x$cross_compiling" = "xno"; then
4325                         case "$target" in
4326                         x86_64*)
4327                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
4328                                 enable_llvm_msvc_only="yes"
4329                                 ;;
4330                         i686*)
4331                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
4332                                 ;;
4333                         esac
4334                 fi
4335         fi
4338 internal_llvm="no"
4339 if test "x$enable_llvm" = "xyes"; then
4340         if test "x$with_llvm" != "x"; then
4341                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
4342                 if test x$host_win32 = xyes; then
4343                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
4344                 fi
4345                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
4346                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
4347                 fi
4348         else
4349                 internal_llvm=yes
4350         fi
4352         LLVM_CODEGEN_LIBS="x86codegen"
4353         case "$target" in
4354         arm*)
4355                 LLVM_CODEGEN_LIBS="armcodegen"
4356                 ;;
4357         aarch64*)
4358                 LLVM_CODEGEN_LIBS="aarch64codegen"
4359                 ;;
4360         powerpc*)
4361                 LLVM_CODEGEN_LIBS="powerpccodegen"
4362                 ;;
4363         esac
4364         if test "x$host" != "x$target"; then
4365                 # No need for jit libs
4366                 LLVM_CODEGEN_LIBS=
4367         fi
4369         AC_SUBST(LLVM_CODEGEN_LIBS)
4370         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4372         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4373                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4374                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4375         fi
4376         if test "x$enable_llvm_msvc_only" != "xyes"; then
4377                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4378         else
4379                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4380         fi
4381 fi # ENABLE_LLVM
4383 # AC_DEFINE necessary for correct restore behavior on Linux
4384 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4385 if test "x$internal_llvm" != "xno"; then
4386         if test "x$enable_llvm_msvc_only" != "xyes"; then
4387                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4388         else
4389                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4390         fi
4393 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4394 if test "x$enable_llvm_asserts" != "xno"; then
4395         if test "x$enable_llvm_msvc_only" != "xyes"; then
4396                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4397         else
4398                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4399         fi
4402 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4404 if test "x$enable_llvm" = "xyes"; then
4405         enable_llvm_runtime=yes
4408 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4409 if test "x$enable_llvm_runtime" = "xyes"; then
4410         if test "x$enable_llvm_msvc_only" != "xyes"; then
4411                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4412         else
4413                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4414         fi
4417 TARGET="unknown"
4418 ACCESS_UNALIGNED="yes"
4420 LIBC="libc.so.6"
4421 INTL="libc.so.6"
4422 SQLITE="libsqlite.so.0"
4423 SQLITE3="libsqlite3.so.0"
4424 ODBC="libodbc.so.2"
4425 X11="libX11.so"
4426 GDKX11="libgdk-x11-2.0.so.0"
4427 GTKX11="libgtk-x11-2.0.so.0"
4428 XINERAMA="libXinerama.so.1"
4430 sizeof_register="SIZEOF_VOID_P"
4432 jit_wanted=true
4433 boehm_supported=true
4434 BTLS_SUPPORTED=no
4435 BTLS_PLATFORM=
4436 INTERP_CFLAGS=""
4438 case "$host" in
4439         wasm32*)
4440                 TARGET=WASM
4441                 arch_target=wasm
4442                 BTLS_SUPPORTED=no
4443                 ACCESS_UNALIGNED="no"
4444                 with_tls=pthread
4445                 target_wasm=yes
4446                 if test "x$mono_cv_clang" = "xyes"; then
4447                    INTERP_CFLAGS="-mllvm -join-liveintervals=false"
4448                    AC_SUBST(INTERP_CFLAGS)
4449                 fi
4450                 ;;
4451         mips*)
4452                 TARGET=MIPS;
4453                 arch_target=mips;
4454                 with_tls=pthread;
4455                 ACCESS_UNALIGNED="no"
4457                 AC_MSG_CHECKING(for mips n32)
4458                 AC_TRY_COMPILE([],[
4459                 #if _MIPS_SIM != _ABIN32
4460                 #error Not mips n32
4461                 #endif
4462                 ],[
4463                 AC_MSG_RESULT(yes)
4464                 sizeof_register=8
4465                 ],[
4466                 AC_MSG_RESULT(no)
4467                 ])
4468                 ;;
4469         i*86-*-*)
4470                 TARGET=X86;
4471                 arch_target=x86;
4472                 case $host_os in
4473                   solaris*)
4474                         LIBC="libc.so"
4475                         INTL="libintl.so"
4476                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4477                                 TARGET=AMD64
4478                                 arch_target=amd64
4479                         fi
4481                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4482                         # int astruct __attribute__ ((visibility ("hidden")));
4483                         # void foo ()
4484                         # {
4485                         #       void *p = &astruct;
4486                         # }
4487                         # gcc -fPIC --shared -o libfoo.so foo.c
4488                         # yields:
4489                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4490                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4491                         have_visibility_hidden=no
4492                         ;;
4493                   mingw*|cygwin*)
4494                         have_visibility_hidden=no
4495                         BTLS_SUPPORTED=no
4496                         BTLS_PLATFORM=i386
4497                         ;;
4498                   haiku*)
4499                         LIBC=libroot.so
4500                         ;;
4501                   linux*)
4502                         AOT_SUPPORTED="yes"
4503                         BTLS_SUPPORTED=yes
4504                         BTLS_PLATFORM=i386
4505                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4506                         ;;
4507                   darwin*)
4508                         AOT_SUPPORTED="yes"
4509                         BTLS_SUPPORTED=yes
4510                         BTLS_PLATFORM=i386
4511                         ;;
4512                   openbsd*|freebsd*|kfreebsd-gnu*)
4513                         AOT_SUPPORTED="yes"
4514                         BTLS_SUPPORTED=yes
4515                         BTLS_PLATFORM=i386
4516                         ;;
4517                 esac
4518                 ;;
4519         x86_64-*-* | amd64-*-*)
4520                 TARGET=AMD64;
4521                 arch_target=amd64;
4522                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4523                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4524                         sizeof_register=8
4525                 fi
4526                 case $host_os in
4527                   linux*)
4528                         AOT_SUPPORTED="yes"
4529                         BTLS_SUPPORTED=yes
4530                         BTLS_PLATFORM=x86_64
4531                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4532                         ;;
4533                   darwin*)
4534                         AOT_SUPPORTED="yes"
4535                         BTLS_SUPPORTED=yes
4536                         BTLS_PLATFORM=x86_64
4537                         boehm_supported=false
4538                         ;;
4539                   openbsd*|freebsd*|kfreebsd-gnu*)
4540                         AOT_SUPPORTED="yes"
4541                         BTLS_SUPPORTED=yes
4542                         BTLS_PLATFORM=x86_64
4543                         ;;
4544                   mingw*|cygwin*)
4545                         BTLS_SUPPORTED=no
4546                         BTLS_PLATFORM=x86_64
4547                         ;;
4548                 esac
4549                 ;;
4550         sparc*-*-*)
4551                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4552                    TARGET=SPARC64
4553                 else
4554                         TARGET=SPARC
4555                 fi
4556                 arch_target=sparc;
4557                 ACCESS_UNALIGNED="no"
4558                 case $host_os in
4559                   linux*) ;;
4560                   *)
4561                         LIBC="libc.so"
4562                         INTL="libintl.so"
4563                 esac
4564                 if test x"$GCC" = xyes; then
4565                         # We don't support v8 cpus
4566                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4567                 fi
4568                 if test x"$AR" = xfalse; then
4569                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4570                 fi
4571                 ;;
4572         *-mingw*|*-*-cygwin*)
4573                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4574                 have_visibility_hidden=no
4575                 INTL="intl"
4576                 case "$host" in
4577                         x86_64*mingw*)
4578                                 # Old Boehm fails to compile for x86_64-mingw.
4579                                 # It is trivial to fix, but just silently drop it.
4580                                 boehm_supported=false
4581                                 ;;
4582                 esac
4583                 ;;
4584         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4585         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4586         powerpc*-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4587                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4588                         TARGET=POWERPC64;
4589                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4590                         # mono#18554 - be more robust in testing for -mminimal-toc
4591                         AC_MSG_NOTICE([Checking for PowerPC ISA -mminimal-toc support])
4592                         AX_CHECK_COMPILE_FLAG(
4593                                 [-mminimal-toc],
4594                                 [CFLAGS="$CFLAGS -mminimal-toc"],
4595                                 [CFLAGS="$CFLAGS"]
4596                         )
4597                         case "$host" in
4598                                 powerpc*-*-freebsd*)
4599                                         # We need to be aware if we are ELFv1 or v2 here
4600                                         AC_MSG_NOTICE([Checking FreeBSD ELF version])
4601                                         if ! ( echo | cc -dM -E - | awk '/_CALL_ELF/ {print $NF}'); then
4602                                                 AC_DEFINE([POWERPC_ELF], 1, [PowerPC ELFv1])
4603                                         else
4604                                                 AC_DEFINE([POWERPC_ELFV2], 1, [PowerPC ELFv2])
4605                                         fi
4606                                         ;;
4607                         esac
4608                 else
4609                         TARGET=POWERPC;
4610                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4611                 fi
4612                 arch_target=ppc;
4613                 case $host_os in
4614                   aix*|os400*)
4615                         BTLS_SUPPORTED=yes
4616                         BTLS_PLATFORM=powerpc
4617                         ;;
4618                   linux*)
4619                         BTLS_SUPPORTED=yes
4620                         BTLS_PLATFORM=powerpc
4621                         ;;
4622                   freebsd*)
4623                         BTLS_SUPPORTED=yes
4624                         BTLS_PLATFORM=powerpc
4625                         ;;
4626                 esac
4627                 ;;
4628         armv7k-*-darwin*)
4629                 TARGET=ARM;
4630                 TARGET_SYS=WATCHOS
4631                 arch_target=arm;
4632                 arm_fpu=VFP_HARD
4633                 ACCESS_UNALIGNED="no"
4634                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4635                 ;;
4637         arm*-darwin*)
4638                 TARGET=ARM;
4639                 arch_target=arm;
4640                 ACCESS_UNALIGNED="no"
4641                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4642                 ;;
4643         arm*-linux*)
4644                 TARGET=ARM;
4645                 arch_target=arm;
4646                 ACCESS_UNALIGNED="no"
4647                 AOT_SUPPORTED="yes"
4648                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4649                 BTLS_SUPPORTED=yes
4650                 BTLS_PLATFORM=arm
4651                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4652                 case "$target" in
4653                 arm*-linux*-gnueabi)
4654                         BTLS_PLATFORM=armsoft
4655                         ;;
4656                 esac
4657                 ;;
4658         arm*-netbsd*-eabi*)
4659                 TARGET=ARM;
4660                 arch_target=arm;
4661                 ACCESS_UNALIGNED="no"
4662                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4663                 ;;
4664         aarch64-*darwin*ilp32)
4665                 TARGET=ARM6432
4666                 arch_target=arm64
4667                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4668                 sizeof_register=8
4669                 # assuming no other target other than watchOS is using aarch64*darwin triple
4670                 TARGET_SYS=WATCHOS
4671                 ;;
4672         aarch64-*)
4673                 # https://lkml.org/lkml/2012/7/15/133
4674                 TARGET=ARM64
4675                 arch_target=arm64
4676                 boehm_supported=false
4677                 AOT_SUPPORTED="yes"
4678                 BTLS_SUPPORTED=yes
4679                 BTLS_PLATFORM=aarch64
4680                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4681                 ;;
4682         s390x-*-linux*)
4683                 TARGET=S390X;
4684                 arch_target=s390x;
4685                 ACCESS_UNALIGNED="yes"
4686                 BTLS_SUPPORTED=yes
4687                 BTLS_PLATFORM=s390x
4688                 CFLAGS="$CFLAGS -mbackchain"
4689                 ;;
4690         riscv32-*)
4691                 TARGET=RISCV32
4692                 ACCESS_UNALIGNED=no
4693                 AOT_SUPPORTED=no
4694                 BTLS_SUPPORTED=yes
4695                 BTLS_PLATFORM=riscv32
4696                 arch_target=riscv32
4697                 boehm_supported=false
4698                 ;;
4699         riscv64*)
4700                 TARGET=RISCV64
4701                 ACCESS_UNALIGNED=no
4702                 AOT_SUPPORTED=no
4703                 BTLS_SUPPORTED=yes
4704                 BTLS_PLATFORM=riscv64
4705                 arch_target=riscv64
4706                 boehm_supported=false
4707                 ;;
4708 esac
4710 HOST=$TARGET
4712 if test "x$host" != "x$target"; then
4713    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4714    enable_mcs_build=no
4715    enable_support_build=no
4716    BTLS_SUPPORTED=no
4717    # Can't use tls, since it depends on the runtime detection of tls offsets
4718    # in mono-compiler.h
4719    with_tls=pthread
4720    target_mach=no
4721    case "$target" in
4722    wasm32*)
4723                 TARGET=WASM
4724                 arch_target=wasm
4725                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4726                 ;;
4727    arm*-darwin*)
4728                 TARGET=ARM;
4729                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4730                 case "$target" in
4731                 armv7k-*)
4732                         arm_fpu=VFP_HARD
4733                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4734                         ;;
4735                 esac            
4736                 ;;
4737    powerpc64-ps3-linux-gnu)
4738                 TARGET=POWERPC64
4739                 arch_target=powerpc64
4740                 AC_DEFINE(TARGET_PS3, 1, [...])
4741                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4742                 # uses this define
4743                 AC_DEFINE(__mono_ppc64__, 1, [...])
4744                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4745                 sizeof_register=8
4746                 target_byte_order=G_BIG_ENDIAN
4747                 ;;
4748    powerpc64-xbox360-linux-gnu)
4749                 TARGET=POWERPC64
4750                 arch_target=powerpc64
4751                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4752                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4753                 # uses this define
4754                 sizeof_register=8
4755                 target_byte_order=G_BIG_ENDIAN
4756                 ;;
4757    arm*-linux-*)
4758                 TARGET=ARM;
4759                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4760                 ;;
4761    arm*-netbsd*-eabi*)
4762                 TARGET=ARM;
4763                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4764                 ;;
4765    i686*-linux-*)
4766                 TARGET=X86;
4767                 ;;
4768    i*86-apple-*)
4769                 TARGET=X86;
4770                 ;;
4771    x86_64*-linux-*)
4772                 TARGET=AMD64;
4773                 ;;
4774    x86_64-ps4-freebsd)
4775                 TARGET=AMD64;
4776                 AC_DEFINE(TARGET_PS4, 1, [...])
4777                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4778                 CPPFLAGS="$CPPFLAGS"
4779                 target_win32=no
4780                 ;;
4781         aarch64*darwin*_ilp32)
4782                 TARGET=ARM6432;
4783                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4784                 sizeof_register=8
4785                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4786                 ;;
4787         aarch64*darwin*)
4788                 TARGET=ARM64
4789                 # Both ios and osx/arm64 have the same aarc64-darwin triple,
4790                 # assume ios for now when cross compiling
4791                 TARGET_SYS=IOS
4792                 ;;
4793         aarch64-*)
4794                 TARGET=ARM64
4795                 ;;
4796         riscv32*)
4797                 TARGET=RISCV32
4798                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4799                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4800                 arch_target=riscv32
4801                 target_mach=no
4802                 with_tls=pthread
4803                 ;;
4804         riscv64*)
4805                 TARGET=RISCV64
4806                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4807                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4808                 arch_target=riscv64
4809                 target_mach=no
4810                 with_tls=pthread
4811                 ;;
4812         x86_64-google-fuchsia)
4813                 TARGET=AMD64
4814                 target_win32=nop
4815                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
4816                 ;;
4817         *)
4818                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4819         esac
4821         case "$target" in
4822         *-darwin*)
4823                 target_mach=yes
4824                 ;;
4825         *-linux-android*)
4826                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4827                 ;;
4828         esac
4831 case "$TARGET" in
4832 WASM)
4833         AC_DEFINE(TARGET_WASM, 1, [...])
4834         arch_target=wasm
4835         ;;
4836 X86)
4837         AC_DEFINE(TARGET_X86, 1, [...])
4838         arch_target=x86
4839         ;;
4840 AMD64)
4841         AC_DEFINE(TARGET_AMD64, 1, [...])
4842         arch_target=amd64
4843         ;;
4844 ARM)
4845         AC_DEFINE(TARGET_ARM, 1, [...])
4846         arch_target=arm
4847         ACCESS_UNALIGNED="no"
4848         ;;
4849 ARM64|ARM6432)
4850         AC_DEFINE(TARGET_ARM64, 1, [...])
4851         arch_target=arm64
4852         ;;
4853 POWERPC)
4854         AC_DEFINE(TARGET_POWERPC, 1, [...])
4855         ;;
4856 POWERPC64)
4857         AC_DEFINE(TARGET_POWERPC, 1, [...])
4858         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4859         ;;
4860 S390X)
4861         AC_DEFINE(TARGET_S390X, 1, [...])
4862         ;;
4863 MIPS)
4864         AC_DEFINE(TARGET_MIPS, 1, [...])
4865         ;;
4866 SPARC)
4867         AC_DEFINE(TARGET_SPARC, 1, [...])
4868         ;;
4869 SPARC64)
4870         AC_DEFINE(TARGET_SPARC64, 1, [...])
4871         ;;
4872 RISCV32)
4873         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4874         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4875         ;;
4876 RISCV64)
4877         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4878         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4879         ;;
4880 esac
4882 case "$TARGET" in
4883 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4884     target_sizeof_void_p=4
4885     ;;
4886 *64* | S390X)
4887     target_sizeof_void_p=8
4888     ;;
4890     AC_MSG_ERROR([unknown target])
4891     ;;
4892 esac
4894 case "$HOST" in
4895 WASM)
4896         AC_DEFINE(HOST_WASM, 1, [...])
4897         ;;
4898 X86)
4899         AC_DEFINE(HOST_X86, 1, [...])
4900         ;;
4901 AMD64)
4902         AC_DEFINE(HOST_AMD64, 1, [...])
4903         ;;
4904 ARM)
4905         AC_DEFINE(HOST_ARM, 1, [...])
4906         ;;
4907 ARM64)
4908         AC_DEFINE(HOST_ARM64, 1, [...])
4909         ;;
4910 POWERPC)
4911         AC_DEFINE(HOST_POWERPC, 1, [...])
4912         ;;
4913 POWERPC64)
4914         AC_DEFINE(HOST_POWERPC, 1, [...])
4915         AC_DEFINE(HOST_POWERPC64, 1, [...])
4916         ;;
4917 S390X)
4918         AC_DEFINE(HOST_S390X, 1, [...])
4919         ;;
4920 MIPS)
4921         AC_DEFINE(HOST_MIPS, 1, [...])
4922         ;;
4923 SPARC)
4924         AC_DEFINE(HOST_SPARC, 1, [...])
4925         ;;
4926 SPARC64)
4927         AC_DEFINE(HOST_SPARC64, 1, [...])
4928         ;;
4929 RISCV32)
4930         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4931         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4932         ;;
4933 RISCV64)
4934         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4935         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4936         ;;
4937 esac
4939 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4940 case "$HOST" in
4941 X86 | AMD64 | ARM | ARM64)
4942         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4943         ;;
4944 esac
4946 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4947 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4949 dnl *************
4950 dnl *** VTUNE ***
4951 dnl *************
4953 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4954 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4956 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4958 if test "x$enable_vtune" = "xyes"; then
4959         if test "x$with_vtune" = "x"; then
4960                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4961         else
4962                 VTUNE_PATH=$with_vtune
4963         fi
4964         VTUNE_INCLUDE=$VTUNE_PATH/include
4965         case "$TARGET" in
4966         X86)
4967                 VTUNE_LIB=$VTUNE_PATH/lib32
4968                 ;;
4969         AMD64)
4970                 VTUNE_LIB=$VTUNE_PATH/lib64
4971                 ;;
4972         *)
4973                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4974                 ;;
4975         esac
4976         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4977                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4978         fi
4979         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4980                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4981         fi
4983         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4984         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4986         AC_SUBST(VTUNE_LIBS)
4987         AC_SUBST(VTUNE_CFLAGS)
4989 dnl Use GCC atomic ops if they work on the target.
4990 if test x$GCC = "xyes"; then
4991         case $TARGET in
4992         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4993                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4994                 ;;
4995         esac
4998 if test "x$target_mach" = "xyes"; then
5000    if test "x$TARGET_SYS" = "xWATCHOS"; then
5001           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
5002           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
5003           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
5004           BTLS_SUPPORTED=no
5005    elif test "x$TARGET_SYS" = "xIOS" -o "x$TARGET" = "xARM" -o "x$TARGET" = "xARM6432"; then
5006           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
5007           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
5008           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
5009           BTLS_SUPPORTED=no
5010           target_ios=yes
5011    else
5012        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
5013        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
5014        #error fail this for ios
5015        #endif
5016        ], [
5017                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
5018           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
5019           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
5020           target_osx=yes
5021           if test "x$TARGET" = "xARM64"; then
5022              BTLS_SUPPORTED=no
5023           fi
5024        ], [
5025           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
5026           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
5027           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
5028           BTLS_SUPPORTED=no
5029                   target_ios=yes
5030        ])
5031         fi
5032    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
5035 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
5037 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
5039 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
5040    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
5041 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
5042    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
5043 else
5044    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
5047 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
5049 if test "x$sizeof_register" = "x4"; then
5050   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
5051 elif test "x$sizeof_register" = "x8"; then
5052   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
5053 else
5054   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
5057 # zlib/configure detects visibility support similarly and defines HAVE_HIDDEN
5058 # on the compiler command line (not config.h).
5059 if test "x$have_visibility_hidden" = "xyes"; then
5060    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
5061    ZLIB_CFLAGS="$ZLIB_CFLAGS -DHAVE_HIDDEN"
5064 if test "x$have_deprecated" = "xyes"; then
5065    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
5068 dnl 
5069 dnl Simple Generational checks (sgen)
5071 SGEN_DEFINES=
5072 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
5073 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
5074 if test x$buildsgen = xyes; then
5075    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
5076    SGEN_DEFINES="-DHAVE_SGEN_GC"
5078         conc_gc_msg=""
5079    if test x$with_sgen_default_concurrent != xno; then
5080        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
5081            conc_gc_msg=" (concurrent by default)"
5082    fi
5084    if test "x$gc_msg" = "x"; then
5085       gc_msg="sgen$conc_gc_msg"
5086    else
5087       gc_msg="sgen$conc_gc_msg and $gc_msg"
5088    fi
5090 AC_SUBST(SGEN_DEFINES)
5091 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
5093 jit_status="Building and using the JIT"
5095 libsuffix=".so"
5097 case "$host" in
5098      *-*-aix*)
5099         dnl on AIX/PASE, shared libraries can be and usually are inside archives
5100         dnl so, we specify them by libfoo.a(libfoo.so.0) for libtool's conventions,
5101         dnl or libfoo.a(shr[_64].o) for the AIX system convention,
5102         dnl or lib.so[.0](shr[_64].o) for libtool's hybrid convention
5103         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX
5104         LIBC="libc.a(shr_64.o)"
5105         # Thanks, I hate it! This is crumbly, especially the one-liner.
5106         AC_MSG_CHECKING([how to dlopen libintl])
5107         AC_LINK_IFELSE([AC_LANG_SOURCE([
5108                 /* XXX: Check for libintl header/gettext func better? */
5109                 #include <libintl.h>
5111                 int main (void) {
5112                         gettext("Dummy for autoconf");
5113                         return 1;
5114                 }
5115         ])],
5116         [
5117         INTL="$(dump -X64 -Hp conftest$EXEEXT | grep libintl | cut -c 38- | tr -s " " | awk '{print $1"("$2")"}')"
5118         AC_MSG_RESULT([yes, $INTL])
5119         ],
5120         [
5121         INTL="libintl.a(libintl.so.8)"
5122         AC_MSG_RESULT([no, falling back to $INTL])
5123         ])
5124         SQLITE3="libsqlite3.a(libsqlite3.so.0)"
5125         # it's very tempting to set a libsuffix, but it depends on the soname value
5126         ;;
5127      *-*-os400*)
5128         dnl However, IBM's packages for i try to be more "normal" than the AIX world, naming wise.
5129         dnl The library archives has "normal" .so names, but they're members with predictable "shr" names for fat libraries.
5130         LIBC="libc.a(shr_64.o)"
5131         INTL="libintl.so(shr_64.o)"
5132         SQLITE3="libsqlite3.so(shr_64.o)"
5133         # 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
5134         # it may be worth revisiting this in the future
5135         ;;
5136      *-*-darwin*)
5137         libsuffix=".dylib"
5138         LIBC="libc.dylib"
5139         INTL="libintl.dylib"
5140         SQLITE="libsqlite.0.dylib"
5141         SQLITE3="libsqlite3.0.dylib"
5142         X11="libX11.dylib"
5143         GDKX11="libgdk-x11-2.0.dylib"
5144         GTKX11="libgtk-x11-2.0.dylib"
5145         ;;
5146      *-*-*netbsd*)
5147         LIBC="libc.so"
5148         INTL="libintl.so"
5149         SQLITE="libsqlite.so"
5150         SQLITE3="libsqlite3.so"
5151         ;;
5152      *-*-kfreebsd*-gnu)
5153         LIBC="libc.so.0.1"
5154         INTL="libc.so.0.1"
5155         X11="libX11.so.6"
5156         ;;
5157     *-*-*freebsd*)
5158         LIBC="libc.so.7"
5159         INTL="libintl.so"
5160         SQLITE="libsqlite.so"
5161         SQLITE3="libsqlite3.so"
5162         ;;
5163     *-*-*openbsd*)
5164         LIBC="libc.so"
5165         INTL="libintl.so"
5166         SQLITE="libsqlite.so"
5167         SQLITE3="libsqlite3.so"
5168         ;;
5169     *-*-*linux*)
5170         if test "x$with_core" != "xonly"; then
5171                 AC_PATH_X
5172                 dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
5173                 AC_MSG_CHECKING(for the soname of libX11.so)
5174                 for i in $x_libraries $dlsearch_path; do
5175                         for r in 4 5 6; do
5176                                 if test -f $i/libX11.so.$r; then
5177                                         X11=libX11.so.$r
5178                                         AC_MSG_RESULT($X11)
5179                                 fi
5180                         done
5181                 done
5182                 
5183                 if test "x$X11" = "xlibX11.so"; then
5184                         AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
5185                         X11=libX11.so.6
5186                 fi
5187         fi
5188         ;;
5189 esac
5191 AC_SUBST(libsuffix)
5193 ######################################
5194 # EGLIB CHECKS
5195 ######################################
5197 GNUC_PRETTY=
5198 GNUC_UNUSED=
5199 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
5200 if test x$GCC = xyes; then
5201    GNUC_UNUSED='__attribute__((__unused__))'
5202    GNUC_NORETURN='__attribute__((__noreturn__))'
5203    case $host_cpu in
5204      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
5205    esac
5207 AC_SUBST(GNUC_PRETTY)
5208 AC_SUBST(GNUC_UNUSED)
5209 AC_SUBST(GNUC_NORETURN)
5210 AC_SUBST(BREAKPOINT)
5212 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
5214 case $host in
5215 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
5216     PATHSEP='\\'
5217     SEARCHSEP=';'
5218     OS="WIN32"
5219     PIDTYPE='void *'
5220     ;;
5222     PATHSEP='/'
5223     SEARCHSEP=':'
5224     OS="UNIX"
5225     PIDTYPE='int'
5226     ;;
5227 esac
5229 case $host in
5230         *-*-solaris*)
5231         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
5232         ;;
5233 esac
5235 case $target in
5236 arm*-darwin*|aarch64*-*|riscv*)
5237     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
5238     ;;
5239 i*86-*-darwin*)
5240     ORDER=G_LITTLE_ENDIAN
5241     ;;
5242 *-*-haiku*)
5243     LDFLAGS="$LDFLAGS -ltextencoding"
5244     ;;
5245 *-*-openbsd*)
5246     CFLAGS="$CFLAGS -pthread"
5247     LDFLAGS="$LDFLAGS -pthread"
5248     ;;
5249 esac
5251 AC_SUBST(ORDER)
5252 AC_SUBST(PATHSEP)
5253 AC_SUBST(SEARCHSEP)
5254 AC_SUBST(OS)
5255 AC_SUBST(PIDTYPE)
5257 # Defined for all targets/platforms using classic Windows API support.
5258 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
5259 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
5261 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
5262 AC_CHECK_FUNCS(getrlimit)
5263 AC_CHECK_FUNCS(fork execv execve)
5264 AC_CHECK_FUNCS(waitpid)
5266 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
5268 if test x$with_overridable_allocators = xyes; then
5269         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5270   AC_MSG_NOTICE([Overridable allocator support enabled])
5271 else
5272   AC_MSG_NOTICE([Overridable allocator support disabled])
5276 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
5277 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
5278 # removed once support for 10.6 is dropped.
5280 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
5282 if test x$target_osx = xyes; then
5283 AC_CHECK_FUNCS(getpwuid_r)
5284 elif test x$target_ios = xno; then
5285 AC_CHECK_FUNCS(strndup getpwuid_r)
5288 AC_SEARCH_LIBS(sqrtf, m)
5290 # nanosleep may not be part of libc, also search it in other libraries
5291 AC_SEARCH_LIBS(nanosleep, rt)
5293 AC_SEARCH_LIBS(dlopen, dl)
5295 # AIX/OS400 -bsymbolic
5296 # Apple -bind_at_load
5297 # The rest GNU.
5299 export_link_flags=--export-dynamic
5300 case $host_os in
5301 mingw*|cygwin*)
5302         export_link_flags=--export-all-symbols
5303         ;;
5304 *-*-darwin*)
5305         export_link_flags=--export_dynamic
5306         ;;
5307 esac
5308 AX_APPEND_LINK_FLAGS([-Wl,$export_link_flags -Wl,-Bsymbolic -bsymbolic -Wl,-z,now -Wl,-bind_at_load])
5310 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
5311 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
5312 AC_CHECK_LIB(iconv, iconv_open)
5313 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
5314 AC_SUBST(HAVE_ALLOCA_H)
5316 # Get the exact type of size_t, not just its size.
5317 # This is so we can find an exact printf format among u, lu, llu, I64u.
5318 # To avoid warnings about slight mismatches.
5319 # C99 runtime "zu" dependency is being avoided here.
5321 # We have to compile as C++ because C is too lenient
5322 # and lets the wrong thing compile, with warnings.
5324 # Note: "zu" or ifdef <something> have the advantage
5325 # of producing installable "biarch" headers. i.e. one Mac header
5326 # for Mac/x86 and Mac/amd64.
5328 AC_LANG_PUSH(C++)
5330 # Check long before int because it is the overwhelming Unix answer,
5331 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
5333 # long ahead of int also tends to produce biarch-compatible headers except Windows.
5335 AC_MSG_CHECKING(if size_t is unsigned long)
5336 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5337         #include <stddef.h>
5338         unsigned long *a = (size_t*)0;
5339 ])], [
5340         AC_MSG_RESULT(yes)
5341         AC_SUBST(GSIZE_FORMAT, '"lu"')
5342 ], [
5343         AC_MSG_RESULT(no)
5344         AC_MSG_CHECKING(if size_t is unsigned int)
5345         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5346                 #include <stddef.h>
5347                 unsigned *a = (size_t*)0;
5348         ])], [
5349                 AC_MSG_RESULT(yes)
5350                 AC_SUBST(GSIZE_FORMAT, '"u"')
5351         ], [
5352 # At this point the majority of systems have their answer,
5353 # and we descend into non-standard or new-standard territory.
5355 # Check __int64 first because I64 on some systems predates ll, enabling
5356 # new compiler/old runtime interop, and the types always have the same size.
5357                 AC_MSG_RESULT(no)
5358                 AC_MSG_CHECKING(if size_t is unsigned __int64)
5359                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5360                         #include <stddef.h>
5361                         unsigned __int64 *a = (size_t*)0;
5362                 ])], [
5363                         AC_MSG_RESULT(yes)
5364                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
5365                 ], [
5366                         AC_MSG_RESULT(no)
5367                         AC_MSG_CHECKING(if size_t is unsigned long long)
5368                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5369                                 #include <stddef.h>
5370                                 unsigned long long *a = (size_t*)0;
5371                         ])], [
5372                                 AC_MSG_RESULT(yes)
5373                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
5374                         ], [
5375                                 AC_MSG_RESULT(no)
5376                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
5377                         ] )
5378                 ] )
5379         ] )
5380 ] )
5382 AC_LANG_POP
5384 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
5385 # This provides for an exact match with functions that
5386 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
5387 # uintptr_t is not necessarily the same.
5389 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
5390 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
5392 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
5393    GSIZE="size_t"
5394    GSSIZE="ptrdiff_t"
5395 else
5396    GSIZE="uintptr_t"
5397    GSSIZE="intptr_t"
5400 AC_SUBST(GSIZE)
5401 AC_SUBST(GSSIZE)
5402 AC_SUBST(GSIZE_FORMAT)
5405 # END OF EGLIB CHECKS
5408 AC_ARG_WITH([libgdiplus],
5409         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
5410         [], [with_libgdiplus=installed])
5412 # default install location
5413 libgdiplus_install_loc=libgdiplus${libsuffix}
5414 case "$host" in
5415     *-*-*linux*)
5416     libgdiplus_install_loc=libgdiplus${libsuffix}.0
5417     ;;
5418 esac
5420 case $with_libgdiplus in
5421     no)
5422     libgdiplus_loc=
5423     ;;
5425     installed)
5426     libgdiplus_loc=
5427     if test x$cross_compiling = xno; then
5428         if test x$host_darwin = xyes; then
5429             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
5430             if test -x $a; then
5431               libgdiplus_install_loc=$a
5432               libgdiplus_loc=$a
5433             fi
5434         fi
5435     fi
5436     ;;
5438     yes|sibling)
5439     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5440     ;;
5442     /*) # absolute path, assume it is an install location
5443     libgdiplus_loc=$with_libgdiplus
5444     libgdiplus_install_loc=$with_libgdiplus
5445     ;;
5447     *)
5448     libgdiplus_loc=`pwd`/$with_libgdiplus
5449     ;;
5450 esac
5451 AC_SUBST(libgdiplus_loc)
5452 AC_SUBST(libgdiplus_install_loc)
5454 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)
5455 if test "x$icall_symbol_map" = "xyes"; then
5456    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5459 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5460 if test "x$icall_export" = "xyes"; then
5461    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5464 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5465 if test "x$icall_tables" = "xno"; then
5466    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5469 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5471 if test "x$with_tls" = "x__thread"; then
5472         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5473         # Pass the information to libgc
5474         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5475         AC_MSG_CHECKING(if the tls_model attribute is supported)
5476         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5477                 ], [
5478                         AC_MSG_RESULT(yes)
5479                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5480                 ], [
5481                         AC_MSG_RESULT(no)
5482         ])
5485 if test ${TARGET} = ARM; then
5486         dnl ******************************************
5487         dnl *** Check to see what FPU is available ***
5488         dnl ******************************************
5489         AC_MSG_CHECKING(which FPU to use)
5491         #
5492         # This is a bit tricky:
5493         #
5494         # if (__ARM_PCS_VFP) {
5495         #       /* mfloat-abi=hard == VFP with hard ABI */
5496         # } elif (!__SOFTFP__) {
5497         #       /* mfloat-abi=softfp == VFP with soft ABI */
5498         # } else {
5499         #       /* mfloat-abi=soft == no VFP */
5500         # }
5501         #
5502         # The exception is iOS (w/ GCC) where none of the above
5503         # are defined (but iOS always uses the 'softfp' ABI).
5504         #
5505         # No support for FPA.
5506         #
5508         fpu=NONE
5510         # iOS GCC always uses the 'softfp' ABI.
5511         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5512                 fpu=VFP
5513         fi
5515         # Are we using the 'hard' ABI?
5516         if test x$fpu = xNONE; then
5517                 AC_TRY_COMPILE([], [
5518                         #ifndef __ARM_PCS_VFP
5519                         #error "Float ABI is not 'hard'"
5520                         #endif
5521                 ], [
5522                         fpu=VFP_HARD
5523                 ], [
5524                         fpu=NONE
5525                 ])
5526         fi
5528         # No 'hard' ABI. 'soft' or 'softfp'?
5529         if test x$fpu = xNONE; then
5530                 AC_TRY_COMPILE([], [
5531                         #ifdef __SOFTFP__
5532                         #error "Float ABI is not 'softfp'"
5533                         #endif
5534                 ], [
5535                         fpu=VFP
5536                 ], [
5537                         fpu=NONE
5538                 ])
5539         fi
5541         if test x$arm_fpu != x; then
5542            fpu=$arm_fpu
5543         fi
5545         AC_MSG_RESULT($fpu)
5546         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5547         unset fpu
5549         dnl *********************************************
5550         dnl *** Check which ARM version(s) we can use ***
5551         dnl *********************************************
5552         AC_MSG_CHECKING(which ARM version to use)
5554         AC_TRY_COMPILE([], [
5555                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5556                 #error Not on ARM v5.
5557                 #endif
5558         ], [
5559                 arm_v5=yes
5561                 arm_ver=ARMv5
5562         ], [])
5564         AC_TRY_COMPILE([], [
5565                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5566                 #error Not on ARM v6.
5567                 #endif
5568         ], [
5569                 arm_v5=yes
5570                 arm_v6=yes
5572                 arm_ver=ARMv6
5573         ], [])
5575         AC_TRY_COMPILE([], [
5576                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5577                 #error Not on ARM v7.
5578                 #endif
5579         ], [
5580                 arm_v5=yes
5581                 arm_v6=yes
5582                 arm_v7=yes
5584                 arm_ver=ARMv7
5585         ], [])
5587         AC_MSG_RESULT($arm_ver)
5589         if test x$arm_v5 = xyes; then
5590                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5591                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5592         fi
5594         if test x$arm_v6 = xyes; then
5595                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5596                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5597         fi
5599         if test x$arm_v7 = xyes; then
5600                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5601                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5602         fi
5604         if test x$host_linux = xyes; then
5605                 RID="linux-arm"
5606                 COREARCH="arm"
5607                 if test x$fpu = xNONE; then
5608                         RID="linux-armel"
5609                         COREARCH="armel"
5610                 fi
5611         fi
5614 AC_SUBST(RID)
5615 AC_SUBST(COREARCH)
5616 AC_SUBST(CORETARGETS)
5618 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5619         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5621         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5623         if test x$fpabi = xauto; then
5624                 AC_TRY_COMPILE([], [
5625                         #ifdef __riscv_float_abi_double
5626                         #error "double"
5627                         #endif
5628                 ], [
5629                         fpabi=auto
5630                 ], [
5631                         fpabi=double
5632                 ])
5633         fi
5635         if test x$fpabi = xauto; then
5636                 AC_TRY_COMPILE([], [
5637                         #ifdef __riscv_float_abi_single
5638                         #error "single"
5639                         #endif
5640                 ], [
5641                         fpabi=auto
5642                 ], [
5643                         fpabi=single
5644                 ])
5645         fi
5647         if test x$fpabi = xauto; then
5648                 AC_TRY_COMPILE([], [
5649                         #ifdef __riscv_float_abi_soft
5650                         #error "soft"
5651                         #endif
5652                 ], [
5653                         fpabi=auto
5654                 ], [
5655                         fpabi=soft
5656                 ])
5657         fi
5659         case $fpabi in
5660         double)
5661                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5662                 AC_MSG_RESULT([double-precision])
5663                 ;;
5664         single)
5665                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5666                 AC_MSG_ERROR([single-precision, not supported])
5667                 ;;
5668         soft)
5669                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5670                 AC_MSG_RESULT([soft float])
5671                 ;;
5672         auto)
5673                 AC_MSG_ERROR([unknown])
5674                 ;;
5675         *)
5676                 AC_MSG_ERROR([invalid option: $fpabi])
5677                 ;;
5678         esac
5681 if test ${TARGET} = unknown; then
5682         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5683         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5686 if test "x$platform_android" = "xyes"; then
5687         case "x${TARGET}" in
5688         xARM)
5689                 case "x$arm_ver" in
5690                 xARMv5)
5691                         BTLS_SUPPORTED=yes
5692                         BTLS_PLATFORM=android-armv5
5693                         ;;
5694                 xARMv6)
5695                         BTLS_SUPPORTED=yes
5696                         BTLS_PLATFORM=android-armv6
5697                         ;;
5698                 xARMv7)
5699                         BTLS_SUPPORTED=yes
5700                         BTLS_PLATFORM=android-armv7
5701                         ;;
5702                 *)
5703                         BTLS_SUPPORTED=no
5704                         ;;
5705                 esac
5706                 ;;
5707         xARM64)
5708                 BTLS_SUPPORTED=yes
5709                 BTLS_PLATFORM=android-v8a
5710                 ;;
5711         xX86)
5712                 BTLS_SUPPORTED=yes
5713                 BTLS_PLATFORM=android-x86
5714                 ;;
5715         xAMD64)
5716                 BTLS_SUPPORTED=yes
5717                 BTLS_PLATFORM=android-x64
5718                 ;;
5719         *)
5720                 BTLS_SUPPORTED=no
5721                 ;;
5722         esac
5725 if test ${ACCESS_UNALIGNED} = no; then
5726         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5729 if test x$host_darwin = xyes; then
5730         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5731         AS_IF(
5732                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5733                 [AC_MSG_RESULT([no])],
5734                 [
5735                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5736                         AR_FLAGS="Scru"
5737                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5738                         AC_MSG_RESULT([yes])
5739                 ]
5740         )
5743 case "x$libgc" in
5744         xincluded)
5745                 # Pass CPPFLAGS to libgc configure
5746                 # We should use a separate variable for this to avoid passing useless and
5747                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5748                 # This should be executed late so we pick up the final version of CPPFLAGS
5749                 # The problem with this approach, is that during a reconfigure, the main
5750                 # configure scripts gets invoked with these arguments, so we use separate
5751                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5752                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5753                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5754                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5755                 fi
5756                 # Don't pass -finstrument-for-thread-suspension in, 
5757                 # if these are instrumented it will be very bad news 
5758                 # (infinite recursion, undefined parking behavior, etc)
5759                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5760                 ac_configure_args="$ac_configure_args --enable-single-obj-compilation --disable-embed-check --with-libgc-threads=$libgc_threads $libgc_configure_args \"CPPFLAGS_FOR_LIBGC=$TMP_CPPFLAGS\" \"CFLAGS_FOR_LIBGC=$CFLAGS_FOR_LIBGC\""
5761                 if test "x$support_boehm" = "xyes"; then
5762                         AC_CONFIG_SUBDIRS(external/bdwgc)
5763                 fi
5764                 ;;
5765 esac
5767 MALLOC_MEMPOOLS=no
5768 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5769         if test x$with_malloc_mempools = xyes; then
5770                 MALLOC_MEMPOOLS=yes
5771                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5772         fi
5776 DISABLE_MCS_DOCS=default
5777 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5778         if test x$with_mcs_docs != xyes; then
5779                 DISABLE_MCS_DOCS=yes
5780         fi
5782 if test -n "$INSTALL_4_x_TRUE"; then :
5783         DISABLE_MCS_DOCS=yes
5785 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5786    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5789 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)],[
5790         if test x$with_lazy_gc_thread_creation != xno ; then
5791                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5792         fi
5793 ], [with_lazy_gc_thread_creation=no])
5795 dnl *****************************
5796 dnl *** Thread suspend policy ***
5797 dnl *****************************
5799 dnl Set a default hybrid or cooperative suspend on some platforms
5801 dnl Coop default is set by the bitcode preset.
5803 dnl If coop isn't on by default, maybe hybrid should be?
5804 if test x$enable_cooperative_suspend_default != xyes; then
5805         case $HOST in
5806         X86 | AMD64)
5807                 dnl Some host/target confusion, there's no host_osx (and
5808                 dnl host_darwin would be true on iOS not just macOS).
5809                 if test x$target_osx = xyes; then
5810                         enable_hybrid_suspend_default=yes
5811                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5812                         enable_hybrid_suspend_default=yes
5813                 fi
5814                 ;;
5815         esac
5818 dnl Now check if there were flags overriding the defaults
5820 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])
5821 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5823 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5824         enable_cooperative_suspend=$with_cooperative_gc
5827 if test x$enable_cooperative_suspend = xdefault; then
5828         enable_cooperative_suspend=$enable_cooperative_suspend_default
5831 if test x$enable_cooperative_suspend != xno; then
5832         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5833         enable_hybrid_suspend_default=no
5836 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5838 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])
5840 if test x$enable_hybrid_suspend = xdefault; then
5841    enable_hybrid_suspend=$enable_hybrid_suspend_default
5844 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5845         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5848 if test x$enable_hybrid_suspend != xno ; then
5849         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5852 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5854 dnl End of thread suspend policy
5856 dnl ***************************
5857 dnl *** feature experiments ***
5858 dnl ***************************
5860 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5861 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null,tiered],[
5863         if test x$enable_experiment != x ; then
5864                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5865         fi
5866         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5867                 eval "mono_experiment_test_enable_$feature='yes'"
5868         done
5870         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5871                 eval "mono_experiment_test_enable_null='yes'"
5872                 eval "mono_experiment_test_enable_tiered='yes'"
5873                 true
5874         fi
5876         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5877                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5878         fi
5879         if test "x$mono_experiment_test_enable_tiered" = "xyes"; then
5880                 AC_DEFINE(ENABLE_EXPERIMENT_TIERED, 1, [Enable experiment 'Tiered Compilation'])
5881         fi
5882 ],[])
5884 AM_CONDITIONAL(ENABLE_EXPERIMENT_TIERED, test x$mono_experiment_test_enable_tiered = xyes)
5886 dnl **********************
5887 dnl *** checked builds ***
5888 dnl **********************
5890 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],[
5892         if test x$enable_checked_build != x ; then
5893                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5894         fi
5895         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5896                 eval "mono_checked_build_test_enable_$feature='yes'"
5897         done
5899         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5900                 eval "mono_checked_build_test_enable_gc='yes'"
5901                 eval "mono_checked_build_test_enable_metadata='yes'"
5902                 eval "mono_checked_build_test_enable_thread='yes'"
5903                 eval "mono_checked_build_test_enable_private_types='yes'"
5904                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5905         fi
5907         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5908                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5909         fi
5911         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5912                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5913         fi
5915         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5916                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5917         fi
5919         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5920                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5921         fi
5923         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5924                 # Required
5925                 with_overridable_allocators=yes
5926                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5928                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5929         fi
5930 ], [])
5932 dnl End of checked builds
5934 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5936 AC_CHECK_HEADER([malloc.h], 
5937                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5938                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5940 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5941 # instead of libmono-static.a
5942 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5943    LIBMONO_LA=libmini-static.la
5944 else
5945    if test x$buildsgen = xyes; then
5946       LIBMONO_LA=libmonosgen-$API_VER.la
5947    else
5948       LIBMONO_LA=libmonoboehm-$API_VER.la
5949    fi
5951 AC_SUBST(LIBMONO_LA)
5953 dnl **************
5954 dnl ***  Btls  ***
5955 dnl **************
5957 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5958 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5959 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5960 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5961 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5962 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])
5964 if test "x$with_btls_android_api" = "x" ; then
5965         case "$BTLS_PLATFORM" in
5966                 android-armv5)
5967                         with_btls_android_api=16" ;;
5968                 android-armv6)
5969                         with_btls_android_api=16" ;;
5970                 android-armv7)
5971                         with_btls_android_api=16 ;;
5972                 android-v8a)
5973                         with_btls_android_api=21 ;;
5974                 android-x86)
5975                         with_btls_android_api=16 ;;
5976                 android-x64)
5977                         with_btls_android_api=21 ;;
5978         esac
5981 if test "x$enable_btls" = "xno"; then
5982    enable_btls_lib=no
5985 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5987 btls_android=no
5988 if test "x$enable_btls" = "xyes"; then
5989         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5990         if test "x$CMAKE" = "xno"; then
5991                 AC_MSG_ERROR("cmake not found")
5992         fi
5994         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5995         AC_SUBST(BTLS_ROOT)
5997         btls_arch=
5998         btls_cflags=
5999         BTLS_CMAKE_ARGS=
6001         if test "x$host_win32" = "xyes"; then
6002                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
6003         fi
6005         case "$BTLS_PLATFORM" in
6006         i386)
6007                 btls_arch=i386
6008                 btls_cflags="-m32"
6009                 case $host_os in
6010                         darwin*)
6011                                 btls_cflags="$btls_cflags -arch i386"
6012                                 ;;
6013                         mingw*|cygwin*)
6014                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
6015                                 if test "x$HAVE_YASM" != "xyes"; then
6016                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
6017                                 fi
6018                                 ;;
6019                 esac
6020                 ;;
6021         x86_64)
6022                 btls_arch=x86_64
6023                 case $host_os in
6024                         mingw*|cygwin*)
6025                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
6026                                 if test "x$HAVE_YASM" != "xyes"; then
6027                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
6028                                 fi
6029                                 ;;
6030                 esac
6031                 ;;
6032         arm)
6033                 btls_arch=arm
6034                 btls_cflags="-DOPENSSL_NO_ASM=1"
6035                 ;;
6036         armsoft)
6037                 btls_arch=arm
6038                 btls_cflags="-DOPENSSL_NO_ASM=1"
6039                 ;;
6040         aarch64)
6041                 btls_arch=aarch64
6042                 btls_cflags="-march=armv8-a+crypto"
6043                 ;;
6044         s390x)
6045                 btls_arch=s390x
6046                 ;;
6047         powerpc)
6048                 btls_arch=powerpc
6049                 case $host_os in
6050                         aix*|os400*)
6051                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
6052                                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
6053                 esac
6054                 ;;
6055         android-armv5)
6056                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
6057                 ;;
6058         android-armv6)
6059                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
6060                 ;;
6061         android-armv7)
6062                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
6063                 ;;
6064         android-v8a)
6065                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
6066                 ;;
6067         android-x86)
6068                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
6069                 ;;
6070         android-x64)
6071                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
6072                 ;;
6073         riscv32)
6074                 btls_arch=riscv32
6075                 ;;
6076         riscv64)
6077                 btls_arch=riscv64
6078                 ;;
6079         *)
6080                 AC_MSG_ERROR(Invalid BTLS platform)
6081         esac
6083         if test "x$platform_android" = "xyes"; then
6084                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
6085                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
6086                 fi
6088                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
6089                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
6090                 fi
6092                 btls_android=yes
6093                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
6094                 if test "x$with_btls_android_ndk" != "x"; then
6095                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
6096                 else
6097                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
6098                 fi
6099         fi
6101         if test "x$btls_arch" != "x"; then
6102                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
6103         fi
6105         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
6106         AC_SUBST(BTLS_ARCH)
6107         AC_SUBST(BTLS_CFLAGS)
6108         AC_SUBST(BTLS_PLATFORM)
6109         AC_SUBST(BTLS_CMAKE_ARGS)
6111         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
6112 else
6113         enable_btls=no
6116 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
6118 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
6119 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
6120 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
6122 libmono_ldflags="$libmono_ldflags $LIBS"
6124 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
6125 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
6126 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
6127 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
6128 AM_CONDITIONAL(X86, test x$TARGET = xX86)
6129 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
6130 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
6131 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
6132 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
6133 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
6134 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
6135 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
6136 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
6137 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
6138 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
6139 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
6140 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
6141 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
6142 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
6143 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
6144 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
6145 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
6146 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
6147 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
6149 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
6151 AC_SUBST(LIBC)
6152 AC_SUBST(INTL)
6153 AC_SUBST(SQLITE)
6154 AC_SUBST(SQLITE3)
6155 AC_SUBST(ODBC)
6156 AC_SUBST(X11)
6157 AC_SUBST(GDKX11)
6158 AC_SUBST(GTKX11)
6159 AC_SUBST(XINERAMA)
6160 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
6161 AC_SUBST(arch_target)
6163 #This must always be defined when building the runtime
6164 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
6166 mono_build_root=`pwd`
6167 AC_SUBST(mono_build_root)
6169 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)
6170 if test x$host_win32 = xno; then
6171         if test x$enable_msvc_only = xyes; then
6172                 echo "Error, --enable-msvc-only only supported for Windows builds."
6173                 exit 1
6174         fi
6176 AM_CONDITIONAL(ENABLE_MSVC_ONLY, test x$enable_msvc_only = xyes)
6178 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
6179 if test x$host_win32 = xno; then
6180         if test x$enable_msvc = xyes; then
6181                 echo "Error, --enable-msvc only supported for Windows builds."
6182                 exit 1
6183         fi
6185 if test x$enable_msvc_only = xyes; then
6186         enable_msvc=yes
6188 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
6190 if test "x$enable_msvc" = "xyes"; then
6191         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
6192         if test "x$host_cpu" = "xi686"; then
6193                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
6194                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
6195                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
6196                 mono_runtime_wrapper=$mono_runtime
6197         else
6198                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
6199                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
6200                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
6201                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
6202         fi
6203         AC_SUBST(mono_msvc_build_dir)
6204         AC_SUBST(mono_msvc_build_lib_dir)
6205         AC_SUBST(mono_msvc_build_bin_dir)
6206 else
6207         mono_runtime=mono/mini/mono
6208         mono_runtime_wrapper=$mono_runtime
6211 AC_SUBST(mono_runtime)
6212 AC_SUBST(mono_runtime_wrapper)
6214 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.7.0/csc.exe
6215 VBCS_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.7.0/VBCSCompiler.exe
6217 if test $csc_compiler = mcs; then
6218   CSC=$mcs_topdir/class/lib/build/mcs.exe
6219 else
6220   CSC=$CSC_LOCATION
6223 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
6225 mono_cfg_root=$mono_build_root/runtime
6226 if test x$host_win32 = xyes; then
6227   if test "x$cross_compiling" = "xno"; then
6228     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
6229     CSC=`cygpath -m -a $CSC`
6230     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
6231     VBCS_LOCATION=`cygpath -m -a $VBCS_LOCATION`
6232   else
6233     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
6234   fi
6235 else
6236   mono_cfg_dir=$mono_cfg_root/etc
6239 if test "x$platform_android" = "xyes"; then
6240   mono_cfg_dir=
6243 AC_SUBST(mono_cfg_dir)
6245 AC_SUBST(CSC)
6247 if test "x$with_core" != "xonly"; then
6249         AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
6250         [   depth=../../../..
6251                 case $srcdir in
6252                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6253                 .) reldir=$depth ;;
6254                 *) reldir=$depth/$srcdir ;;
6255                 esac
6256                 $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
6257                 cd runtime/etc/mono/1.0
6258                 rm -f machine.config
6259                 $LN_S $reldir/data/net_1_1/machine.config machine.config
6260                 cd $depth
6261         ],[LN_S='$LN_S'])
6263         AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
6264         [   depth=../../../..
6265                 case $srcdir in
6266                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6267                 .) reldir=$depth ;;
6268                 *) reldir=$depth/$srcdir ;;
6269                 esac
6270                 $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6271                 cd runtime/etc/mono/2.0
6272                 rm -f machine.config
6273                 $LN_S $reldir/data/net_2_0/machine.config machine.config
6274                 cd $depth
6275         ],[LN_S='$LN_S'])
6277         AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
6278         [   depth=../../../..
6279                 case $srcdir in
6280                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6281                 .) reldir=$depth ;;
6282                 *) reldir=$depth/$srcdir ;;
6283                 esac
6284                 $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6285                 cd runtime/etc/mono/2.0
6286                 rm -f web.config
6287                 $LN_S $reldir/data/net_2_0/web.config web.config
6288                 cd $depth
6289         ],[LN_S='$LN_S'])
6291         AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
6292         [   depth=../../..
6293                 case $srcdir in
6294                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6295                 .) reldir=$depth ;;
6296                 *) reldir=$depth/$srcdir ;;
6297                 esac
6298                 $ac_aux_dir/install-sh -d runtime/etc/mono/
6299                 cd runtime/etc/mono/
6300                 rm -f browscap.ini
6301                 $LN_S $reldir/data/browscap.ini browscap.ini
6302                 cd $depth
6303         ],[LN_S='$LN_S'])
6305         AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
6306         [   depth=../../../../..
6307                 case $srcdir in
6308                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6309                 .) reldir=$depth ;;
6310                 *) reldir=$depth/$srcdir ;;
6311                 esac
6312                 $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
6313                 cd runtime/etc/mono/2.0/Browsers
6314                 rm -f Compat.browser
6315                 $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6316                 cd $depth
6317         ],[LN_S='$LN_S'])
6319         AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
6320         [   depth=../../../../..
6321                 case $srcdir in
6322                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6323                 .) reldir=$depth ;;
6324                 *) reldir=$depth/$srcdir ;;
6325                 esac
6326                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
6327                 cd runtime/etc/mono/4.0/Browsers
6328                 rm -f Compat.browser
6329                 $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6330                 cd $depth
6331         ],[LN_S='$LN_S'])
6333         AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
6334         [   depth=../../../../..
6335                 case $srcdir in
6336                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6337                 .) reldir=$depth ;;
6338                 *) reldir=$depth/$srcdir ;;
6339                 esac
6340                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
6341                 cd runtime/etc/mono/4.5/Browsers
6342                 rm -f Compat.browser
6343                 $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6344                 cd $depth
6345         ],[LN_S='$LN_S'])
6347         AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
6348         [   depth=../../../..
6349                 case $srcdir in
6350                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6351                 .) reldir=$depth ;;
6352                 *) reldir=$depth/$srcdir ;;
6353                 esac
6354                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6355                 cd runtime/etc/mono/4.0
6356                 rm -f machine.config
6357                 $LN_S $reldir/data/net_4_0/machine.config machine.config
6358                 cd $depth
6359         ],[LN_S='$LN_S'])
6361         AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
6362         [   depth=../../../..
6363                 case $srcdir in
6364                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6365                 .) reldir=$depth ;;
6366                 *) reldir=$depth/$srcdir ;;
6367                 esac
6368                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6369                 cd runtime/etc/mono/4.0
6370                 rm -f web.config
6371                 $LN_S $reldir/data/net_4_0/web.config web.config
6372                 cd $depth
6373         ],[LN_S='$LN_S'])
6375         AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
6376         [   depth=../../../..
6377                 case $srcdir in
6378                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6379                 .) reldir=$depth ;;
6380                 *) reldir=$depth/$srcdir ;;
6381                 esac
6382                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6383                 cd runtime/etc/mono/4.5
6384                 rm -f machine.config
6385                 $LN_S $reldir/data/net_4_5/machine.config machine.config
6386                 cd $depth
6387         ],[LN_S='$LN_S'])
6389         AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
6390         [   depth=../../../..
6391                 case $srcdir in
6392                 [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6393                 .) reldir=$depth ;;
6394                 *) reldir=$depth/$srcdir ;;
6395                 esac
6396                 $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6397                 cd runtime/etc/mono/4.5
6398                 rm -f web.config
6399                 $LN_S $reldir/data/net_4_5/web.config web.config
6400                 cd $depth
6401         ],[LN_S='$LN_S'])
6404 # Top level Makefile.am subdirs
6405 if test "x$with_core" = "xonly"; then
6406         MONO_SUBDIRS="llvm mono"
6407 else
6408         if test "x$support_boehm" = "xyes" -a "x$libgc" = "xincluded"; then
6409                 mono_subdirs_libgc=external/bdwgc
6410         fi
6412         if test x$enable_support_build != xno; then
6413                 mono_subdirs_support=support
6414         fi
6416         if test x$cross_compiling = xno; then
6417                 # Some tools might not build when cross-compiling
6418                 mono_subdirs_tools=tools
6419         fi
6421         if test x$DISABLE_MCS_DOCS != xyes; then
6422                 mono_subdirs_docs=docs
6423         fi
6425         if test x$with_ikvm_native = xyes; then
6426                 mono_subdirs_ikvm_native=ikvm-native
6427         fi
6429         MONO_SUBDIRS="po $mono_subdirs_libgc llvm mono $mono_subdirs_ikvm_native $mono_subdirs_support data runtime scripts man samples $mono_subdirs_tools $mono_subdirs_docs msvc acceptance-tests"
6430         MONO_NOINST_SUBDIRS="$mono_subdirs_libgc"
6433 AC_SUBST(MONO_SUBDIRS)
6434 AC_SUBST(MONO_NOINST_SUBDIRS)
6436 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])
6437 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])
6438 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
6441 # Mono.Native Support
6442 # -------------------
6443 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
6444 # It is built as a stand-alone shared library and not bundled with the runtime because we
6445 # may need to build two different versions of it.
6447 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
6448 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
6450 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
6451 # implementation accordingly.  We build a single `libmono-native` shared library.
6453 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
6455 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
6456 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
6457 # depending on platform.
6459 # We build two versions of the shared library:
6460 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
6461 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
6463 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
6464 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
6465 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
6467 # This can be called by automated tests both to ensure that the library has been correctly installed and also
6468 # to verify that it's the correct version of it.
6471 AC_MSG_CHECKING([Mono.Native support])
6472 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
6473 if test x$disable_mono_native = xyes; then
6474         mono_native=no
6475 elif test x$target_osx = xyes; then
6476         MONO_NATIVE_CC=$CC
6477         MONO_NATIVE_CXX=$CXX
6478         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6479         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6480         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6481         MONO_NATIVE_CFLAGS=$CFLAGS
6482         MONO_NATIVE_LDFLAGS=$LDFLAGS
6484         mono_native=yes
6485         MONO_NATIVE_PLATFORM=macos
6486         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6488         if test x$enable_gss = xyes; then
6489                 MONO_NATIVE_LDFLAGS="$MONO_NATIVE_LDFLAGS -framework GSS"
6490         fi
6492         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6493                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6495         if test x$mono_native_compat = xyes; then
6496                 mono_native_compat=yes
6497                 mono_native_text="Mac OSX (compat + unified v10.12)"
6498                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6499                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6500                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6501                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6502                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6504                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6505                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6506                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6507                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6508                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6509                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6510         else
6511                 mono_native_compat=no
6512                 mono_native_text="Mac OSX"
6513         fi
6514 elif test x$mono_native_platform_ios = xyes; then
6515         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6517         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6518                 if test x$mono_native_ios_sim = xyes; then
6519                         mono_native_ios_target=ios-simulator
6520                         mono_native_text="iOS Simulator"
6521                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6522                 else
6523                         mono_native_ios_target=iphoneos
6524                         mono_native_text="iOS Device"
6525                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6526                 fi
6527                 mono_native_unified_version="10.0"
6528                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6529         ], [
6530                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6531                         if test x$mono_native_ios_sim = xyes; then
6532                                 mono_native_ios_target=tvos-simulator
6533                                 mono_native_text="AppleTV Simulator"
6534                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6535                         else
6536                                 mono_native_ios_target=tvos
6537                                 mono_native_text="AppleTV Device"
6538                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6539                         fi
6540                         mono_native_unified_version="10.0"
6541                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6542                 ], [
6543                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6544                                 if test x$mono_native_ios_sim = xyes; then
6545                                         mono_native_ios_target=watchos-simulator
6546                                         mono_native_text="Apple Watch Simulator"
6547                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6548                                 else
6549                                         mono_native_ios_target=watchos
6550                                         mono_native_text="Apple Watch Device"
6551                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6552                                 fi
6553                                 mono_native_unified_version="5.0"
6554                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6555                         ], [
6556                                 AC_MSG_ERROR([Unknown iOS Target])
6557                         ])
6558                 ])
6559         ])
6561         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6563         if test x$with_bitcode = xyes; then
6564                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6565                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6566         else
6567                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6568         fi
6570         if test x$enable_gss = xyes; then
6571                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6572         fi
6574         MONO_NATIVE_CC=$CC
6575         MONO_NATIVE_CXX=$CXX
6576         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6577         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6578         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6579         MONO_NATIVE_CFLAGS=$CFLAGS
6580         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6582         if test x$mono_native_compat = xyes; then
6583                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6584                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6585                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6586                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6587                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6588                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6590                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6591                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6592                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6593                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6594                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6595                 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"
6596         fi
6598         mono_native=yes
6599         MONO_NATIVE_PLATFORM=ios
6600 elif test x$host_linux = xyes; then
6601         mono_native_text="Linux"
6602         MONO_NATIVE_CC=$CC
6603         MONO_NATIVE_CXX=$CXX
6604         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6605         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6606         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6607         MONO_NATIVE_CFLAGS=$CFLAGS
6608         MONO_NATIVE_LDFLAGS=$LDFLAGS
6609         if test x$enable_gss = xyes; then
6610                 MONO_NATIVE_LDFLAGS="$MONO_NATIVE_LDFLAGS -lgssapi_krb5"
6611         else
6612                 AC_MSG_WARN([GSS is not enabled, it requires libkrb5-dev package])
6613         fi
6614         mono_native=yes
6615         mono_native_compat=no
6616         MONO_NATIVE_PLATFORM=linux
6618         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6619 elif test x$target_wasm = xyes; then
6620         mono_native_text="wasm"
6621         MONO_NATIVE_CC=$CC
6622         MONO_NATIVE_CXX=$CXX
6623         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6624         # The system.native code uses _WASM_ to check for wasm
6625         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6626         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6627         MONO_NATIVE_CFLAGS=$CFLAGS
6628         MONO_NATIVE_LDFLAGS=$LDFLAGS
6630         mono_native=yes
6631         mono_native_compat=no
6632         MONO_NATIVE_PLATFORM=linux
6634         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6635 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6636         mono_native_text="AIX"
6637         MONO_NATIVE_CC=$CC
6638         MONO_NATIVE_CXX=$CXX
6639         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6640         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6641         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6642         MONO_NATIVE_CFLAGS=$CFLAGS
6643         dnl nosymbolic- is a hack in case -G for linking is used, as -G seems
6644         dnl to change the way unresolved symbols work on library load in an
6645         dnl incompatible manner. (as references to runtime functions are
6646         dnl resolved later) Default params otherwise are that, so seems OK.
6647         dnl Likewise, we don't seem to need to cover the entire runtime with
6648         dnl it either, on both AIX and PASE. -brtl from -G does seem to spew
6649         dnl Big Scary TOC Warnings (tm) from the linker, but it doesn't seem
6650         dnl problematic with gcc's -mminimal-toc.
6651         dnl ----
6652         dnl flock in AIX exists in libbsd (not the same as freedesktop.org
6653         dnl libbsd) which Mono.Native needs.
6654         dnl Because of the way that the library is built by default, unresolved
6655         dnl references are kept and resolved at runtime. Often, the dependency
6656         dnl chain means libbsd is loaded anyways, but not necessarily. It's
6657         dnl better to explicitly link it, even though it has it shadows libc's
6658         dnl ioctl with its own. (As for the other unresolved imports, those
6659         dnl should be provided by the Mono runtime loaded.)
6660         MONO_NATIVE_LDFLAGS="$LDFLAGS -lbsd -Wl,-bnosymbolic-"
6662         mono_native=yes
6663         mono_native_compat=no
6664         MONO_NATIVE_PLATFORM=aix
6666         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6667 elif case $host_os in freebsd*) true;; *) false;; esac; then
6668         mono_native_text="FreeBSD"
6669         MONO_NATIVE_CC=$CC
6670         MONO_NATIVE_CXX=$CXX
6671         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6672         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6673         MONO_NATIVE_CFLAGS="$CFLAGS -I/usr/local/include"
6674         MONO_NATIVE_LDFLAGS=$LDFLAGS
6676         mono_native=yes
6677         mono_native_compat=no
6678         MONO_NATIVE_PLATFORM=freebsd
6679         AC_MSG_CHECKING([Mono.Native support])
6680         AC_MSG_RESULT(freebsd)
6682         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_FREEBSD"
6683 elif case $host_os in netbsd*) true;; *) false;; esac; then
6684         mono_native_text="NetBSD"
6685         MONO_NATIVE_CC=$CC
6686         MONO_NATIVE_CXX=$CXX
6687         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6688         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6689         MONO_NATIVE_CFLAGS=$CFLAGS
6690         MONO_NATIVE_LDFLAGS=$LDFLAGS
6692         mono_native=yes
6693         mono_native_compat=no
6694         MONO_NATIVE_PLATFORM=netbsd
6695         AC_MSG_CHECKING([Mono.Native support])
6696         AC_MSG_RESULT(netbsd)
6698         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_NETBSD"
6699 elif case $host_os in haiku*) true;; *) false;; esac; then
6700         mono_native_text="Haiku"
6701         MONO_NATIVE_CC=$CC
6702         MONO_NATIVE_CXX=$CXX
6703         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6704         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6705         MONO_NATIVE_CFLAGS=$CFLAGS
6706         MONO_NATIVE_LDFLAGS=$LDFLAGS
6708         mono_native=yes
6709         mono_native_compat=no
6710         MONO_NATIVE_PLATFORM=haiku
6711         AC_MSG_CHECKING([Mono.Native support])
6712         AC_MSG_RESULT(haiku)
6714         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_HAIKU"
6715 elif test x$platform_android = xyes; then
6716         mono_native_text="Android"
6717         MONO_NATIVE_CC=$CC
6718         MONO_NATIVE_CXX=$CXX
6719         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6720         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6721         MONO_NATIVE_CFLAGS=$CFLAGS
6722         MONO_NATIVE_LDFLAGS=$LDFLAGS
6723         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6725         mono_native=yes
6726         mono_native_compat=no
6727         MONO_NATIVE_PLATFORM=android
6729         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6730 else
6731         mono_native=no
6732         mono_native_text="no"
6735 AC_MSG_RESULT($mono_native_text)
6737 if test x$mono_native_compat = xyes; then
6738         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6739 else
6740         MONO_NATIVE_LIBRARY_NAME=libmono-native
6743 AC_SUBST(MONO_NATIVE_PLATFORM)
6744 AC_SUBST(MONO_NATIVE_CC)
6745 AC_SUBST(MONO_NATIVE_CXX)
6746 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6747 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6748 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6749 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6750 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6751 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6752 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6753 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6754 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6755 AC_SUBST(MONO_NATIVE_CFLAGS)
6756 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6757 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6758 AC_SUBST(MONO_NATIVE_LDFLAGS)
6759 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6760 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6761 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6762 AC_SUBST(MONO_NATIVE_LIBADD)
6764 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6765 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6766 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6767 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6768 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6769 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6770 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6771 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_FREEBSD, test x$MONO_NATIVE_PLATFORM = xfreebsd)
6772 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_NETBSD, test x$MONO_NATIVE_PLATFORM = xnetbsd)
6773 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_HAIKU, test x$MONO_NATIVE_PLATFORM = xhaiku)
6775 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6776 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6777 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6778 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6779 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6781 ### C++ Linker selection
6783 # We have to lie to autotools, sometimes.
6785 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6786 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6787 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6788 # except if we're linking with LLVM which relies on it.
6790 # Explanation of the hack:
6792 # According to
6793 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6794 # automake chooses the linker that it used to compile a target based on the
6795 # _SOURCES for that target.  If the target is comprised of only C code, it
6796 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6797 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6798 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6800 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6801 # or libc++) linked in - even when Mono is written in C++, we take care not to
6802 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6803 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6804 # C++ linker - LLVM doesn't have the same restrictions.
6806 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6807 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6808 #  automake's autodetection and lets us use the linker that we want.
6810 if test "x$enable_llvm_runtime" = "xyes"; then
6811         AC_SUBST(MONO_CXXLD, [$CXX])
6812         AC_SUBST(MONO_LIBTOOL_TAG, '--tag=CXX')
6813 else
6814         AC_SUBST(MONO_CXXLD, [$CC])
6815         AC_SUBST(MONO_LIBTOOL_TAG, '')
6818 ### Set -Werror options
6820 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6822 if test x"$GCC" = xyes; then
6824         if test "x$with_jemalloc" != "xyes"; then
6826                 # incompatible-pointer-types requires gcc circa 5.x
6828                 ORIG_CFLAGS=$CFLAGS
6829                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6830                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6831                 AC_TRY_COMPILE([],[
6832                 ], [
6833                         AC_MSG_RESULT(yes)
6834                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6835                 ], [
6836                         AC_MSG_RESULT(no)
6837                         CFLAGS=$ORIG_CFLAGS
6838                 ])
6840                 CFLAGS="$CFLAGS -Werror=return-type"
6841         fi
6843         # Implicit function declarations are not 64 bit safe
6844         # Do this late, since this causes lots of configure tests to fail
6845         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6846         # jay has a lot of implicit declarations
6847         JAY_CFLAGS="-Wno-implicit-function-declaration"
6849         ORIG_CFLAGS=$CFLAGS
6850         CFLAGS="$CFLAGS -Wsometimes-uninitialized -Werror"
6851         AC_MSG_CHECKING(for -Wsometimes-uninitialized option to gcc)
6852         AC_TRY_COMPILE([],[
6853         ], [
6854                 AC_MSG_RESULT(yes)
6855                 CFLAGS="$ORIG_CFLAGS -Werror=sometimes-uninitialized"
6856         ], [
6857                 AC_MSG_RESULT(no)
6858                 CFLAGS=$ORIG_CFLAGS
6859         ])
6862 # zlib/configure checks if this program compiles and if so
6863 # defines _LARGEFILE64_SOURCE on the compiler command line (not config.h).
6865 AC_MSG_CHECKING([for large file support])
6866 AC_COMPILE_IFELSE(
6867         [AC_LANG_SOURCE([
6868                 #include <sys/types.h>
6869                 off64_t dummy = 0;
6870         ])], [
6871                 AC_MSG_RESULT(yes)
6872                 # FIXME The ramifications of _LARGEFILE64_SOURCE are not understood.
6873                 # ZLIB_CFLAGS="$ZLIB_CFLAGS -D_LARGEFILE64_SOURCE=1"
6874         ], [
6875                 AC_MSG_RESULT(no)
6876         ])
6878 # for icu shim
6879 ICU_SHIM_PATH=.
6880 if test x$with_core = xonly; then
6881         if test x$cross_compiling = xno; then
6882                 AC_CHECK_FILE($srcdir/../libraries/Native/Unix/System.Globalization.Native/pal_icushim.h, [have_shim_globalization=yes], [have_shim_globalization=no])
6883         fi
6884         if test x$have_shim_globalization = xyes || test x$cross_compiling = xyes; then
6885                 ICU_SHIM_PATH=../../../libraries/Native/Unix/System.Globalization.Native
6886                 if test x$target_wasm = xyes && test x$with_static_icu = xyes; then
6887                         ICU_CFLAGS="-DTARGET_UNIX -DU_DISABLE_RENAMING"
6888                         have_sys_icu=yes
6889                 elif test x$target_osx = xyes; then
6890                         ORIG_CPPFLAGS=$CPPFLAGS
6891                         # adding icu path to pkg_config_path
6892                         PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/local/opt/icu4c/lib/pkgconfig
6893                         export PKG_CONFIG_PATH
6894                         CPPFLAGS="`pkg-config --cflags-only-I icu-uc`"
6895                         AC_CHECK_LIB(icucore, ucol_open, LIBS=$LIBS,
6896                                 [AC_MSG_ERROR([Cannot find libicucore, skipping build for System.Globalization.Native. .NET globalization is not expected to function.])])
6897                         AC_CHECK_HEADER(unicode/utypes.h, [have_sys_icu=yes], [have_sys_icu=no])
6898                         if test x$have_sys_icu = xyes; then
6899                                 ICU_CFLAGS="$CPPFLAGS -DPALEXPORT="" -DOSX_ICU_LIBRARY_PATH=AS_ESCAPE(\"/usr/lib/libicucore.dylib\", '\"') -DTARGET_UNIX -DU_DISABLE_RENAMING -Wno-reserved-id-macro -Wno-documentation -Wno-documentation-unknown-command -Wno-switch-enum -Wno-covered-switch-default -Wno-covered-switch-default -Wno-extra-semi-stmt -Wno-unknown-warning-option -Wno-deprecated-declarations"
6900                         fi
6901                         CPPFLAGS=$ORIG_CPPFLAGS
6902                 elif test x$platform_android = xyes; then
6903                         ICU_CFLAGS="-DPALEXPORT="" -DHAVE_UDAT_STANDALONE_SHORTER_WEEKDAYS -DHAVE_SET_MAX_VARIABLE -DTARGET_UNIX -DTARGET_ANDROID -Wno-reserved-id-macro -Wno-documentation -Wno-documentation-unknown-command -Wno-switch-enum -Wno-covered-switch-default -Wno-covered-switch-default -Wno-extra-semi-stmt -Wno-unknown-warning-option"
6904                         have_sys_icu=yes
6905                 elif test x$host_linux = xyes; then
6906                         AC_CHECK_LIB(icuuc, main, LIBS=$LIBS,
6907                                 [AC_MSG_ERROR([Cannot find libicuuc, try installing libicu-dev (or the appropriate package for your platform).])])
6908                         AC_CHECK_LIB(icui18n, main, LIBS=$LIBS,
6909                                 [AC_MSG_ERROR([Cannot find libicui18n, try installing libicu-dev (or the appropriate package for your platform).])])
6910                         AC_CHECK_HEADER(unicode/utypes.h, [have_sys_icu=yes], [have_sys_icu=no])
6911                         if test x$have_sys_icu = xyes; then
6912                                 ICU_CFLAGS="-DPALEXPORT="" -DTARGET_UNIX -Wno-reserved-id-macro -Wno-documentation -Wno-documentation-unknown-command -Wno-switch-enum -Wno-covered-switch-default -Wno-covered-switch-default -Wno-extra-semi-stmt -Wno-unknown-warning-option"
6913                         fi
6914                 elif test x$host_sunos = xyes; then
6915                         ICU_CFLAGS="-DPALEXPORT="" -DTARGET_UNIX -Wno-reserved-id-macro -Wno-documentation -Wno-documentation-unknown-command -Wno-switch-enum -Wno-covered-switch-default -Wno-extra-semi-stmt -Wno-unknown-warning-option"
6916                         have_sys_icu=yes
6917                 elif test x$host_wasm = xyes; then
6918                         ICU_CFLAGS="-DPALEXPORT="" -DTARGET_UNIX -Wno-reserved-id-macro -Wno-documentation -Wno-documentation-unknown-command -Wno-switch-enum -Wno-covered-switch-default -Wno-covered-switch-default -Wno-extra-semi-stmt -Wno-unknown-warning-option"
6919                         have_sys_icu=yes
6920                 else
6921                         GLOBALIZATION_SHIM_DEFINES="-DNO_GLOBALIZATION_SHIM"
6922                 fi
6923                 AC_SUBST(ICU_CFLAGS)
6924         else
6925                 GLOBALIZATION_SHIM_DEFINES="-DNO_GLOBALIZATION_SHIM"
6926         fi
6927 else
6928         GLOBALIZATION_SHIM_DEFINES="-DNO_GLOBALIZATION_SHIM"
6931 AC_SUBST(GLOBALIZATION_SHIM_DEFINES)
6932 AC_SUBST(ICU_SHIM_PATH)
6933 AM_CONDITIONAL(HAVE_SYS_ICU, test x$have_sys_icu = xyes)
6935 AC_SUBST(CFLAGS)
6936 AC_SUBST(CPPFLAGS)
6937 AC_SUBST(LDFLAGS)
6938 AC_SUBST(CCLDFLAGS)
6939 AC_SUBST(ZLIB_CFLAGS)
6941 # Update all submodules recursively to ensure everything is checked out
6942 if test "x$with_core" != "xonly"; then
6943         (cd $srcdir && scripts/update_submodules.sh)
6946 AC_MONO_OUTPUT()
6948 if test x$host_win32 = xyes; then
6949    # Get rid of 'cyg' prefixes in library names
6950    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6951    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6952    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6953    # executable doesn't work...
6954    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6957 if test x$host_darwin = xyes; then
6958    # This doesn't seem to be required and it slows down parallel builds
6959    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6963   case $prefix in
6964   NONE) prefix=$ac_default_prefix ;;
6965   esac
6966   case $exec_prefix in
6967   NONE) exec_prefix='${prefix}' ;;
6968   esac
6970   #
6971   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6972   # any existing config.make.  This allows people to share the same source tree
6973   # with different build directories, one native and one cross
6974   #
6975   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6977     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6979     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6980     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6981     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6982     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6983     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6984     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6985     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6986     echo "VERSION = $VERSION" >> $mcs_topdir/build/config.make
6988     case $INSTALL in
6989     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6990     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6991     esac
6993     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6995     export VERSION
6996     [myver=$($AWK 'BEGIN {
6997       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6998       if(length(vsplit [1]) > 4) {
6999         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
7000       }
7001       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
7002     }')]
7004     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
7005     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
7007     if test x$host_darwin = xyes; then
7008       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
7009       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
7010       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
7011     elif test x$host_win32 = xyes; then
7012       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
7013       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
7014       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
7015     elif test x$host_linux = xyes; then
7016       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
7017       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
7018       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
7019     else
7020       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
7021       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
7022       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
7023     fi
7025     echo "PLATFORM_AOT_PREFIX = $PLATFORM_AOT_PREFIX" >> $mcs_topdir/build/config.make
7026     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
7027       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
7028     fi
7030         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
7031            enable_system_aot=yes
7032         fi
7034     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
7035       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
7036     fi
7038     if test x$DISABLE_MCS_DOCS = xyes; then
7039       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
7040     fi
7042     if test x$has_extension_module != xno; then
7043         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
7044     fi
7045     
7046     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
7047     
7048     if test "x$test_bcl_opt" = "xyes"; then    
7049       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
7050     fi
7052     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
7053     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
7054     echo "VBCS_LOCATION?=$VBCS_LOCATION" >> $srcdir/$mcsdir/build/config.make
7056     if test $csc_compiler = mcs; then
7057       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
7058     fi
7060     if test "x$AOT_BUILD_FLAGS" != "x" ; then
7061       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
7062       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
7064       if test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" = "xno"; then
7065         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS,$MONO_LLVM_PATH_OPTION" >> $srcdir/$mcsdir/build/config.make
7066       else
7067         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
7068       fi
7069     fi
7071     if test "x$AOT_MODE" != "x" ; then
7072       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
7073     fi
7075     if test "x$enable_btls" = "xyes"; then
7076       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
7077     fi
7079     if test "x$mono_native" = "xyes"; then
7080       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
7081     else
7082       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
7083     fi
7085     if test x$mono_native_compat = xyes; then
7086       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
7087     else
7088       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
7089     fi
7091     force_enable_compiler_server=no;
7093     AC_MSG_CHECKING([compiler server])
7094     AC_ARG_WITH(compiler-server, [  --with-compiler-server=yes,no,default,force      Enables or disables compiler server],[
7095        if test x$withval = xyes; then
7096            enable_compiler_server=yes;
7097        # force will bypass any automatic disables to allow you to test the compiler server
7098        #  in scenarios where it is disabled
7099        elif test x$withval = xforce; then
7100            enable_compiler_server=yes;
7101            force_enable_compiler_server=yes;
7102        elif test x$withval = xno; then
7103            enable_compiler_server=no;
7104        elif test x$withval = xdefault; then
7105            enable_compiler_server=yes;
7106        else
7107            AC_MSG_ERROR([You must supply one of "yes", "no", "default" or "force" to the --with-compiler-server option])
7108        fi
7109     ],[enable_compiler_server=yes])
7111     AC_MSG_RESULT($enable_compiler_server)
7113     if test x$enable_compiler_server = xyes; then
7114        if test x$force_enable_compiler_server = xyes; then
7115            AC_MSG_WARN([forcing compiler server to stay enabled])
7116        elif test x$host_darwin = xyes || test x$host_win32 = xyes; then
7117            AC_MSG_WARN([compiler server temporarily disabled on darwin and win32])
7118            enable_compiler_server=no;
7119        elif test x$csc_compiler = xmcs; then
7120            AC_MSG_WARN([mcs does not support the compiler server])
7121            enable_compiler_server=no;
7122        fi
7123     fi
7125     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
7126     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
7127     if test x$enable_compiler_server = xyes; then
7128       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
7129     else
7130       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
7131     fi
7132     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
7134         if test x$enable_msvc_only = xyes; then
7135                 echo "ENABLE_MSVC_ONLY=1" >> $srcdir/$mcsdir/build/config.make
7136         fi
7138   fi
7142 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
7144 btls_platform_string=
7145 if test x$enable_btls = xyes; then
7146         if test x$btls_android = xyes; then
7147                 btls_platform_string=" (android:$BTLS_PLATFORM)"
7148         else
7149                 btls_platform_string=" ($BTLS_PLATFORM)"
7150         fi
7153 thread_suspend_msg=
7154 if test x$buildsgen = xyes; then
7155         if test x$enable_cooperative_suspend != xno; then
7156                 thread_suspend_msg="Suspend:       Cooperative"
7157         elif test x$enable_hybrid_suspend != xno; then
7158                 thread_suspend_msg="Suspend:       Hybrid"
7159         else
7160                 thread_suspend_msg="Suspend:       Preemptive"
7161         fi
7164 if test "x$with_core" = "xonly"; then
7165   if test ! -e netcore/Makefile; then
7166     # Out of tree builds
7167     mkdir -p netcore
7168     echo "all:" > netcore/Makefile
7169   fi
7170   echo "VERSION = $VERSION" > netcore/config.make
7171   echo "RID = $RID" >> netcore/config.make
7172   echo "COREARCH = $COREARCH" >> netcore/config.make
7173   echo "CORETARGETS = $CORETARGETS" >> netcore/config.make
7174   echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> netcore/config.make
7176   if test x$build_darwin = xyes; then
7177     echo "HOST_PLATFORM ?= macos" >> netcore/config.make
7178   elif test x$host_darwin = xyes; then
7179     echo "HOST_PLATFORM ?= macos" >> netcore/config.make
7180   elif test x$host_win32 = xyes; then
7181     echo "HOST_PLATFORM ?= win32" >> netcore/config.make
7182   elif test x$host_linux = xyes; then
7183     echo "HOST_PLATFORM ?= linux" >> netcore/config.make
7184   else
7185     echo "HOST_PLATFORM ?= unix" >> netcore/config.make
7186   fi
7189         
7190 echo "
7191         mcs source:    $mcsdir
7192         C# Compiler:   $csc_compiler
7193         CompilerServer:$enable_compiler_server
7195    Engine:
7196         Host:          $host
7197         Target:        $target
7198         GC:            $gc_msg 
7199         $thread_suspend_msg
7200         TLS:           $with_tls
7201         SIGALTSTACK:   $with_sigaltstack
7202         Engine:        $jit_status
7203         BigArrays:     $enable_big_arrays
7204         DTrace:        $enable_dtrace
7205         LLVM Back End: $enable_llvm (built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
7206         Spectre:       $spectre_mitigation_status
7207         Mono.Native:   $mono_native_text
7209    Libraries:
7210         .NET 4.x:        $with_profile4_x
7211         Xamarin.Android: $with_monodroid
7212         Xamarin.iOS:     $with_monotouch
7213         Xamarin.WatchOS: $with_monotouch_watch
7214         Xamarin.TVOS:    $with_monotouch_tv
7215         Xamarin.Mac:     $with_xammac
7216         Windows AOT:     $with_winaot
7217         Orbis:           $with_orbis
7218         Unreal:          $with_unreal
7219         WebAssembly:     $with_wasm
7220         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)
7221         JNI support:     $jdk_headers_found
7222         libgdiplus:      $libgdiplus_msg
7223         zlib:            $zlib_msg
7224         BTLS:            $enable_btls$btls_platform_string
7225         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
7226         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
7227         .NET Core:       $with_core
7228         $disabled
7230 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
7231    AC_MSG_WARN([Turning off static Mono is a risk, you might run into unexpected bugs])