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