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