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