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