Read only interp callbacks, option 4, without ordering sensitivity.
[mono-project.git] / configure.ac
blobd09b4989c194da07be519e051b625b8e434afca4
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(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1236 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1237 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1240 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,winaot,winaot_llvm,bitcode,bitcodeinterp,unreal,fullaotinterp,fullaotinterp_llvm  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1241 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])
1242 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])
1243 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])
1246 dnl Spectre compiler mitigation flag checks
1248 if test "x$with_spectre_mitigation" = "xyes"; then
1249    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1250    SPECTRE_CFLAGS=
1251    SPECTRE_INDIRECT_BRANCH_KIND=
1252    case "x$with_spectre_indirect_branch_choice" in
1253        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1254        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1255        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1256        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1257        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1258    esac
1260    SPECTRE_FUNCTION_RETURN_KIND=""
1261    case "x$with_spectre_function_return_choice" in
1262        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1263        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1264        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1265        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1266        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1267    esac
1269    AX_CHECK_COMPILE_FLAG(
1270         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1271         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1272    )
1274    AX_CHECK_COMPILE_FLAG(
1275         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1276         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1277    )
1279    if test "x$SPECTRE_CFLAGS" != "x" ; then
1280         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1281         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1282         spectre_mitigation_status="mitigation enabled"
1283    fi
1284 else
1285         spectre_mitigation_status="no mitigation"
1289 dnl Profile defaults
1291 TEST_PROFILE=default
1292 enable_llvm_default=no
1294 with_profile4_x_default=no
1295 with_monodroid_default=no
1296 with_monotouch_default=no
1297 with_monotouch_watch_default=no
1298 with_monotouch_tv_default=no
1299 with_xammac_default=no
1300 with_testing_aot_full_interp_default=no
1301 with_testing_aot_hybrid_default=no
1302 with_testing_aot_full_default=no
1303 with_winaot_default=no
1304 with_orbis_default=no
1305 with_unreal_default=no
1306 with_wasm_default=no
1308 with_bitcode_default=no
1309 enable_cooperative_suspend_default=no
1310 enable_hybrid_suspend_default=no
1312 # For the sake of clearer error messages, these numbers should all be different from each other.
1313 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4400,nftnptr-arg-trampolines=4000
1315 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1317 MONO_LLVM_PATH_OPTION=llvm-path="`pwd`/llvm/usr/bin"
1319 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1320    DISABLE_MCS_DOCS_default=yes
1321 elif test x$with_runtime_preset = xnetcore; then
1322    DISABLE_MCS_DOCS_default=yes
1323    BTLS_SUPPORTED=no
1324    enable_mcs_build=no
1325    enable_support_build=no
1327    mono_feature_disable_remoting='yes'
1328    mono_feature_disable_reflection_emit_save='yes'
1329    mono_feature_disable_appdomains='yes'
1330    mono_feature_disable_cleanup='yes'
1331    mono_feature_disable_assembly_remapping='yes'
1332    disable_mono_native=yes
1333    support_boehm=no
1334 elif test x$with_runtime_preset = xnet_4_x; then
1335    with_profile4_x_default=yes
1336    TEST_PROFILE=net_4_x
1337 elif test x$with_runtime_preset = xall; then
1338    with_profile4_x_default=yes
1339    with_monodroid_default=yes
1340    with_monotouch_default=yes
1341    with_monotouch_watch_default=yes
1342    with_monotouch_tv_default=yes
1343    with_xammac_default=yes
1344    with_winaot_default=yes
1345    with_orbis_default=yes
1346    with_unreal_default=yes
1347    with_wasm_default=yes
1348    with_testing_aot_full_interp_default=yes
1349    with_testing_aot_hybrid_default=yes
1350    with_testing_aot_full_default=yes
1351    TEST_PROFILE=net_4_x
1352 elif test x$with_runtime_preset = xbitcode; then
1353    DISABLE_MCS_DOCS_default=yes
1354    with_testing_aot_full_default=yes
1355    with_bitcode_default=yes
1356    enable_cooperative_suspend_default=yes
1357    # FIXME: use TEST_PROFILE=testing_aot_full
1358    TEST_PROFILE=testing_aot_bitcode
1359    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1360    enable_llvm_default=yes
1362    mono_feature_disable_com='yes'
1363    mono_feature_disable_remoting='yes'
1364    mono_feature_disable_reflection_emit_save='yes'
1365    mono_feature_disable_reflection_emit='yes'
1366    mono_feature_disable_appdomains='yes'
1368    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1369    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1370    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1371    AOT_MODE="llvmonly"
1372 elif test x$with_runtime_preset = xbitcodeinterp; then
1373    with_testing_aot_full_interp_default=yes
1374    with_bitcode_default=yes
1375    enable_cooperative_suspend_default=yes
1376    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1377    TEST_PROFILE=testing_aot_bitcode_interp
1378    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1379    enable_llvm_default=yes
1381    # mscorlib.dll aot compilation crashes
1382    mono_feature_disable_com='yes'
1384    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1385    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1386    AOT_RUN_FLAGS="--llvmonly-interp"
1387 elif test x$with_runtime_preset = xfullaot; then
1388    DISABLE_MCS_DOCS_default=yes
1389    with_testing_aot_full_default=yes
1390    TEST_PROFILE=testing_aot_full
1392    mono_feature_disable_com='yes'
1393    mono_feature_disable_remoting='yes'
1394    mono_feature_disable_reflection_emit_save='yes'
1395    mono_feature_disable_reflection_emit='yes'
1396    mono_feature_disable_appdomains='yes'
1398    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1399    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1400    AOT_MODE="full"
1401 elif test x$with_runtime_preset = xfullaot_llvm; then
1402    DISABLE_MCS_DOCS_default=yes
1403    with_testing_aot_full_default=yes
1404    TEST_PROFILE=testing_aot_full
1406    mono_feature_disable_com='yes'
1407    mono_feature_disable_remoting='yes'
1408    mono_feature_disable_reflection_emit_save='yes'
1409    mono_feature_disable_reflection_emit='yes'
1410    mono_feature_disable_appdomains='yes'
1412    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1413    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1414    AOT_MODE="full"
1415 elif test x$with_runtime_preset = xhybridaot; then
1416    DISABLE_MCS_DOCS_default=yes
1417    with_testing_aot_hybrid_default=yes
1418    TEST_PROFILE=testing_aot_hybrid 
1420    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1421    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1422 elif test x$with_runtime_preset = xhybridaot_llvm; 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 --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1428    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1429 elif test x$with_runtime_preset = xfullaotinterp; then
1430    with_testing_aot_full_interp_default=yes
1431    TEST_PROFILE=testing_aot_full_interp
1433    # mscorlib.dll aot compilation crashes
1434    mono_feature_disable_com='yes'
1436    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1437    AOT_RUN_FLAGS="--full-aot-interp"
1438 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1439    with_testing_aot_full_interp_default=yes
1440    TEST_PROFILE=testing_aot_full_interp
1442    # mscorlib.dll aot compilation crashes
1443    mono_feature_disable_com='yes'
1445    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1446    AOT_RUN_FLAGS="--full-aot-interp"
1447 elif test x$with_runtime_preset = xaot; then
1448    with_profile4_x_default=yes
1450    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1451    AOT_RUN_FLAGS=""
1453    DISABLE_MCS_DOCS_default=yes
1454 elif test x$with_runtime_preset = xaot_llvm; then
1455    with_profile4_x_default=yes
1457    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1458    AOT_RUN_FLAGS=""
1460    DISABLE_MCS_DOCS_default=yes
1461 elif test x$with_runtime_preset = xwinaot; then
1462    DISABLE_MCS_DOCS_default=yes
1463    with_winaot_default=yes
1464    TEST_PROFILE=winaot
1466    mono_feature_disable_com='yes'
1467    mono_feature_disable_remoting='yes'
1468    mono_feature_disable_reflection_emit_save='yes'
1469    mono_feature_disable_reflection_emit='yes'
1470    mono_feature_disable_appdomains='yes'
1472    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1473    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1474    AOT_MODE="full"
1475 elif test x$with_runtime_preset = xwinaot_llvm; then
1476    DISABLE_MCS_DOCS_default=yes
1477    with_winaot_default=yes
1478    TEST_PROFILE=winaot
1480    mono_feature_disable_com='yes'
1481    mono_feature_disable_remoting='yes'
1482    mono_feature_disable_reflection_emit_save='yes'
1483    mono_feature_disable_reflection_emit='yes'
1484    mono_feature_disable_appdomains='yes'
1486    INVARIANT_AOT_OPTIONS="llvmllc=-mattr=sse4.1,$INVARIANT_AOT_OPTIONS"
1487    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1488    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1489    AOT_MODE="full"
1490 elif test x$with_runtime_preset = xorbis; then
1491    DISABLE_MCS_DOCS_default=yes
1492    with_orbis_default=yes
1493    TEST_PROFILE=orbis
1495    mono_feature_disable_com='yes'
1496    mono_feature_disable_remoting='yes'
1497    mono_feature_disable_reflection_emit_save='yes'
1498    mono_feature_disable_reflection_emit='yes'
1499    mono_feature_disable_appdomains='yes'
1501    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1502    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1503    AOT_MODE="full"
1504 elif test x$with_runtime_preset = xunreal; then
1505    DISABLE_MCS_DOCS_default=yes
1506    with_unreal_default=yes
1507    TEST_PROFILE=unreal
1509    mono_feature_disable_com='yes'
1510    mono_feature_disable_remoting='yes'
1511    mono_feature_disable_appdomains='no'
1513    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1514    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1515 elif test x$with_runtime_preset = xwasm; then
1516    DISABLE_MCS_DOCS_default=yes
1517    with_wasm_default=yes
1518    TEST_PROFILE=wasm
1520    mono_feature_disable_com='yes'
1521    mono_feature_disable_remoting='yes'
1522    mono_feature_disable_reflection_emit_save='yes'
1523    mono_feature_disable_reflection_emit='yes'
1524    mono_feature_disable_appdomains='yes'
1526    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1527    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1528 else
1529    TEST_PROFILE=net_4_x
1530    with_profile4_x_default=yes
1533 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1534    AC_SUBST(AOT_BUILD_FLAGS)
1535    AC_SUBST(AOT_RUN_FLAGS)
1536    # For llvmonlycheck + fullaotcheck
1537    AC_SUBST(INVARIANT_AOT_OPTIONS)
1540 AC_SUBST(TEST_PROFILE)
1542 if test "x$with_profile4_x" = "xdefault"; then
1543    with_profile4_x=$with_profile4_x_default
1545 if test "x$with_monodroid" = "xdefault"; then
1546    with_monodroid=$with_monodroid_default
1548 if test "x$with_monotouch" = "xdefault"; then
1549    with_monotouch=$with_monotouch_default
1551 if test "x$with_monotouch_watch" = "xdefault"; then
1552    with_monotouch_watch=$with_monotouch_watch_default
1554 if test "x$with_monotouch_tv" = "xdefault"; then
1555    with_monotouch_tv=$with_monotouch_tv_default
1557 if test "x$with_bitcode" = "xdefault"; then
1558    with_bitcode=$with_bitcode_default
1560 if test "x$with_xammac" = "xdefault"; then
1561    with_xammac=$with_xammac_default
1563 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1564    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1566 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1567    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1569 if test "x$with_testing_aot_full" = "xdefault"; then
1570    with_testing_aot_full=$with_testing_aot_full_default
1572 if test "x$with_winaot" = "xdefault"; then
1573    with_winaot=$with_winaot_default
1575 if test "x$with_orbis" = "xdefault"; then
1576    with_orbis=$with_orbis_default
1578 if test "x$with_unreal" = "xdefault"; then
1579    with_unreal=$with_unreal_default
1581 if test "x$with_wasm" = "xdefault"; then
1582    with_wasm=$with_wasm_default
1586 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1587 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1588 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1589 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1590 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1591 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1592 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1593 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1594 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1595 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1596 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1597 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1598 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1599 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1600 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1602 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1603 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"])
1604 AM_CONDITIONAL(FULL_AOT_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"] || [test "x$TEST_PROFILE" = "xtesting_aot_bitcode_interp"])
1605 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1607 default_profile=net_4_x
1608 if test -z "$INSTALL_MONODROID_TRUE"; then :
1609    default_profile=monodroid
1611 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1612    default_profile=monotouch
1614 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1615    default_profile=xammac
1617 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1618    default_profile=testing_aot_full_interp
1620 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1621    default_profile=testing_aot_hybrid
1623 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1624    default_profile=testing_aot_full
1626 if test -z "$INSTALL_WINAOT_TRUE"; then :
1627    default_profile=winaot
1629 if test -z "$INSTALL_ORBIS_TRUE"; then :
1630    default_profile=orbis
1632 if test -z "$INSTALL_UNREAL_TRUE"; then :
1633    default_profile=unreal
1635 if test -z "$INSTALL_WASM_TRUE"; then :
1636    default_profile=wasm
1638 if test -z "$INSTALL_4_x_TRUE"; then :
1639    default_profile=net_4_x
1641 DEFAULT_PROFILE=$default_profile
1642 AC_SUBST(DEFAULT_PROFILE)
1645 # End build profile configuration
1648 if test x$USE_NLS = xprofile_default; then
1650         AC_MSG_CHECKING([NLS used])
1652         # We make the default value for USE_NLS
1653         # "no" on OSX because it isn't available on most
1654         # default OSX installs. The most common configurations will
1655         # all disable it, so this saves us typing.
1656         if test x$host_darwin = xyes; then
1657                 USE_NLS=no;
1658         else
1659                 USE_NLS=yes;
1660         fi
1662         AC_SUBST([USE_NLS])
1663         AC_MSG_RESULT([$USE_NLS])
1666 AC_ARG_ENABLE(static-gcc-libs, [  --enable-static-gcc-libs      Statically link GCC support libs (for MinGW32)])
1667 if test "x$enable_static_gcc_libs" = "xyes"; then
1668         # llvm/build.mk doesn't use automake, so make a regular make variable for it.
1669         AC_SUBST(STATIC_GCC_LIBS,1)
1671 AM_CONDITIONAL(ENABLE_STATIC_GCC_LIBS, test "x$enable_static_gcc_libs" = "xyes")
1673 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1674      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1675      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1676          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1678         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1679                 eval "mono_feature_disable_$feature='yes'"
1680         done
1681         DISABLED_FEATURES=$enable_minimal
1682         disabled="Disabled:      $enable_minimal"
1683 ],[])
1685 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1687 if test "x$mono_feature_disable_aot" = "xyes"; then
1688         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1689         enable_system_aot=no
1690         AC_MSG_NOTICE([Disabled AOT compiler])
1693 if test "x$mono_feature_disable_profiler" = "xyes"; then
1694         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1695         AC_MSG_NOTICE([Disabled support for the profiler])
1697 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1699 if test "x$mono_feature_disable_decimal" = "xyes"; then
1700         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1701         AC_MSG_NOTICE([Disabled support for decimal])
1704 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1705         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1706         AC_MSG_NOTICE([Disabled support for P/Invoke])
1709 if test "x$mono_feature_disable_debug" = "xyes"; then
1710         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1711         AC_MSG_NOTICE([Disabled support for runtime debugging])
1714 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1715         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1716         mono_feature_disable_reflection_emit_save=yes
1717         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1720 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1721         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1722         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1725 if test "x$mono_feature_disable_large_code" = "xyes"; then
1726         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1727         AC_MSG_NOTICE([Disabled support for large assemblies])
1730 if test "x$mono_feature_disable_logging" = "xyes"; then
1731         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1732         AC_MSG_NOTICE([Disabled support for logging])
1735 if test "x$mono_feature_disable_com" = "xyes"; then
1736         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1737         AC_MSG_NOTICE([Disabled COM support])
1740 if test "x$mono_feature_disable_ssa" = "xyes"; then
1741         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1742         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1745 if test "x$mono_feature_disable_generics" = "xyes"; then
1746         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1747         AC_MSG_NOTICE([Disabled Generics Support])
1750 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1751         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1752         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1755 if test "x$mono_feature_disable_portability" = "xyes"; then
1756         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1757         AC_MSG_NOTICE([Disabled IO Portability layer])
1760 if test "x$mono_feature_disable_attach" = "xyes"; then
1761         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1762         AC_MSG_NOTICE([Disabled agent attach])
1765 if test "x$mono_feature_disable_verifier" = "xyes"; then
1766         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1767         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1770 if test "x$mono_feature_disable_jit" = "xyes"; then
1771         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1772         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1775 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1777 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1778         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1779         AC_MSG_NOTICE([Disabled the interpreter])
1782 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1784 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1785         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1788 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1790 if test "x$mono_feature_disable_simd" = "xyes"; then
1791         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1792         AC_MSG_NOTICE([Disabled SIMD support])
1795 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1796         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1797         AC_MSG_NOTICE([Disabled Soft Debugger.])
1800 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1802 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1803         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1804         AC_MSG_NOTICE([Disabled Performance Counters.])
1806 if test "x$mono_feature_disable_normalization" = "xyes"; then
1807         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1808         AC_MSG_NOTICE([Disabled String normalization support.])
1811 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1812 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1813         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1814         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1817 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1818         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1819         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1822 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1823         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1824         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1827 if test "x$mono_feature_disable_remoting" = "xyes"; then
1828         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1829         AC_MSG_NOTICE([Disabled remoting])
1832 if test "x$mono_feature_disable_security" = "xyes"; then
1833         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1834         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1837 if test "x$mono_feature_disable_lldb" = "xyes"; then
1838         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1839         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1842 if test "x$mono_feature_disable_mdb" = "xyes"; then
1843         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1844         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1847 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1848         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1849         AC_MSG_NOTICE([Disabled assertion messages.])
1852 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1853         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1854         AC_MSG_NOTICE([Disabled runtime cleanup.])
1857 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1858         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1859         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1863 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1864         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1865         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1868 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1869         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1870         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1873 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1874         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1875         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1878 if test "x$mono_feature_disable_sockets" = "xyes"; then
1879         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1880         AC_MSG_NOTICE([Disabled sockets])
1883 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1884 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1886 has_extension_module=no
1887 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1889         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1890                 if test x$extension = xdefault ; then
1891                         has_extension_module=yes;
1892                 fi
1893         done
1894         if test x$enable_extension_module = xyes; then
1895                 has_extension_module=yes;
1896         fi
1897 ], [])
1899 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1901 if test x$has_extension_module != xno ; then
1902         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1903         AC_MSG_NOTICE([Enabling mono extension module.])
1906 # Deprecated
1907 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1909 AC_MSG_CHECKING(for visibility __attribute__)
1910 AC_COMPILE_IFELSE([
1911         AC_LANG_SOURCE([[
1912                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1913                 int main () { doit (); return 0; }
1914         ]])
1915 ], [
1916    have_visibility_hidden=yes
1917    AC_MSG_RESULT(yes)
1918 ], [
1919    have_visibility_hidden=no
1920    AC_MSG_RESULT(no)
1924 dnl Boehm GC configuration
1927 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1929 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1930 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1932 if test "x$support_boehm" = "xyes"; then
1934         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1935         if test x$enable_parallel_mark = xyes; then
1936                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1937         fi
1939         gc_msg=""
1940         LIBGC_CPPFLAGS=
1941         LIBGC_LIBS=
1942         LIBGC_STATIC_LIBS=
1943         libgc_dir=
1944         case "x$libgc" in
1945                 xincluded)
1946                         if test "x$support_boehm" = "xyes"; then
1947                                 libgc_dir=libgc
1948                         fi
1950                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1951                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1952                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1954                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1956                         if test x$target_win32 = xyes; then
1957                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1958                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1959                         fi
1961                         gc_msg="Included Boehm GC with typed GC"
1962                         if test x$enable_parallel_mark = xyes; then
1963                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1964                                 gc_msg="$gc_msg and parallel mark"
1965                         else
1966                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1967                         fi
1968                         ;;
1970                 xboehm|xbohem|xyes)
1971                         AC_MSG_WARN("External Boehm is no longer supported")
1972                         ;;
1974                 xsgen)
1975                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1976                         ;;
1978                 xnone)
1979                         AC_MSG_WARN("Compiling mono without GC.")
1980                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1981                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1982                         gc_msg="none"
1983                         ;;
1984                 *)
1985                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1986                         ;;
1987         esac
1989         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])
1990         if test "x$large_heap" = "xyes"; then
1991            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1992         fi
1994         AC_SUBST(LIBGC_CPPFLAGS)
1995         AC_SUBST(LIBGC_LIBS)
1996         AC_SUBST(LIBGC_STATIC_LIBS)
1997         AC_SUBST(libgc_dir)
1998         AC_SUBST(BOEHM_DEFINES)
2001 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
2004 dnl End of Boehm GC Configuration
2007 dnl *************************************
2008 dnl *** Checks for zero length arrays ***
2009 dnl *************************************
2010 AC_MSG_CHECKING(whether $CC supports zero length arrays)
2011 AC_TRY_COMPILE([
2012         struct s {
2013                 int  length;
2014                 char data [0];
2015         };
2016 ], [], [
2017         AC_MSG_RESULT(yes)
2018         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
2019 ], [
2020         AC_MSG_RESULT(no)
2021         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
2024 dnl ***********************************
2025 dnl *** Checks for signals
2026 dnl ***********************************
2027 AC_CHECK_HEADERS(signal.h)
2028 AC_CHECK_FUNCS(sigaction)
2029 AC_CHECK_FUNCS(kill)
2030 AC_CHECK_FUNCS(signal)
2032 # signal() is declared inline in Android headers
2033 # so we need to workaround it by overriding the check.
2034 if test x$platform_android = xyes; then
2035         AC_DEFINE(HAVE_SIGNAL,1)
2038 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
2039 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
2041 if test x$host_win32 = xno; then
2042         dnl *************************************
2043         dnl *** Checks for time capabilities ***
2044         dnl *************************************
2046         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
2047         AC_TRY_COMPILE([#include <time.h>], [
2048                 const int foo = CLOCK_MONOTONIC;
2049         ],[
2050                 AC_MSG_RESULT(yes)
2051                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
2052         ], [
2053                 AC_MSG_RESULT(no)
2054         ])
2056         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
2057         AC_TRY_COMPILE([#include <time.h>], [
2058                 const int foo = CLOCK_MONOTONIC_COARSE;
2059         ],[
2060                 AC_MSG_RESULT(yes)
2061                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
2062         ], [
2063                 AC_MSG_RESULT(no)
2064         ])
2066         AC_MSG_CHECKING(for CLOCK_REALTIME)
2067         AC_TRY_COMPILE([#include <time.h>], [
2068                 const int foo = CLOCK_REALTIME;
2069         ],[
2070                 AC_MSG_RESULT(yes)
2071                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
2072         ], [
2073                 AC_MSG_RESULT(no)
2074         ])
2076         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
2077         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
2078         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
2079         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
2080         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
2081         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
2083         dnl hires monotonic clock support
2084         AC_SEARCH_LIBS(clock_gettime, rt)
2085         AC_CHECK_FUNCS(clock_nanosleep)
2087         dnl dynamic loader support
2088         AC_CHECK_FUNC(dlopen, DL_LIB="",
2089                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
2090         )
2091         if test x$dl_support = xno; then
2092                 AC_MSG_WARN([No dynamic loading support available])
2093         else
2094                 LIBS="$LIBS $DL_LIB"
2095                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
2096                 dnl from glib's configure.ac
2097                 AC_CACHE_CHECK([for preceeding underscore in symbols],
2098                         mono_cv_uscore,[
2099                         AC_TRY_RUN([#include <dlfcn.h>
2100                         int mono_underscore_test (void) { return 42; }
2101                         int main() {
2102                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
2103                           handle = dlopen ((void*)0, 0);
2104                           if (handle) {
2105                             f1 = dlsym (handle, "mono_underscore_test");
2106                             f2 = dlsym (handle, "_mono_underscore_test");
2107                           } return (!f2 || f1);
2108                         }],
2109                                 [mono_cv_uscore=yes],
2110                                 [mono_cv_uscore=no],
2111                         [])
2112                 ])
2113                 if test "x$mono_cv_uscore" = "xyes"; then
2114                         MONO_DL_NEED_USCORE=1
2115                 else
2116                         MONO_DL_NEED_USCORE=0
2117                 fi
2118                 AC_SUBST(MONO_DL_NEED_USCORE)
2119                 AC_CHECK_FUNC(dlerror)
2120         fi
2122         dnl ******************************************************************
2123         dnl *** Checks for the IKVM JNI interface library                  ***
2124         dnl ******************************************************************
2125         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])
2127         ikvm_native_dir=
2128         if test x$with_ikvm_native = xyes; then
2129                 ikvm_native_dir=ikvm-native
2130                 jdk_headers_found="IKVM Native"
2131         fi
2133         AC_SUBST(ikvm_native_dir)
2135         AC_CHECK_HEADERS(execinfo.h)
2137         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2139         AC_CHECK_FUNCS(getgrgid_r)
2140         AC_CHECK_FUNCS(getgrnam_r)
2141         AC_CHECK_FUNCS(getresuid)
2142         AC_CHECK_FUNCS(setresuid)
2143         AC_CHECK_FUNCS(kqueue)
2144         AC_CHECK_FUNCS(backtrace_symbols)
2145         AC_CHECK_FUNCS(mkstemp)
2146         AC_CHECK_FUNCS(mmap)
2147         AC_CHECK_FUNCS(madvise)
2148         AC_CHECK_FUNCS(getrusage)
2149         AC_CHECK_FUNCS(getpriority)
2150         AC_CHECK_FUNCS(setpriority)
2151         AC_CHECK_FUNCS(dl_iterate_phdr)
2152         AC_CHECK_FUNCS(dladdr)
2153         AC_CHECK_FUNCS(sysconf)
2154         AC_CHECK_FUNCS(getrlimit)
2155         AC_CHECK_FUNCS(prctl)
2156         AC_CHECK_FUNCS(arc4random)
2157         AC_CHECK_FUNCS(nl_langinfo)
2159         AC_CHECK_FUNCS(sched_getaffinity)
2160         AC_CHECK_FUNCS(sched_setaffinity)
2161         AC_CHECK_FUNCS(sched_getcpu)
2163         if test x$platform_android != xyes; then
2164                 AC_CHECK_FUNCS(getpwnam_r)
2165                 AC_CHECK_FUNCS(getpwuid_r)
2166         fi
2168         AC_CHECK_FUNCS(readlink)
2169         AC_CHECK_FUNCS(chmod)
2170         AC_CHECK_FUNCS(lstat)
2171         AC_CHECK_FUNCS(getdtablesize)
2173         AC_CHECK_FUNCS(ftruncate)
2174         AC_CHECK_FUNCS(msync)
2176         AC_CHECK_FUNCS(gethostname getpeername)
2177         AC_CHECK_FUNCS(utime utimes)
2179         AC_CHECK_FUNCS(openlog closelog)
2180         AC_CHECK_FUNCS(atexit)
2181         AC_CHECK_FUNCS(popen)
2183         AC_FUNC_STRERROR_R()
2185         dnl ****************************************************************
2186         dnl *** Check for sched_setaffinity from glibc versions before   ***
2187         dnl *** 2.3.4. The older versions of the function only take 2    ***
2188         dnl *** parameters, not 3.                                       ***
2189         dnl ***                                                          ***
2190         dnl *** Because the interface change was not made in a minor     ***
2191         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2192         dnl *** won't always indicate the interface sched_affinity has.  ***
2193         dnl ****************************************************************
2194         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2195         AC_TRY_COMPILE([#include <sched.h>], [
2196             int mask = 1; 
2197             sched_setaffinity(0, &mask);
2198         ], [
2199                 # Yes, we have it...
2200                 AC_MSG_RESULT(yes)
2201                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2202         ], [
2203                 # We have the new, three-parameter version
2204                 AC_MSG_RESULT(no)
2205         ])
2206         AC_TRY_COMPILE([#include <sched.h>], [
2207              CPU_COUNT((void *) 0);
2208         ], [
2209                 AC_MSG_RESULT(yes)
2210                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2211         ], [
2212                 # We have the new, three-parameter version
2213                 AC_MSG_RESULT(no)
2214         ])
2216         dnl ******************************************************************
2217         dnl *** Check for large file support                               ***
2218         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2219         dnl ******************************************************************
2220         
2221         # Check that off_t can represent 2**63 - 1 correctly, working around
2222         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2223         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2224         large_offt=no
2225         AC_DEFUN([LARGE_FILES], [
2226                 large_CPPFLAGS=$CPPFLAGS
2227                 CPPFLAGS="$CPPFLAGS $1"
2228                 AC_TRY_COMPILE([
2229                         #include <sys/types.h>
2230                         #include <limits.h>
2231                 ], [
2232                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2233                         #define COMPILE_TIME_ASSERT(pred) \
2234                                 switch(0){case 0:case pred:;}
2235                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2236                 ], [
2237                         AC_MSG_RESULT(ok)
2238                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2239                         large_CPPFLAGS="$large_CPPFLAGS $1"
2240                         large_offt=yes
2241                 ], [
2242                         AC_MSG_RESULT(no)
2243                 ])
2244                 CPPFLAGS=$large_CPPFLAGS
2245         ])
2247         AC_MSG_CHECKING(if off_t is 64 bits wide)
2248         LARGE_FILES("")
2249         if test $large_offt = no; then
2250                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2251                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2252         fi
2253         if test $large_offt = no; then
2254                 AC_MSG_WARN([No 64 bit file size support available])
2255         fi
2256         
2257         dnl *****************************
2258         dnl *** Checks for libsocket  ***
2259         dnl *****************************
2260         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2262         case "$host" in
2263                 *-*-*freebsd*)
2264                         dnl *****************************
2265                         dnl *** Checks for libinotify ***
2266                         dnl *****************************
2267                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2268         esac
2270         dnl *******************************
2271         dnl *** Checks for MSG_NOSIGNAL ***
2272         dnl *******************************
2273         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2274         AC_TRY_COMPILE([#include <sys/socket.h>], [
2275                 int f = MSG_NOSIGNAL;
2276         ], [
2277                 # Yes, we have it...
2278                 AC_MSG_RESULT(yes)
2279                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2280         ], [
2281                 # We'll have to use signals
2282                 AC_MSG_RESULT(no)
2283         ])
2285         dnl *****************************
2286         dnl *** Checks for IPPROTO_IP ***
2287         dnl *****************************
2288         AC_MSG_CHECKING(for IPPROTO_IP)
2289         AC_TRY_COMPILE([#include <netinet/in.h>], [
2290                 int level = IPPROTO_IP;
2291         ], [
2292                 # Yes, we have it...
2293                 AC_MSG_RESULT(yes)
2294                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2295         ], [
2296                 # We'll have to use getprotobyname
2297                 AC_MSG_RESULT(no)
2298         ])
2300         dnl *******************************
2301         dnl *** Checks for IPPROTO_IPV6 ***
2302         dnl *******************************
2303         AC_MSG_CHECKING(for IPPROTO_IPV6)
2304         AC_TRY_COMPILE([#include <netinet/in.h>], [
2305                 int level = IPPROTO_IPV6;
2306         ], [
2307                 # Yes, we have it...
2308                 AC_MSG_RESULT(yes)
2309                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2310         ], [
2311                 # We'll have to use getprotobyname
2312                 AC_MSG_RESULT(no)
2313         ])
2315         dnl ******************************
2316         dnl *** Checks for IPPROTO_TCP ***
2317         dnl ******************************
2318         AC_MSG_CHECKING(for IPPROTO_TCP)
2319         AC_TRY_COMPILE([#include <netinet/in.h>], [
2320                 int level = IPPROTO_TCP;
2321         ], [
2322                 # Yes, we have it...
2323                 AC_MSG_RESULT(yes)
2324                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2325         ], [
2326                 # We'll have to use getprotobyname
2327                 AC_MSG_RESULT(no)
2328         ])
2330         dnl *****************************
2331         dnl *** Checks for SOL_IP     ***
2332         dnl *****************************
2333         AC_MSG_CHECKING(for SOL_IP)
2334         AC_TRY_COMPILE([#include <netdb.h>], [
2335                 int level = SOL_IP;
2336         ], [
2337                 # Yes, we have it...
2338                 AC_MSG_RESULT(yes)
2339                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2340         ], [
2341                 # We'll have to use getprotobyname
2342                 AC_MSG_RESULT(no)
2343         ])
2345         dnl *****************************
2346         dnl *** Checks for SOL_IPV6     ***
2347         dnl *****************************
2348         AC_MSG_CHECKING(for SOL_IPV6)
2349         AC_TRY_COMPILE([#include <netdb.h>], [
2350                 int level = SOL_IPV6;
2351         ], [
2352                 # Yes, we have it...
2353                 AC_MSG_RESULT(yes)
2354                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2355         ], [
2356                 # We'll have to use getprotobyname
2357                 AC_MSG_RESULT(no)
2358         ])
2360         dnl *****************************
2361         dnl *** Checks for SOL_TCP    ***
2362         dnl *****************************
2363         AC_MSG_CHECKING(for SOL_TCP)
2364         AC_TRY_COMPILE([#include <netdb.h>], [
2365                 int level = SOL_TCP;
2366         ], [
2367                 # Yes, we have it...
2368                 AC_MSG_RESULT(yes)
2369                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2370         ], [
2371                 # We'll have to use getprotobyname
2372                 AC_MSG_RESULT(no)
2373         ])
2375         dnl *****************************
2376         dnl *** Checks for IP_PKTINFO ***
2377         dnl *****************************
2378         AC_MSG_CHECKING(for IP_PKTINFO)
2379         AC_TRY_COMPILE([#include <linux/in.h>], [
2380                 int level = IP_PKTINFO;
2381         ], [
2382                 # Yes, we have it...
2383                 AC_MSG_RESULT(yes)
2384                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2385         ], [
2386                 AC_MSG_RESULT(no)
2387         ])
2389         dnl *****************************
2390         dnl *** Checks for IPV6_PKTINFO ***
2391         dnl *****************************
2392         AC_MSG_CHECKING(for IPV6_PKTINFO)
2393         AC_TRY_COMPILE([#include <netdb.h>], [
2394                 int level = IPV6_PKTINFO;
2395         ], [
2396                 # Yes, we have it...
2397                 AC_MSG_RESULT(yes)
2398                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2399         ], [
2400                 AC_MSG_RESULT(no)
2401         ])
2403         dnl **********************************
2404         dnl *** Checks for IP_DONTFRAG     ***
2405         dnl **********************************
2406         AC_MSG_CHECKING(for IP_DONTFRAG)
2407         AC_TRY_COMPILE([#include <netinet/in.h>], [
2408                 int level = IP_DONTFRAG;
2409         ], [
2410                 # Yes, we have it...
2411                 AC_MSG_RESULT(yes)
2412                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2413         ], [
2414                 AC_MSG_RESULT(no)
2415         ])
2417         dnl **********************************
2418         dnl *** Checks for IP_DONTFRAGMENT ***
2419         dnl **********************************
2420         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2421         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2422                 int level = IP_DONTFRAGMENT;
2423         ], [
2424                 # Yes, we have it...
2425                 AC_MSG_RESULT(yes)
2426                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2427         ], [
2428                 AC_MSG_RESULT(no)
2429         ])
2431         dnl **********************************
2432         dnl *** Checks for IP_MTU_DISCOVER ***
2433         dnl **********************************
2434         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2435         AC_TRY_COMPILE([#include <linux/in.h>], [
2436                 int level = IP_MTU_DISCOVER;
2437         ], [
2438                 # Yes, we have it...
2439                 AC_MSG_RESULT(yes)
2440                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2441         ], [
2442                 AC_MSG_RESULT(no)
2443         ])
2445         dnl **********************************
2446         dnl *** Checks for  IP_PMTUDISC_DO ***
2447         dnl **********************************
2448         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2449         AC_TRY_COMPILE([#include <linux/in.h>], [
2450                 int level = IP_PMTUDISC_DO;
2451         ], [
2452                 # Yes, we have it...
2453                 AC_MSG_RESULT(yes)
2454                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2455         ], [
2456                 AC_MSG_RESULT(no)
2457         ])
2459         dnl *********************************
2460         dnl *** Check for struct ip_mreqn ***
2461         dnl *********************************
2462         AC_MSG_CHECKING(for struct ip_mreqn)
2463         AC_TRY_COMPILE([#include <netinet/in.h>], [
2464                 struct ip_mreqn mreq;
2465                 mreq.imr_address.s_addr = 0;
2466         ], [
2467                 # Yes, we have it...
2468                 AC_MSG_RESULT(yes)
2469                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2470         ], [
2471                 # We'll just have to try and use struct ip_mreq
2472                 AC_MSG_RESULT(no)
2473                 AC_MSG_CHECKING(for struct ip_mreq)
2474                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2475                         struct ip_mreq mreq;
2476                         mreq.imr_interface.s_addr = 0;
2477                 ], [
2478                         # Yes, we have it...
2479                         AC_MSG_RESULT(yes)
2480                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2481                 ], [
2482                         # No multicast support
2483                         AC_MSG_RESULT(no)
2484                 ])
2485         ])
2486         
2487         dnl **********************************
2488         dnl *** Check for getaddrinfo ***
2489         dnl **********************************
2490         AC_MSG_CHECKING(for getaddrinfo)
2491                 AC_TRY_LINK([
2492                 #include <stdio.h>
2493                 #include <netdb.h>
2494         ], [
2495                 getaddrinfo(NULL,NULL,NULL,NULL);
2496         ], [
2497                 # Yes, we have it...
2498                 AC_MSG_RESULT(yes)
2499                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2500         ], [
2501                 AC_MSG_RESULT(no)
2502         ])
2504         dnl **********************************
2505         dnl *** Check for gethostbyname2_r ***
2506         dnl **********************************
2507         AC_MSG_CHECKING(for gethostbyname2_r)
2508                 AC_TRY_LINK([
2509                 #include <stdio.h>
2510                 #include <netdb.h>
2511         ], [
2513                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2514         ], [
2515                 # Yes, we have it...
2516                 AC_MSG_RESULT(yes)
2517                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2518         ], [
2519                 AC_MSG_RESULT(no)
2520         ])
2522         dnl **********************************
2523         dnl *** Check for gethostbyname2 ***
2524         dnl **********************************
2525         AC_MSG_CHECKING(for gethostbyname2)
2526                 AC_TRY_LINK([
2527                 #include <stdio.h>
2528                 #include <netdb.h>
2529         ], [
2530                 gethostbyname2(NULL,0);
2531         ], [
2532                 # Yes, we have it...
2533                 AC_MSG_RESULT(yes)
2534                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2535         ], [
2536                 AC_MSG_RESULT(no)
2537         ])
2539         dnl **********************************
2540         dnl *** Check for gethostbyname ***
2541         dnl **********************************
2542         AC_MSG_CHECKING(for gethostbyname)
2543                 AC_TRY_LINK([
2544                 #include <stdio.h>
2545                 #include <netdb.h>
2546         ], [
2547                 gethostbyname(NULL);
2548         ], [
2549                 # Yes, we have it...
2550                 AC_MSG_RESULT(yes)
2551                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2552         ], [
2553                 AC_MSG_RESULT(no)
2554         ])
2556         dnl **********************************
2557         dnl *** Check for getprotobyname ***
2558         dnl **********************************
2559         AC_MSG_CHECKING(for getprotobyname)
2560                 AC_TRY_LINK([
2561                 #include <stdio.h>
2562                 #include <netdb.h>
2563         ], [
2564                 getprotobyname(NULL);
2565         ], [
2566                 # Yes, we have it...
2567                 AC_MSG_RESULT(yes)
2568                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2569         ], [
2570                 AC_MSG_RESULT(no)
2571         ])
2573         dnl **********************************
2574         dnl *** Check for getprotobyname_r ***
2575         dnl **********************************
2576         AC_MSG_CHECKING(for getprotobyname_r)
2577                 AC_TRY_LINK([
2578                 #include <stdio.h>
2579                 #include <netdb.h>
2580         ], [
2581                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2582         ], [
2583                 # Yes, we have it...
2584                 AC_MSG_RESULT(yes)
2585                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2586         ], [
2587                 AC_MSG_RESULT(no)
2588         ])
2590         dnl **********************************
2591         dnl *** Check for getnameinfo ***
2592         dnl **********************************
2593         AC_MSG_CHECKING(for getnameinfo)
2594                 AC_TRY_LINK([
2595                 #include <stdio.h>
2596                 #include <netdb.h>
2597         ], [
2598                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2599         ], [
2600                 # Yes, we have it...
2601                 AC_MSG_RESULT(yes)
2602                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2603         ], [
2604                 AC_MSG_RESULT(no)
2605         ])
2608         dnl **********************************
2609         dnl *** Check for inet_ntop ***
2610         dnl **********************************
2611         AC_MSG_CHECKING(for inet_ntop)
2612                 AC_TRY_LINK([
2613                 #include <stdio.h>
2614                 #include <arpa/inet.h>
2615         ], [
2616                 inet_ntop (0, NULL, NULL, 0);
2617         ], [
2618                 # Yes, we have it...
2619                 AC_MSG_RESULT(yes)
2620                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2621         ], [
2622                 AC_MSG_RESULT(no)
2623         ])
2625         dnl *****************************
2626         dnl *** Checks for libnsl     ***
2627         dnl *****************************
2628         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2630         AC_CHECK_FUNCS(inet_pton inet_aton)
2632         dnl *****************************
2633         dnl *** Checks for libxnet    ***
2634         dnl *****************************
2635         case "${host}" in
2636                 *solaris* )
2637                         AC_MSG_CHECKING(for Solaris XPG4 support)
2638                         if test -f /usr/lib/libxnet.so; then
2639                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2640                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2641                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2642                                 LIBS="$LIBS -lxnet"
2643                                 AC_MSG_RESULT(yes)
2644                         else
2645                                 AC_MSG_RESULT(no)
2646                         fi
2648                         if test "$GCC" = "yes"; then
2649                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2650                         fi
2651                 ;;
2652         esac
2654         dnl *****************************
2655         dnl *** Checks for libpthread ***
2656         dnl *****************************
2657 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2658 # and libpthread does not exist
2660         case "${host}" in
2661                 *-*-*haiku*)
2662                         dnl Haiku has pthread in libroot (libc equiv)
2663                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2664                 ;;
2665                 *-*-*freebsd*)
2666                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2667                 ;;
2668                 *-*-*openbsd*)
2669                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2670                 ;;
2671                 *)
2672                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2673                 ;;
2674         esac
2675         AC_CHECK_HEADERS(pthread.h)
2676         AC_CHECK_HEADERS(pthread_np.h)
2677         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2678         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2679         AC_CHECK_FUNCS(pthread_kill)
2680         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2681         AC_TRY_COMPILE([ #include <pthread.h>], [
2682                 pthread_mutexattr_t attr;
2683                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2684         ], [
2685                 AC_MSG_RESULT(ok)
2686         ], [
2687                 AC_MSG_RESULT(no)
2688                 AC_ERROR(Posix system lacks support for recursive mutexes)
2689         ])
2690         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2691         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2692         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2693         dnl check that pthread_mutexattr_setprotocol is declared
2694         AC_CHECK_DECLS([pthread_mutexattr_setprotocol], [], [], [[#include <pthread.h>]])
2695         AC_CHECK_FUNCS(mincore mlock munlock)
2697         dnl ***********************************
2698         dnl *** Checks for working __thread ***
2699         dnl ***********************************
2700         AC_MSG_CHECKING(for working __thread)
2701         if test "x$with_tls" != "x__thread"; then
2702                 AC_MSG_RESULT(disabled)
2703         elif test "x$cross_compiling" = "xyes"; then
2704                 AC_MSG_RESULT(cross compiling, assuming yes)
2705         else
2706                 AC_TRY_RUN([
2707                         #if defined(__APPLE__) && defined(__clang__)
2708                         #error "__thread does not currently work with clang on Mac OS X"
2709                         #endif
2710                         
2711                         #include <unistd.h>
2712                         #include <pthread.h>
2713                         __thread int i;
2714                         static int res1, res2;
2716                         void thread_main (void *arg)
2717                         {
2718                                 i = arg;
2719                                 sleep (1);
2720                                 if (arg == 1)
2721                                         res1 = (i == arg);
2722                                 else
2723                                         res2 = (i == arg);
2724                         }
2726                         int main () {
2727                                 pthread_t t1, t2;
2729                                 i = 5;
2731                                 pthread_create (&t1, NULL, thread_main, 1);
2732                                 pthread_create (&t2, NULL, thread_main, 2);
2734                                 pthread_join (t1, NULL);
2735                                 pthread_join (t2, NULL);
2737                                 return !(res1 + res2 == 2);
2738                         }
2739                 ], [
2740                                 AC_MSG_RESULT(yes)
2741                 ], [
2742                                 AC_MSG_RESULT(no)
2743                                 with_tls=pthread
2744                 ])
2745         fi
2747         dnl **************************************
2748         dnl *** Checks for working sigaltstack ***
2749         dnl **************************************
2750         AC_MSG_CHECKING(for working sigaltstack)
2751         if test "x$with_sigaltstack" != "xyes"; then
2752                 AC_MSG_RESULT(disabled)
2753         elif test "x$cross_compiling" = "xyes"; then
2754                 AC_MSG_RESULT(cross compiling, assuming no)
2755                 with_sigaltstack=no
2756         else
2757                 AC_TRY_RUN([
2758                         #include <stdio.h>
2759                         #include <stdlib.h>
2760                         #include <unistd.h>
2761                         #include <signal.h>
2762                         #include <pthread.h>
2763                         #include <sys/wait.h>
2764                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2765                         #define SA_STACK SA_ONSTACK
2766                         #endif
2767                         static void
2768                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2769                         {
2770                                 exit (0);
2771                         }
2773                         volatile char*__ptr = NULL;
2774                         static void *
2775                         loop (void *ignored)
2776                         {
2777                                 *__ptr = 0;
2778                                 return NULL;
2779                         }
2781                         static void
2782                         child ()
2783                         {
2784                                 struct sigaction sa;
2785                                 stack_t sas;
2786                                 pthread_t id;
2787                                 pthread_attr_t attr;
2789                                 sa.sa_sigaction = sigsegv_signal_handler;
2790                                 sigemptyset (&sa.sa_mask);
2791                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2792                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2793                                         perror ("sigaction");
2794                                         return;
2795                                 }
2797                                 /* x86 darwin deliver segfaults using SIGBUS */
2798                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2799                                         perror ("sigaction");
2800                                         return;
2801                                 }
2802                                 sas.ss_sp = malloc (SIGSTKSZ);
2803                                 sas.ss_size = SIGSTKSZ;
2804                                 sas.ss_flags = 0;
2805                                 if (sigaltstack (&sas, NULL) == -1) {
2806                                         perror ("sigaltstack");
2807                                         return;
2808                                 }
2810                                 pthread_attr_init (&attr);
2811                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2812                                         printf ("pthread_create\n");
2813                                         return;
2814                                 }
2816                                 sleep (100);
2817                         }
2819                         int
2820                         main ()
2821                         {
2822                                 pid_t son;
2823                                 int status;
2824                                 int i;
2826                                 son = fork ();
2827                                 if (son == -1) {
2828                                         return 1;
2829                                 }
2831                                 if (son == 0) {
2832                                         child ();
2833                                         return 0;
2834                                 }
2836                                 for (i = 0; i < 300; ++i) {
2837                                         waitpid (son, &status, WNOHANG);
2838                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2839                                                 return 0;
2840                                         usleep (10000);
2841                                 }
2843                                 kill (son, SIGKILL);
2844                                 return 1;
2845                         }
2847                 ], [
2848                                 AC_MSG_RESULT(yes)
2849                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2850                 ], [
2851                                 with_sigaltstack=no
2852                                 AC_MSG_RESULT(no)
2853                 ])
2854         fi
2856         dnl ********************************
2857         dnl *** Checks for semaphore lib ***
2858         dnl ********************************
2859         # 'Real Time' functions on Solaris
2860         # posix4 on Solaris 2.6
2861         # pthread (first!) on Linux
2862         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2864         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2865         AC_CHECK_FUNCS(shm_open)
2867         dnl ********************************
2868         dnl ***  Checks for gettext lib  ***
2869         dnl ********************************
2870         # This is needed for some hackery for AIX;
2871         # Mono itself doesn't use it, but DllMap includes it
2872         AC_SEARCH_LIBS([gettext], [intl])
2874         dnl ********************************
2875         dnl *** Checks for timezone stuff **
2876         dnl ********************************
2877         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2878                 AC_TRY_COMPILE([
2879                         #include <time.h>
2880                         ], [
2881                         struct tm tm;
2882                         tm.tm_gmtoff = 1;
2883                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2884         if test $ac_cv_struct_tm_gmtoff = yes; then
2885                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2886         else
2887                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2888                         AC_TRY_COMPILE([
2889                                 #include <time.h>
2890                         ], [
2891                                 timezone = 1;
2892                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2893                 if test $ac_cv_var_timezone = yes; then
2894                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2895                 else
2896                         AC_ERROR(unable to find a way to determine timezone)
2897                 fi
2898         fi
2900         dnl *********************************
2901         dnl *** Checks for math functions ***
2902         dnl *********************************
2903         AC_SEARCH_LIBS(sqrtf, m)
2905         dnl ****************************************************************
2906         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2907         dnl *** have it in the library (duh))                            ***
2908         dnl ****************************************************************
2909         AC_CHECK_FUNCS(poll)
2911         dnl **********************************
2912         dnl *** epoll                      ***
2913         dnl **********************************
2914         AC_CHECK_HEADERS(sys/epoll.h)
2915         haveepoll=no
2916         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2917         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2918                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2919         fi
2921         havekqueue=no
2923         AC_CHECK_HEADERS(sys/event.h)
2924         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2926         dnl **************************************
2927         dnl * Darwin has a race that prevents us from using reliably:
2928         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2929         dnl * Since kqueue is mostly used for scaling large web servers, 
2930         dnl * and very few folks run Mono on large web servers on OSX, falling
2931         dnl * back 
2932         dnl **************************************
2933         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2934                 if test "x$host_darwin" = "xno"; then
2935                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2936                 fi
2937         fi
2939         dnl ******************************
2940         dnl *** Checks for SIOCGIFCONF ***
2941         dnl ******************************
2942         AC_CHECK_HEADERS(sys/ioctl.h)
2943         AC_CHECK_HEADERS(net/if.h, [], [],
2944            [
2945            #ifdef HAVE_SYS_TYPES_H
2946            # include <sys/types.h>
2947            #endif
2948            #ifdef HAVE_SYS_SOCKET_H
2949            # include <sys/socket.h>
2950            #endif
2951            ])
2952         AC_MSG_CHECKING(for ifreq)
2953         AC_TRY_COMPILE([
2954                 #include <stdio.h>
2955                 #include <sys/ioctl.h>
2956                 #include <net/if.h>
2957                 ], [
2958                 struct ifconf ifc;
2959                 struct ifreq *ifr;
2960                 void *x;
2961                 ifc.ifc_len = 0;
2962                 ifc.ifc_buf = NULL;
2963                 x = (void *) &ifr->ifr_addr;
2964                 ],[
2965                         AC_MSG_RESULT(yes)
2966                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2967                 ], [
2968                         AC_MSG_RESULT(no)
2969                 ])
2970         dnl **********************************
2971         dnl ***     Checks for sin_len     ***
2972         dnl **********************************
2973         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2974         AC_TRY_COMPILE([
2975                 #include <netinet/in.h>
2976                 ], [
2977                 struct sockaddr_in saddr;
2978                 saddr.sin_len = sizeof (saddr);
2979                 ],[
2980                         AC_MSG_RESULT(yes)
2981                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2982                 ], [
2983                         AC_MSG_RESULT(no)
2984                 ])      
2985         dnl **********************************
2986         dnl ***    Checks for sin6_len     ***
2987         dnl **********************************
2988         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2989         AC_TRY_COMPILE([
2990                 #include <netinet/in.h>
2991                 ], [
2992                 struct sockaddr_in6 saddr6;
2993                 saddr6.sin6_len = sizeof (saddr6);
2994                 ],[
2995                         AC_MSG_RESULT(yes)
2996                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2997                 ], [
2998                         AC_MSG_RESULT(no)
2999                 ])
3000         dnl **********************************
3001         dnl *** Check for getifaddrs       ***
3002         dnl **********************************
3003         AC_MSG_CHECKING(for getifaddrs)
3004                 AC_TRY_LINK([
3005                 #include <stdio.h>
3006                 #include <sys/types.h>
3007                 #include <sys/socket.h>
3008                 #ifdef HAVE_NET_IF_H
3009                 #include <net/if.h>
3010                 #endif
3011                 #include <ifaddrs.h>
3012         ], [
3013                 getifaddrs(NULL);
3014         ], [
3015                 # Yes, we have it...
3016                 AC_MSG_RESULT(yes)
3017                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
3018         ], [
3019                 AC_MSG_RESULT(no)
3020         ])
3021         dnl **********************************
3022         dnl *** Check for if_nametoindex   ***
3023         dnl **********************************
3024         AC_MSG_CHECKING(for if_nametoindex)
3025                 AC_TRY_LINK([
3026                 #include <stdio.h>
3027                 #include <sys/types.h>
3028                 #include <sys/socket.h>
3029                 #include <net/if.h>
3030         ], [
3031                 if_nametoindex(NULL);
3032         ], [
3033                 # Yes, we have it...
3034                 AC_MSG_RESULT(yes)
3035                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
3036         ], [
3037                 AC_MSG_RESULT(no)
3038         ])
3039         dnl **********************************
3040         dnl *** Check for access ***
3041         dnl **********************************
3042         AC_MSG_CHECKING(for access)
3043                 AC_TRY_LINK([
3044                 #include <unistd.h>
3045         ], [
3046                 access(NULL,0);
3047         ], [
3048                 # Yes, we have it...
3049                 AC_MSG_RESULT(yes)
3050                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
3051         ], [
3052                 AC_MSG_RESULT(no)
3053         ])
3054                         
3055         dnl **********************************
3056         dnl *** Checks for proclib         ***
3057         dnl **********************************
3058         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.)])
3059         dnl **********************************
3060         dnl *** Checks for MonoPosixHelper ***
3061         dnl **********************************
3062         AC_CHECK_HEADERS(checklist.h)
3063         AC_CHECK_HEADERS(pathconf.h)
3064         AC_CHECK_HEADERS(fstab.h)
3065         AC_CHECK_HEADERS(attr/xattr.h)
3066         AC_CHECK_HEADERS(sys/extattr.h)
3067         AC_CHECK_HEADERS(sys/sendfile.h)
3068         AC_CHECK_HEADERS(sys/statvfs.h)
3069         AC_CHECK_HEADERS(sys/statfs.h)
3070         AC_CHECK_HEADERS(sys/vfstab.h)
3071         AC_CHECK_HEADERS(sys/xattr.h)
3072         AC_CHECK_HEADERS(sys/mman.h)
3073         AC_CHECK_HEADERS(sys/param.h)
3074         AC_CHECK_HEADERS(sys/mount.h, [], [],
3075                 [
3076                 #ifdef HAVE_SYS_PARAM_H
3077                 # include <sys/param.h>
3078                 #endif
3079                 ])
3080         AC_CHECK_HEADERS(sys/mount.h)
3081         AC_CHECK_FUNCS(confstr)
3082         AC_CHECK_FUNCS(seekdir telldir)
3083         AC_CHECK_FUNCS(getdomainname)
3084         AC_CHECK_FUNCS(setdomainname)
3085         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
3086         AC_CHECK_FUNCS(setgroups)
3087         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
3088         AC_CHECK_FUNCS(getfsstat)
3089         AC_CHECK_FUNCS(lutimes futimes)
3090         AC_CHECK_FUNCS(mremap)
3091         AC_CHECK_FUNCS(remap_file_pages)
3092         AC_CHECK_FUNCS(posix_fadvise)
3093         AC_CHECK_FUNCS(posix_fallocate)
3094         AC_CHECK_FUNCS(posix_madvise)
3095         AC_CHECK_FUNCS(vsnprintf)
3096         AC_CHECK_FUNCS(sendfile)
3097         AC_CHECK_FUNCS(gethostid sethostid)
3098         AC_CHECK_FUNCS(sethostname)
3099         AC_CHECK_FUNCS(statfs)
3100         AC_CHECK_FUNCS(fstatfs)
3101         AC_CHECK_FUNCS(statvfs)
3102         AC_CHECK_FUNCS(fstatvfs)
3103         AC_CHECK_FUNCS(stime)
3104         AC_CHECK_FUNCS(ttyname_r)
3105         AC_CHECK_FUNCS(psignal)
3106         AC_CHECK_FUNCS(getlogin_r)
3107         AC_CHECK_FUNCS(lockf)
3108         AC_CHECK_FUNCS(swab)
3109         AC_CHECK_FUNCS(setusershell endusershell)
3110         AC_CHECK_FUNCS(futimens utimensat)
3111         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
3112         AC_CHECK_FUNCS(readv writev preadv pwritev)
3113         AC_CHECK_FUNCS(setpgid)
3114         AC_CHECK_FUNCS(system)
3115         AC_CHECK_FUNCS(fork execv execve)
3116         AC_CHECK_FUNCS(waitpid)
3117         AC_CHECK_FUNCS(accept4)
3118         AC_CHECK_FUNCS(localtime_r)
3119         AC_CHECK_FUNCS(mkdtemp)
3120         AC_CHECK_SIZEOF(size_t)
3121         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
3122                 [#include <sys/types.h>
3123                  #include <sys/stat.h>
3124                  #include <unistd.h>])
3125         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
3126                 [#include <sys/types.h>
3127                  #include <sys/stat.h>
3128                  #include <unistd.h>])
3129         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
3130                 [#include <sys/time.h>])
3131         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
3132                 [#include <sys/socket.h>])
3133         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
3134                 [#include <unistd.h>
3135                  #include <fcntl.h>])
3136         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
3137                 [#include <sys/uio.h>])
3138         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
3139                 [#include <sys/socket.h>])
3140         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3141                 [#include <sys/poll.h>])
3142         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3143                 [#include <sys/socket.h>])
3144         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3145                 [#include <sys/socket.h>])
3146         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3147                 [#include <netinet/in.h>])
3148         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3149                 [#include <netinet/in.h>])
3150         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3151                 [#include <sys/un.h>])
3152         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3153                 [#include <sys/types.h>
3154                  #include <sys/stat.h>
3155                  #include <unistd.h>])
3156         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3157                 [#include <time.h>])
3158         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3159                 [#include <sys/time.h>
3160                  #include <sys/types.h>
3161                  #include <utime.h>])
3162         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3163                 [#include <sys/time.h>])
3164         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3165                 [#include <sys/types.h>
3166                  #include <utime.h>])
3167         AC_CHECK_MEMBERS(
3168                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3169                 [#include <sys/types.h>
3170                  #include <dirent.h>])
3171         AC_CHECK_MEMBERS(
3172                 [struct passwd.pw_gecos],,, 
3173                 [#include <sys/types.h>
3174                  #include <pwd.h>])
3175         AC_CHECK_MEMBERS(
3176                 [struct statfs.f_flags],,, 
3177                 [#include <sys/types.h>
3178                  #include <sys/vfs.h>])
3179         AC_CHECK_MEMBERS(
3180                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3181                 [#include <sys/types.h>
3182                  #include <sys/stat.h>
3183                  #include <unistd.h>])
3185         dnl Favour xattr through glibc, but use libattr if we have to
3186         AC_CHECK_FUNC(lsetxattr, ,
3187                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3188         )
3189         AC_SUBST(XATTR_LIB)
3191         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3192         AC_CHECK_MEMBERS(
3193                 [struct kinfo_proc.kp_proc],,, 
3194                 [#include <sys/types.h>
3195                  #include <sys/param.h>
3196                  #include <sys/sysctl.h>
3197                  #include <sys/proc.h>
3198                  ])
3200         dnl *********************************
3201         dnl *** Checks for Windows compilation ***
3202         dnl *********************************
3203         AC_CHECK_HEADERS(sys/time.h)
3204         AC_CHECK_HEADERS(sys/param.h)
3205         AC_CHECK_HEADERS(dirent.h)
3207         dnl ******************************************
3208         dnl *** Checks for OSX and iOS compilation ***
3209         dnl ******************************************
3210         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3212         dnl *********************************
3213         dnl *** Check for Console 2.0 I/O ***
3214         dnl *********************************
3215         AC_CHECK_HEADERS([curses.h])
3216         AC_CHECK_HEADERS([term.h], [], [],
3217         [#if HAVE_CURSES_H
3218          #include <curses.h>
3219          #endif
3220         ])
3221         AC_CHECK_HEADERS([termios.h])
3223         dnl *********************************
3224         dnl *** Checks for random         ***
3225         dnl *********************************
3226         if test x$host_darwin = xno; then
3227                 AC_CHECK_HEADERS(sys/random.h)
3228                 AC_CHECK_FUNCS(getrandom getentropy)
3229         fi
3231         dnl *********************************
3232         dnl *** Checks for Mono.Native    ***
3233         dnl *********************************
3235         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3236         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3238         AC_MSG_CHECKING(for linux/in.h)
3239         AC_TRY_COMPILE([
3240                 #include <sys/socket.h>
3241                 #include <linux/in.h>
3242         ], [
3243         ],[
3244                 AC_MSG_RESULT(yes)
3245                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3246         ], [
3247                 AC_MSG_RESULT(no)
3248         ])
3250         AC_CHECK_HEADERS([linux/if_packet.h])
3252         AC_MSG_CHECKING(for struct in_pktinfo)
3253         AC_TRY_COMPILE([
3254                 #ifdef HAVE_LINUX_IN_H
3255                 #include <sys/socket.h>
3256                 #include <linux/in.h>
3257                 #else
3258                 #include <netinet/in.h>
3259                 #endif
3260         ], [
3261                 struct in_pktinfo pktinfo;
3262         ],[
3263                 AC_MSG_RESULT(yes)
3264                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3265         ], [
3266                 AC_MSG_RESULT(no)
3267         ])
3269         AC_MSG_CHECKING(for struct ip_mreqn)
3270         AC_TRY_COMPILE([
3271                 #if HAVE_LINUX_IN_H
3272                 #include <sys/socket.h>
3273                 #include <linux/in.h>
3274                 #else
3275                 #include <netinet/in.h>
3276                 #endif
3277         ], [
3278                 struct ip_mreqn mreqn;
3279         ],[
3280                 AC_MSG_RESULT(yes)
3281                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3282         ], [
3283                 AC_MSG_RESULT(no)
3284         ])
3286         if test x$host_darwin = xno; then
3287                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3288         fi
3290         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3291         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3293         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3295         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3296         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3297         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3298         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3300         if test "x$mono_native_platform_ios" = "xno"; then
3301                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3302                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3303                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3304         fi
3306         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3307         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3308         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3309         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3310         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
3311         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3312         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3313         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3315         if test "x$platform_android" != "xyes"; then
3316                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3317         fi
3319         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3320         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3321         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3322         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3323         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3324         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3326         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>]])
3327         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>]])
3328         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>]])
3329         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>]])
3330         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3331         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3332         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3334         AC_MSG_CHECKING(for struct statfs)
3335         AC_TRY_COMPILE([
3336                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3337                 #include <sys/mount.h>
3338                 #else
3339                 #include <sys/statfs.h>
3340                 #endif
3341         ], [
3342                 struct statfs;
3343         ],[
3344                 AC_MSG_RESULT(yes)
3345                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3346         ], [
3347                 AC_MSG_RESULT(no)
3348         ])
3350         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3351                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3352         fi
3354         AC_MSG_CHECKING(for readdir_r)
3355         AC_TRY_LINK([
3356                 #include <dirent.h>
3357         ], [
3358                 DIR* dir;
3359                 struct dirent* entry;
3360                 struct dirent* result;
3361                 readdir_r(dir, entry, &result);
3362         ],[
3363                 AC_MSG_RESULT(yes)
3364                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3365         ], [
3366                 AC_MSG_RESULT(no)
3367         ])
3369         AC_MSG_CHECKING(for kevent with void *data)
3370         AC_TRY_LINK([
3371                 #include <sys/types.h>
3372                 #include <sys/event.h>
3373         ], [
3374                 struct kevent event;
3375                 void* data;
3376                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3377         ],[
3378                 AC_MSG_RESULT(yes)
3379                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3380         ], [
3381                 AC_MSG_RESULT(no)
3382         ])
3384         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3385         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3387         AC_MSG_CHECKING(for sendfile with 4 arguments)
3388         AC_TRY_LINK([
3389                 #include <sys/sendfile.h>
3390         ], [
3391                 #if defined(TARGET_ANDROID)
3392                 #if !defined(__ANDROID_API__)
3393                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3394                 #elif __ANDROID_API__ < 21
3395                 #error sendfile is not supported on this Android API level
3396                 #endif
3397                 #endif
3399                 int result = sendfile(0, 0, 0, 0);
3400         ],[
3401                 AC_MSG_RESULT(yes)
3402                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3403         ], [
3404                 AC_MSG_RESULT(no)
3405         ])
3407         ORIG_CFLAGS="$CFLAGS"
3408         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3410         AC_MSG_CHECKING(for sendfile with 6 arguments)
3411         AC_TRY_LINK([
3412                 #include <stdlib.h>
3413                 #include <sys/types.h>
3414                 #include <sys/socket.h>
3415                 #include <sys/uio.h>
3416         ], [
3417                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3418         ],[
3419                 AC_MSG_RESULT(yes)
3420                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3421         ], [
3422                 AC_MSG_RESULT(no)
3423         ])
3425         CFLAGS="$ORIG_CFLAGS"
3427         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3428         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3429         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3430         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3432         ORIG_CFLAGS="$CFLAGS"
3433         CFLAGS="$CFLAGS -Werror=sign-conversion"
3435         AC_MSG_CHECKING(for getnameinfo with signed flags)
3436         AC_TRY_LINK([
3437                 #include <sys/types.h>
3438                 #include <netdb.h>
3439         ], [
3440                 const struct sockaddr *addr;
3441                 socklen_t addrlen;
3442                 char *host;
3443                 socklen_t hostlen;
3444                 char *serv;
3445                 socklen_t servlen;
3446                 int flags;
3447                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3448         ],[
3449                 AC_MSG_RESULT(yes)
3450                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3451         ], [
3452                 AC_MSG_RESULT(no)
3453         ])
3455         CFLAGS="$ORIG_CFLAGS"
3457         if test "x$host_linux" = "xyes"; then
3458                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3459         else
3460                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3461         fi
3463         # HAVE_CLOCK_MONOTONIC check already done above
3464         # HAVE_CLOCK_REALTIME check already done above
3465         # HAVE_MACH_ABSOLUTE_TIME check already done above
3466         # HAVE_MACH_TIMEBASE_INFO check already done above
3467         # HAVE_FUTIMES check already done above
3468         # HAVE_FUTIMENS check already done above
3470         ORIG_CFLAGS="$CFLAGS"
3471         CFLAGS="$CFLAGS -Werror=sign-conversion"
3473         AC_MSG_CHECKING(for bind with unsigned addrlen)
3474         AC_TRY_LINK([
3475                 #include <sys/socket.h>
3476         ], [
3477                 int fd;
3478                 struct sockaddr* addr;
3479                 socklen_t addrLen;
3480                 bind(fd, addr, addrLen);
3481         ],[
3482                 AC_MSG_RESULT(yes)
3483                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3484         ], [
3485                 AC_MSG_RESULT(no)
3486         ])
3488         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3489         AC_TRY_LINK([
3490                 #include <netinet/in.h>
3491                 #include <netinet/tcp.h>
3492         ], [
3493                 struct ipv6_mreq opt;
3494                 unsigned int index = 0;
3495                 opt.ipv6mr_interface = index;
3496         ],[
3497                 AC_MSG_RESULT(yes)
3498                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3499         ], [
3500                 AC_MSG_RESULT(no)
3501         ])
3503         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3504         AC_TRY_LINK([
3505                 #include <sys/inotify.h>
3506         ], [
3507                 intptr_t fd;
3508                 uint32_t wd;
3509                 int result = inotify_rm_watch(fd, wd);
3510         ],[
3511                 AC_MSG_RESULT(yes)
3512                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3513         ], [
3514                 AC_MSG_RESULT(no)
3515         ])
3517         CFLAGS="$ORIG_CFLAGS"
3519         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3520         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3521                 AC_MSG_RESULT(no)
3522         elif test "x$cross_compiling" = "xyes"; then
3523                 AC_MSG_RESULT(cross compiling, assuming yes)
3524                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3525         else
3526                 AC_TRY_RUN([
3527                         #include <sys/mman.h>
3528                         #include <fcntl.h>
3529                         #include <unistd.h>
3531                         int main ()
3532                         {
3533                         #ifdef __PASE__
3534                                 /* IBM i doesn't implement this and returns SIGILL */
3535                                 return -1;
3536                         #endif
3537                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3538                                 if (fd == -1)
3539                                         return -1;
3541                                 shm_unlink("/mono_configure_shm_open");
3543                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3544                                 //       on at least the current version of Mac OS X
3546                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3547                                         return -1;
3549                                 return 0;
3550                         }
3551                 ],[
3552                         AC_MSG_RESULT(yes)
3553                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3554                 ], [
3555                         AC_MSG_RESULT(no)
3556                 ])
3557         fi
3559         AC_MSG_CHECKING(for getpriority with int who)
3560         AC_TRY_LINK([
3561                 #include <sys/resource.h>
3562         ], [
3563                 int which;
3564                 int who;
3565                 int result = getpriority(which, who);
3566         ],[
3567                 AC_MSG_RESULT(yes)
3568                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3569         ], [
3570                 AC_MSG_RESULT(no)
3571         ])
3573         AC_MSG_CHECKING(for kevent with int parameters)
3574         AC_TRY_LINK([
3575                 #include <sys/types.h>
3576                 #include <sys/event.h>
3577         ], [
3578                 int kg;
3579                 const struct kevent* chagelist;
3580                 int nchanges;
3581                 struct kevent* eventlist;
3582                 int nevents;
3583                 const struct timespec* timeout;
3584                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3585         ],[
3586                 AC_MSG_RESULT(yes)
3587                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3588         ], [
3589                 AC_MSG_RESULT(no)
3590         ])
3592         AC_CHECK_FUNCS(mkstemps)
3593         # AC_CHECK_FUNCS(mkstemp) # already done above
3595         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3596                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3597         fi
3599         AC_MSG_CHECKING(for tcp/var.h)
3600         AC_TRY_LINK([
3601                 #include <sys/types.h>
3602                 #include <sys/socketvar.h>
3603                 #include <netinet/ip.h>
3604                 #include <netinet/tcp.h>
3605                 #include <netinet/tcp_var.h>
3606         ], [
3607         ],[
3608                 AC_MSG_RESULT(yes)
3609                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3610         ], [
3611                 AC_MSG_RESULT(no)
3612         ])
3614         AC_CHECK_HEADERS([sys/cdefs.h])
3616         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3617         AC_TRY_LINK([
3618                 #ifdef HAVE_SYS_CDEFS_H
3619                 #include <sys/cdefs.h>
3620                 #endif
3621                 #include <netinet/tcp.h>
3622         ], [
3623                 int result = TCP_ESTABLISHED;
3624         ],[
3625                 AC_MSG_RESULT(yes)
3626                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3627         ], [
3628                 AC_MSG_RESULT(no)
3629         ])
3631         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3633         AC_MSG_CHECKING(for struct rt_msghdr)
3634         AC_TRY_COMPILE([
3635                 #include <sys/types.h>
3636                 #include <net/route.h>
3637         ], [
3638                 struct rt_msghdr;
3639         ],[
3640                 AC_MSG_RESULT(yes)
3641                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3642         ], [
3643                 AC_MSG_RESULT(no)
3644         ])
3646         AC_CHECK_HEADERS([sys/sysctl.h])
3647         AC_CHECK_HEADERS([linux/rtnetlink.h])
3649         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3650         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3651         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3653         ORIG_CFLAGS="$CFLAGS"
3654         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3656         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3657         AC_TRY_LINK([
3658                 #include <unistd.h>
3659         ], [
3660                 size_t namelen = 20;
3661                 char name[20];
3662                 int result = getdomainname(name, namelen);
3663         ],[
3664                 AC_MSG_RESULT(yes)
3665                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3666         ], [
3667                 AC_MSG_RESULT(no)
3668         ])
3670         CFLAGS="$ORIG_CFLAGS"
3672         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3673         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3674         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3676         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
3677                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3678         elif test "x$host_linux" = "xyes"; then
3679                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3680         fi
3682         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3683         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3684         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3685         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3687         enable_gss=no;
3688         AC_MSG_CHECKING(for GSS/GSS.h)
3689         AC_TRY_COMPILE([
3690                         #include <GSS/GSS.h>
3691         ], [
3692         ],[
3693                         AC_MSG_RESULT(yes)
3694                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3695                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3696                         enable_gss=yes
3697         ], [
3698                         AC_MSG_RESULT(no)
3699         ])
3701         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3702         AC_TRY_COMPILE([
3703                         #include <gssapi/gssapi_ext.h>
3704         ], [
3705         ],[
3706                         AC_MSG_RESULT(yes)
3707                         enable_gss=yes
3708         ], [
3709                         AC_MSG_RESULT(no)
3710         ])
3712         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3713         AC_TRY_COMPILE([
3714                         #include <gssapi/gssapi_ext.h>
3715                         #include <gssapi/gssapi_krb5.h>
3716                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3717         ], [
3718         ],[
3719                         AC_MSG_RESULT(yes)
3720                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3721         ], [
3722                         AC_MSG_RESULT(no)
3723         ])
3725         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3727         AC_CHECK_HEADERS([crt_externs.h])
3729         AC_MSG_CHECKING(for _NSGetEnviron)
3730         AC_TRY_LINK([
3731                 #include <crt_externs.h>
3732         ], [
3733                 char **result = *(_NSGetEnviron());
3734         ],[
3735                 AC_MSG_RESULT(yes)
3736                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3737         ], [
3738                 AC_MSG_RESULT(no)
3739         ])
3741         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3743         # *** End of Mono.Native checks ***
3744 else
3745         AM_CONDITIONAL(ENABLE_GSS, false)
3747         dnl *********************************
3748         dnl *** Checks for Windows compilation ***
3749         dnl *********************************
3750         AC_CHECK_HEADERS(winternl.h)
3752         jdk_headers_found=no
3753         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3754         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3755         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3756         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3757         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3758         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3759         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3761         dnl *********************************
3762         dnl *** Check for struct ip_mreqn ***
3763         dnl *********************************
3764         AC_MSG_CHECKING(for struct ip_mreqn)
3765         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3766                 struct ip_mreqn mreq;
3767                 mreq.imr_address.s_addr = 0;
3768         ], [
3769                 # Yes, we have it...
3770                 AC_MSG_RESULT(yes)
3771                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3772         ], [
3773                 # We'll just have to try and use struct ip_mreq
3774                 AC_MSG_RESULT(no)
3775                 AC_MSG_CHECKING(for struct ip_mreq)
3776                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3777                         struct ip_mreq mreq;
3778                         mreq.imr_interface.s_addr = 0;
3779                 ], [
3780                         # Yes, we have it...
3781                         AC_MSG_RESULT(yes)
3782                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3783                 ], [
3784                         # No multicast support
3785                         AC_MSG_RESULT(no)
3786                 ])
3787         ])
3789         dnl **********************************
3790         dnl *** Check for getaddrinfo ***
3791         dnl **********************************
3792         AC_MSG_CHECKING(for getaddrinfo)
3793                 AC_TRY_LINK([
3794                 #include <stdio.h>
3795                 #include <winsock2.h>
3796                 #include <ws2tcpip.h>
3797         ], [
3798                 getaddrinfo(NULL,NULL,NULL,NULL);
3799         ], [
3800                 # Yes, we have it...
3801                 AC_MSG_RESULT(yes)
3802                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3803         ], [
3804                 AC_MSG_RESULT(no)
3805         ])
3807         dnl **********************************
3808         dnl *** Check for gethostbyname ***
3809         dnl **********************************
3810         AC_MSG_CHECKING(for gethostbyname)
3811                 AC_TRY_LINK([
3812                 #include <stdio.h>
3813                 #include <winsock2.h>
3814                 #include <ws2tcpip.h>
3815         ], [
3816                 gethostbyname(NULL);
3817         ], [
3818                 # Yes, we have it...
3819                 AC_MSG_RESULT(yes)
3820                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3821         ], [
3822                 AC_MSG_RESULT(no)
3823         ])
3825         dnl **********************************
3826         dnl *** Check for getprotobyname ***
3827         dnl **********************************
3828         AC_MSG_CHECKING(for getprotobyname)
3829                 AC_TRY_LINK([
3830                 #include <stdio.h>
3831                 #include <winsock2.h>
3832                 #include <ws2tcpip.h>
3833         ], [
3834                 getprotobyname(NULL);
3835         ], [
3836                 # Yes, we have it...
3837                 AC_MSG_RESULT(yes)
3838                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3839         ], [
3840                 AC_MSG_RESULT(no)
3841         ])
3843         dnl **********************************
3844         dnl *** Check for getnameinfo ***
3845         dnl **********************************
3846         AC_MSG_CHECKING(for getnameinfo)
3847                 AC_TRY_LINK([
3848                 #include <stdio.h>
3849                 #include <winsock2.h>
3850                 #include <ws2tcpip.h>
3851         ], [
3852                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3853         ], [
3854                 # Yes, we have it...
3855                 AC_MSG_RESULT(yes)
3856                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3857         ], [
3858                 AC_MSG_RESULT(no)
3859         ])
3861         dnl **********************************
3862         dnl *** Check for inet_ntop ***
3863         dnl **********************************
3864         AC_MSG_CHECKING(for inet_ntop)
3865                 AC_TRY_LINK([
3866                 #include <stdio.h>
3867                 #include <winsock2.h>
3868                 #include <ws2tcpip.h>
3869         ], [
3870                 inet_ntop (0, NULL, NULL, 0);
3871         ], [
3872                 # Yes, we have it...
3873                 AC_MSG_RESULT(yes)
3874                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3875         ], [
3876                 AC_MSG_RESULT(no)
3877         ])
3879         dnl **********************************
3880         dnl *** Check for inet_pton ***
3881         dnl **********************************
3882         AC_MSG_CHECKING(for inet_pton)
3883                 AC_TRY_LINK([
3884                 #include <stdio.h>
3885                 #include <winsock2.h>
3886                 #include <ws2tcpip.h>
3887         ], [
3888                 #ifndef inet_pton
3889                 (void) inet_pton;
3890                 #endif
3891                 inet_pton (0, NULL, NULL);
3892         ], [
3893                 # Yes, we have it...
3894                 AC_MSG_RESULT(yes)
3895                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3896         ], [
3897                 AC_MSG_RESULT(no)
3898         ])
3900         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3901         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3902         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3903         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3904         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3905         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3906         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3909 dnl socklen_t check
3910 AC_MSG_CHECKING(for socklen_t)
3911 AC_TRY_COMPILE([
3912 #include <sys/types.h>
3913 #include <sys/socket.h>
3915   socklen_t foo;
3917 ac_cv_c_socklen_t=yes
3918         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3919         AC_MSG_RESULT(yes)
3921         AC_MSG_RESULT(no)
3924 AC_CHECK_FUNCS(execvp)
3926 dnl ****************************
3927 dnl *** Look for /dev/random ***
3928 dnl ****************************
3930 AC_MSG_CHECKING([if usage of random device is requested])
3931 AC_ARG_ENABLE(dev-random,
3932 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3933 try_dev_random=$enableval, try_dev_random=yes)
3935 AC_MSG_RESULT($try_dev_random)
3937 case "{$build}" in
3939 dnl IBM i does not have /dev/random, use unblocking only
3941     *-*-os400*)
3942     NAME_DEV_RANDOM="/dev/urandom"
3943     ;;
3945 dnl Win32 does not have /dev/random, they have their own method...
3947     *-mingw*|*-*-cygwin*)
3948     ac_cv_have_dev_random=no
3949     ;;
3951 dnl Everywhere else, it's /dev/random
3953     *)
3954     NAME_DEV_RANDOM="/dev/random"
3955     ;;
3956 esac
3958 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3960 dnl Now check if the device actually exists
3962 if test "x$try_dev_random" = "xyes"; then
3963     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3964     [if test -r "$NAME_DEV_RANDOM" ; then
3965         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3966     if test "x$ac_cv_have_dev_random" = "xyes"; then
3967         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3968     fi
3969 else
3970     AC_MSG_CHECKING(for random device)
3971     ac_cv_have_dev_random=no
3972     AC_MSG_RESULT(has been disabled)
3975 if test "x$host_win32" = "xyes"; then
3976     AC_DEFINE(HAVE_CRYPT_RNG)
3979 if test "x$ac_cv_have_dev_random" = "xno" \
3980     && test "x$host_win32" = "xno"; then
3981     AC_MSG_WARN([[
3983 *** A system-provided entropy source was not found on this system.
3984 *** Because of this, the System.Security.Cryptography random number generator
3985 *** will throw a NotImplemented exception.
3987 *** If you are seeing this message, and you know your system DOES have an
3988 *** entropy collection in place, please report an issue on GitHub and
3989 *** provide information about the system and how to access the random device.
3991 *** Otherwise you can install either egd or prngd and set the environment
3992 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3993 ***]])
3996 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)
3998 AC_MSG_CHECKING([if big-arrays are to be enabled])
3999 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)
4000 if test "x$enable_big_arrays" = "xyes" ; then
4001     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
4002         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
4003     else
4004         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
4005     fi
4007 AC_MSG_RESULT($enable_big_arrays)
4009 dnl **************
4010 dnl *** DTRACE ***
4011 dnl **************
4013 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
4015 if test "x$enable_dtrace" = "xyes"; then
4016    if test "x$has_dtrace" = "xno"; then
4017           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
4018    fi
4019    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
4020    if test "x$DTRACE" = "xno"; then
4021           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
4022           enable_dtrace=no
4023    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
4024           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
4025           enable_dtrace=no
4026    fi
4029 dtrace_g=no
4030 if test "x$enable_dtrace" = "xyes"; then
4031         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
4032         DTRACEFLAGS=
4033         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4034                 case "$host" in
4035                         powerpc-*-darwin*)
4036                         DTRACEFLAGS="-arch ppc64"
4037                         ;;
4038                         i*86-*-darwin*)
4039                         DTRACEFLAGS="-arch x86_64"
4040                         ;;
4041                         *)
4042                         DTRACEFLAGS=-64
4043                         ;;
4044                 esac
4045         else
4046                 case "$host" in
4047                         powerpc-*-darwin*)
4048                         DTRACEFLAGS="-arch ppc"
4049                         ;;
4050                         i*86-*-darwin*)
4051                         DTRACEFLAGS="-arch i386"
4052                         ;;
4053                         *)
4054                         DTRACEFLAGS=-32
4055                         ;;
4056                 esac
4057         fi
4058         AC_SUBST(DTRACEFLAGS)
4059         case "$host" in
4060                 *-*-solaris*)
4061                 dtrace_g=yes
4062                 ;;
4063         esac
4064         AC_CHECK_HEADERS([sys/sdt.h])
4066 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
4067 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
4069 dnl **************************
4070 dnl *** AOT cross offsets  ***
4071 dnl **************************
4073 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
4074     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
4076 dnl **************
4077 dnl ***  LLVM  ***
4078 dnl **************
4080 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
4081 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
4082 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)
4083 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
4084 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
4086 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
4088 if test "x$enable_llvm" = "xdefault"; then
4089    enable_llvm=$enable_llvm_default
4092 enable_llvm_msvc_only="no"
4093 if test "x$enable_llvm" = "xyes"; then
4094         if test "x$host_win32" = "xyes"; then
4095                 if test "x$cross_compiling" = "xno"; then
4096                         case "$target" in
4097                         x86_64*)
4098                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
4099                                 enable_llvm_msvc_only="yes"
4100                                 ;;
4101                         i686*)
4102                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
4103                                 ;;
4104                         esac
4105                 fi
4106                 if test "x$enable_loadedllvm" = "xyes"; then
4107                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
4108                         enable_loadedllvm=no
4109                 fi
4110         fi
4113 internal_llvm="no"
4114 if test "x$enable_llvm" = "xyes"; then
4115         if test "x$with_llvm" != "x"; then
4116                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
4117                 if test x$host_win32 = xyes; then
4118                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
4119                 fi
4120                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
4121                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
4122                 fi
4123         else
4124                 if test x$host_win32 = xyes; then
4125                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
4126                 else
4127                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
4128                 fi
4129                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
4130                         internal_llvm=yes
4131                 fi
4132         fi
4134         LLVM_CODEGEN_LIBS="x86codegen"
4135         case "$target" in
4136         arm*)
4137                 LLVM_CODEGEN_LIBS="armcodegen"
4138                 ;;
4139         aarch64*)
4140                 LLVM_CODEGEN_LIBS="aarch64codegen"
4141                 ;;
4142         powerpc*)
4143                 LLVM_CODEGEN_LIBS="powerpccodegen"
4144                 ;;
4145         esac
4146         if test "x$host" != "x$target"; then
4147                 # No need for jit libs
4148                 LLVM_CODEGEN_LIBS=
4149         fi
4151         AC_SUBST(LLVM_CODEGEN_LIBS)
4152         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4154         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4155                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4156                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4157         fi
4158         if test "x$enable_llvm_msvc_only" != "xyes"; then
4159                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4160         else
4161                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4162         fi
4163 fi # ENABLE_LLVM
4165 # AC_DEFINE necessary for correct restore behavior on Linux
4166 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4167 if test "x$internal_llvm" != "xno"; then
4168         if test "x$enable_llvm_msvc_only" != "xyes"; then
4169                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4170         else
4171                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4172         fi
4175 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4176 if test "x$enable_llvm_asserts" != "xno"; then
4177         if test "x$enable_llvm_msvc_only" != "xyes"; then
4178                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4179         else
4180                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4181         fi
4184 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4186 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4187 if test "x$enable_loadedllvm" = "xyes"; then
4188         if test "x$enable_llvm_msvc_only" != "xyes"; then
4189                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4190         fi
4193 if test "x$enable_llvm" = "xyes"; then
4194         enable_llvm_runtime=yes
4197 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4198 if test "x$enable_llvm_runtime" = "xyes"; then
4199         if test "x$enable_llvm_msvc_only" != "xyes"; then
4200                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4201         else
4202                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4203         fi
4206 TARGET="unknown"
4207 ACCESS_UNALIGNED="yes"
4209 LIBC="libc.so.6"
4210 INTL="libc.so.6"
4211 SQLITE="libsqlite.so.0"
4212 SQLITE3="libsqlite3.so.0"
4213 ODBC="libodbc.so.2"
4214 X11="libX11.so"
4215 GDKX11="libgdk-x11-2.0.so.0"
4216 GTKX11="libgtk-x11-2.0.so.0"
4217 XINERAMA="libXinerama.so.1"
4219 sizeof_register="SIZEOF_VOID_P"
4221 jit_wanted=true
4222 boehm_supported=true
4223 BTLS_SUPPORTED=no
4224 BTLS_PLATFORM=
4226 case "$host" in
4227         wasm32*)
4228                 TARGET=WASM
4229                 arch_target=wasm
4230                 BTLS_SUPPORTED=no
4231                 ACCESS_UNALIGNED="no"
4232                 with_tls=pthread
4233                 target_wasm=yes
4234                 ;;
4235         mips*)
4236                 TARGET=MIPS;
4237                 arch_target=mips;
4238                 with_tls=pthread;
4239                 ACCESS_UNALIGNED="no"
4241                 AC_MSG_CHECKING(for mips n32)
4242                 AC_TRY_COMPILE([],[
4243                 #if _MIPS_SIM != _ABIN32
4244                 #error Not mips n32
4245                 #endif
4246                 ],[
4247                 AC_MSG_RESULT(yes)
4248                 sizeof_register=8
4249                 ],[
4250                 AC_MSG_RESULT(no)
4251                 ])
4252                 ;;
4253         i*86-*-*)
4254                 TARGET=X86;
4255                 arch_target=x86;
4256                 case $host_os in
4257                   solaris*)
4258                         LIBC="libc.so"
4259                         INTL="libintl.so"
4260                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4261                                 TARGET=AMD64
4262                                 arch_target=amd64
4263                         fi
4265                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4266                         # int astruct __attribute__ ((visibility ("hidden")));
4267                         # void foo ()
4268                         # {
4269                         #       void *p = &astruct;
4270                         # }
4271                         # gcc -fPIC --shared -o libfoo.so foo.c
4272                         # yields:
4273                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4274                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4275                         have_visibility_hidden=no
4276                         ;;
4277                   mingw*|cygwin*)
4278                         have_visibility_hidden=no
4279                         BTLS_SUPPORTED=no
4280                         BTLS_PLATFORM=i386
4281                         ;;
4282                   haiku*)
4283                         LIBC=libroot.so
4284                         ;;
4285                   linux*)
4286                         AOT_SUPPORTED="yes"
4287                         BTLS_SUPPORTED=yes
4288                         BTLS_PLATFORM=i386
4289                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4290                         ;;
4291                   darwin*)
4292                         AOT_SUPPORTED="yes"
4293                         BTLS_SUPPORTED=yes
4294                         BTLS_PLATFORM=i386
4295                         ;;
4296                   openbsd*|freebsd*|kfreebsd-gnu*)
4297                         AOT_SUPPORTED="yes"
4298                         BTLS_SUPPORTED=yes
4299                         BTLS_PLATFORM=i386
4300                         ;;
4301                 esac
4302                 ;;
4303         x86_64-*-* | amd64-*-*)
4304                 TARGET=AMD64;
4305                 arch_target=amd64;
4306                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4307                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4308                         sizeof_register=8
4309                 fi
4310                 case $host_os in
4311                   linux*)
4312                         AOT_SUPPORTED="yes"
4313                         BTLS_SUPPORTED=yes
4314                         BTLS_PLATFORM=x86_64
4315                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4316                         ;;
4317                   darwin*)
4318                         AOT_SUPPORTED="yes"
4319                         BTLS_SUPPORTED=yes
4320                         BTLS_PLATFORM=x86_64
4321                         boehm_supported=false
4322                         ;;
4323                   openbsd*|freebsd*|kfreebsd-gnu*)
4324                         AOT_SUPPORTED="yes"
4325                         BTLS_SUPPORTED=yes
4326                         BTLS_PLATFORM=x86_64
4327                         ;;
4328                   mingw*|cygwin*)
4329                         BTLS_SUPPORTED=no
4330                         BTLS_PLATFORM=x86_64
4331                         ;;
4332                 esac
4333                 ;;
4334         sparc*-*-*)
4335                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4336                    TARGET=SPARC64
4337                 else
4338                         TARGET=SPARC
4339                 fi
4340                 arch_target=sparc;
4341                 ACCESS_UNALIGNED="no"
4342                 case $host_os in
4343                   linux*) ;;
4344                   *)
4345                         LIBC="libc.so"
4346                         INTL="libintl.so"
4347                 esac
4348                 if test x"$GCC" = xyes; then
4349                         # We don't support v8 cpus
4350                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4351                 fi
4352                 if test x"$AR" = xfalse; then
4353                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4354                 fi
4355                 ;;
4356         *-mingw*|*-*-cygwin*)
4357                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4358                 have_visibility_hidden=no
4359                 INTL="intl"
4360                 case "$host" in
4361                         x86_64*mingw*)
4362                                 # Old Boehm fails to compile for x86_64-mingw.
4363                                 # It is trivial to fix, but just silently drop it.
4364                                 boehm_supported=false
4365                                 ;;
4366                 esac
4367                 ;;
4368         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4369         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4370         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4371                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4372                         TARGET=POWERPC64;
4373                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4374                         if ! (echo $CC | grep -q -- 'clang'); then
4375                                 CFLAGS="$CFLAGS -mminimal-toc"
4376                         fi
4377                 else
4378                         TARGET=POWERPC;
4379                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4380                 fi
4381                 arch_target=ppc;
4382                 case $host_os in
4383                   aix*|os400*)
4384                         BTLS_SUPPORTED=yes
4385                         BTLS_PLATFORM=powerpc
4386                         ;;
4387                   linux*)
4388                         BTLS_SUPPORTED=yes
4389                         BTLS_PLATFORM=powerpc
4390                         ;;
4391                 esac
4392                 ;;
4393         armv7k-*-darwin*)
4394                 TARGET=ARM;
4395                 TARGET_SYS=WATCHOS
4396                 arch_target=arm;
4397                 arm_fpu=VFP_HARD
4398                 ACCESS_UNALIGNED="no"
4399                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4400                 ;;
4402         arm*-darwin*)
4403                 TARGET=ARM;
4404                 arch_target=arm;
4405                 ACCESS_UNALIGNED="no"
4406                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4407                 ;;
4408         arm*-linux*)
4409                 TARGET=ARM;
4410                 arch_target=arm;
4411                 ACCESS_UNALIGNED="no"
4412                 AOT_SUPPORTED="yes"
4413                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4414                 BTLS_SUPPORTED=yes
4415                 BTLS_PLATFORM=arm
4416                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4417                 case "$target" in
4418                 arm*-linux*-gnueabi)
4419                         BTLS_PLATFORM=armsoft
4420                         ;;
4421                 esac
4422                 ;;
4423         arm*-netbsd*-eabi*)
4424                 TARGET=ARM;
4425                 arch_target=arm;
4426                 ACCESS_UNALIGNED="no"
4427                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4428                 ;;
4429         aarch64-*darwin*ilp32)
4430                 TARGET=ARM6432
4431                 arch_target=arm64
4432                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4433                 sizeof_register=8
4434                 # assuming no other target other than watchOS is using aarch64*darwin triple
4435                 TARGET_SYS=WATCHOS
4436                 ;;
4437         aarch64-*)
4438                 # https://lkml.org/lkml/2012/7/15/133
4439                 TARGET=ARM64
4440                 arch_target=arm64
4441                 boehm_supported=false
4442                 AOT_SUPPORTED="yes"
4443                 BTLS_SUPPORTED=yes
4444                 BTLS_PLATFORM=aarch64
4445                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4446                 ;;
4447         s390x-*-linux*)
4448                 TARGET=S390X;
4449                 arch_target=s390x;
4450                 ACCESS_UNALIGNED="yes"
4451                 BTLS_SUPPORTED=yes
4452                 BTLS_PLATFORM=s390x
4453                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4454                 ;;
4455         riscv32-*)
4456                 TARGET=RISCV32
4457                 ACCESS_UNALIGNED=no
4458                 AOT_SUPPORTED=no
4459                 BTLS_SUPPORTED=yes
4460                 BTLS_PLATFORM=riscv32
4461                 arch_target=riscv32
4462                 boehm_supported=false
4463                 ;;
4464         riscv64*)
4465                 TARGET=RISCV64
4466                 ACCESS_UNALIGNED=no
4467                 AOT_SUPPORTED=no
4468                 BTLS_SUPPORTED=yes
4469                 BTLS_PLATFORM=riscv64
4470                 arch_target=riscv64
4471                 boehm_supported=false
4472                 ;;
4473 esac
4475 HOST=$TARGET
4477 if test "x$host" != "x$target"; then
4478    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4479    enable_mcs_build=no
4480    enable_support_build=no
4481    BTLS_SUPPORTED=no
4482    # Can't use tls, since it depends on the runtime detection of tls offsets
4483    # in mono-compiler.h
4484    with_tls=pthread
4485    target_mach=no
4486    case "$target" in
4487    wasm32*)
4488                 TARGET=WASM
4489                 arch_target=wasm
4490                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4491                 ;;
4492    arm*-darwin*)
4493                 TARGET=ARM;
4494                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4495                 case "$target" in
4496                 armv7k-*)
4497                         arm_fpu=VFP_HARD
4498                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4499                         ;;
4500                 esac            
4501                 ;;
4502    powerpc64-ps3-linux-gnu)
4503                 TARGET=POWERPC64
4504                 arch_target=powerpc64
4505                 AC_DEFINE(TARGET_PS3, 1, [...])
4506                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4507                 # uses this define
4508                 AC_DEFINE(__mono_ppc64__, 1, [...])
4509                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4510                 sizeof_register=8
4511                 target_byte_order=G_BIG_ENDIAN
4512                 ;;
4513    powerpc64-xbox360-linux-gnu)
4514                 TARGET=POWERPC64
4515                 arch_target=powerpc64
4516                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4517                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4518                 # uses this define
4519                 sizeof_register=8
4520                 target_byte_order=G_BIG_ENDIAN
4521                 ;;
4522    arm*-linux-*)
4523                 TARGET=ARM;
4524                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4525                 ;;
4526    arm*-netbsd*-eabi*)
4527                 TARGET=ARM;
4528                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4529                 ;;
4530    i686*-linux-*)
4531                 TARGET=X86;
4532                 ;;
4533    i*86-apple-*)
4534                 TARGET=X86;
4535                 ;;
4536    x86_64*-linux-*)
4537                 TARGET=AMD64;
4538                 ;;
4539    x86_64-ps4-freebsd)
4540                 TARGET=AMD64;
4541                 AC_DEFINE(TARGET_PS4, 1, [...])
4542                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4543                 CPPFLAGS="$CPPFLAGS"
4544                 target_win32=no
4545                 ;;
4546         aarch64*darwin*_ilp32)
4547                 TARGET=ARM6432;
4548                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4549                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4550                 ;;
4551         aarch64-*)
4552                 TARGET=ARM64
4553                 ;;
4554         riscv32*)
4555                 TARGET=RISCV32
4556                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4557                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4558                 arch_target=riscv32
4559                 target_mach=no
4560                 with_tls=pthread
4561                 ;;
4562         riscv64*)
4563                 TARGET=RISCV64
4564                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4565                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4566                 arch_target=riscv64
4567                 target_mach=no
4568                 with_tls=pthread
4569                 ;;
4570         x86_64-google-fuchsia)
4571                 TARGET=AMD64
4572                 target_win32=nop
4573                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
4574                 ;;
4575         *)
4576                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4577         esac
4579         case "$target" in
4580         *-darwin*)
4581                 target_mach=yes
4582                 ;;
4583         *-linux-android*)
4584                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4585                 ;;
4586         esac
4589 case "$TARGET" in
4590 WASM)
4591         AC_DEFINE(TARGET_WASM, 1, [...])
4592         arch_target=wasm
4593         ;;
4594 X86)
4595         AC_DEFINE(TARGET_X86, 1, [...])
4596         arch_target=x86
4597         ;;
4598 AMD64)
4599         AC_DEFINE(TARGET_AMD64, 1, [...])
4600         arch_target=amd64
4601         ;;
4602 ARM)
4603         AC_DEFINE(TARGET_ARM, 1, [...])
4604         arch_target=arm
4605         ACCESS_UNALIGNED="no"
4606         ;;
4607 ARM64|ARM6432)
4608         AC_DEFINE(TARGET_ARM64, 1, [...])
4609         arch_target=arm64
4610         ;;
4611 POWERPC)
4612         AC_DEFINE(TARGET_POWERPC, 1, [...])
4613         ;;
4614 POWERPC64)
4615         AC_DEFINE(TARGET_POWERPC, 1, [...])
4616         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4617         ;;
4618 S390X)
4619         AC_DEFINE(TARGET_S390X, 1, [...])
4620         ;;
4621 MIPS)
4622         AC_DEFINE(TARGET_MIPS, 1, [...])
4623         ;;
4624 SPARC)
4625         AC_DEFINE(TARGET_SPARC, 1, [...])
4626         ;;
4627 SPARC64)
4628         AC_DEFINE(TARGET_SPARC64, 1, [...])
4629         ;;
4630 RISCV32)
4631         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4632         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4633         ;;
4634 RISCV64)
4635         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4636         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4637         ;;
4638 esac
4640 case "$TARGET" in
4641 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4642     target_sizeof_void_p=4
4643     ;;
4644 *64* | S390X)
4645     target_sizeof_void_p=8
4646     ;;
4648     AC_MSG_ERROR([unknown target])
4649     ;;
4650 esac
4652 case "$HOST" in
4653 WASM)
4654         AC_DEFINE(HOST_WASM, 1, [...])
4655         ;;
4656 X86)
4657         AC_DEFINE(HOST_X86, 1, [...])
4658         ;;
4659 AMD64)
4660         AC_DEFINE(HOST_AMD64, 1, [...])
4661         ;;
4662 ARM)
4663         AC_DEFINE(HOST_ARM, 1, [...])
4664         ;;
4665 ARM64)
4666         AC_DEFINE(HOST_ARM64, 1, [...])
4667         ;;
4668 POWERPC)
4669         AC_DEFINE(HOST_POWERPC, 1, [...])
4670         ;;
4671 POWERPC64)
4672         AC_DEFINE(HOST_POWERPC, 1, [...])
4673         AC_DEFINE(HOST_POWERPC64, 1, [...])
4674         ;;
4675 S390X)
4676         AC_DEFINE(HOST_S390X, 1, [...])
4677         ;;
4678 MIPS)
4679         AC_DEFINE(HOST_MIPS, 1, [...])
4680         ;;
4681 SPARC)
4682         AC_DEFINE(HOST_SPARC, 1, [...])
4683         ;;
4684 SPARC64)
4685         AC_DEFINE(HOST_SPARC64, 1, [...])
4686         ;;
4687 RISCV32)
4688         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4689         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4690         ;;
4691 RISCV64)
4692         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4693         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4694         ;;
4695 esac
4697 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4698 case "$HOST" in
4699 X86 | AMD64 | ARM | ARM64)
4700         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4701         ;;
4702 esac
4704 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4705 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4707 dnl *************
4708 dnl *** VTUNE ***
4709 dnl *************
4711 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4712 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4714 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4716 if test "x$enable_vtune" = "xyes"; then
4717         if test "x$with_vtune" = "x"; then
4718                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4719         else
4720                 VTUNE_PATH=$with_vtune
4721         fi
4722         VTUNE_INCLUDE=$VTUNE_PATH/include
4723         case "$TARGET" in
4724         X86)
4725                 VTUNE_LIB=$VTUNE_PATH/lib32
4726                 ;;
4727         AMD64)
4728                 VTUNE_LIB=$VTUNE_PATH/lib64
4729                 ;;
4730         *)
4731                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4732                 ;;
4733         esac
4734         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4735                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4736         fi
4737         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4738                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4739         fi
4741         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4742         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4744         AC_SUBST(VTUNE_LIBS)
4745         AC_SUBST(VTUNE_CFLAGS)
4747 dnl Use GCC atomic ops if they work on the target.
4748 if test x$GCC = "xyes"; then
4749         case $TARGET in
4750         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4751                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4752                 ;;
4753         esac
4756 if test "x$target_mach" = "xyes"; then
4758    if test "x$TARGET_SYS" = "xWATCHOS"; then
4759           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4760           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4761           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4762           BTLS_SUPPORTED=no
4763    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4764           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4765           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4766           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4767           BTLS_SUPPORTED=no
4768           target_ios=yes
4769    else
4770        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4771        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4772        #error fail this for ios
4773        #endif
4774        ], [
4775                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4776           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4777           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4778           target_osx=yes
4779        ], [
4780           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4781           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4782           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4783           BTLS_SUPPORTED=no
4784                   target_ios=yes
4785        ])
4786         fi
4787    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4790 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4792 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4794 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4795    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4796 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4797    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4798 else
4799    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4802 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4804 if test "x$sizeof_register" = "x4"; then
4805   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4806 elif test "x$sizeof_register" = "x8"; then
4807   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4808 else
4809   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4812 if test "x$have_visibility_hidden" = "xyes"; then
4813    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4816 if test "x$have_deprecated" = "xyes"; then
4817    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4820 dnl 
4821 dnl Simple Generational checks (sgen)
4823 SGEN_DEFINES=
4824 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4825 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4826 if test x$buildsgen = xyes; then
4827    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4828    SGEN_DEFINES="-DHAVE_SGEN_GC"
4830         conc_gc_msg=""
4831    if test x$with_sgen_default_concurrent != xno; then
4832        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4833            conc_gc_msg=" (concurrent by default)"
4834    fi
4836    if test "x$gc_msg" = "x"; then
4837       gc_msg="sgen$conc_gc_msg"
4838    else
4839       gc_msg="sgen$conc_gc_msg and $gc_msg"
4840    fi
4842 AC_SUBST(SGEN_DEFINES)
4843 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4845 jit_status="Building and using the JIT"
4847 libsuffix=".so"
4849 case "$host" in
4850      *-*-aix*)
4851         dnl on AIX/PASE, shared libraries can be and usually are inside archives
4852         dnl so, we specify them by libfoo.a(libfoo.so.0) for libtool's conventions,
4853         dnl or libfoo.a(shr[_64].o) for the AIX system convention,
4854         dnl or lib.so[.0](shr[_64].o) for libtool's hybrid convention
4855         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX
4856         LIBC="libc.a(shr_64.o)"
4857         # Thanks, I hate it! This is crumbly, especially the one-liner.
4858         AC_MSG_CHECKING([how to dlopen libintl])
4859         AC_LINK_IFELSE([AC_LANG_SOURCE([
4860                 /* XXX: Check for libintl header/gettext func better? */
4861                 #include <libintl.h>
4863                 int main (void) {
4864                         gettext("Dummy for autoconf");
4865                         return 1;
4866                 }
4867         ])],
4868         [
4869         INTL="$(dump -X64 -Hp conftest$EXEEXT | grep libintl | cut -c 38- | tr -s " " | awk '{print $1"("$2")"}')"
4870         AC_MSG_RESULT([yes, $INTL])
4871         ],
4872         [
4873         INTL="libintl.a(libintl.so.8)"
4874         AC_MSG_RESULT([no, falling back to $INTL])
4875         ])
4876         SQLITE3="libsqlite3.a(libsqlite3.so.0)"
4877         # it's very tempting to set a libsuffix, but it depends on the soname value
4878         ;;
4879      *-*-os400*)
4880         dnl However, IBM's packages for i try to be more "normal" than the AIX world, naming wise.
4881         dnl The library archives has "normal" .so names, but they're members with predictable "shr" names for fat libraries.
4882         LIBC="libc.a(shr_64.o)"
4883         INTL="libintl.so(shr_64.o)"
4884         SQLITE3="libsqlite3.so(shr_64.o)"
4885         # 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
4886         # it may be worth revisiting this in the future
4887         ;;
4888      *-*-darwin*)
4889         libsuffix=".dylib"
4890         LIBC="libc.dylib"
4891         INTL="libintl.dylib"
4892         SQLITE="libsqlite.0.dylib"
4893         SQLITE3="libsqlite3.0.dylib"
4894         X11="libX11.dylib"
4895         GDKX11="libgdk-x11-2.0.dylib"
4896         GTKX11="libgtk-x11-2.0.dylib"
4897         ;;
4898      *-*-*netbsd*)
4899         LIBC="libc.so"
4900         INTL="libintl.so"
4901         SQLITE="libsqlite.so"
4902         SQLITE3="libsqlite3.so"
4903         ;;
4904      *-*-kfreebsd*-gnu)
4905         LIBC="libc.so.0.1"
4906         INTL="libc.so.0.1"
4907         X11="libX11.so.6"
4908         ;;
4909     *-*-*freebsd*)
4910         LIBC="libc.so.7"
4911         INTL="libintl.so"
4912         SQLITE="libsqlite.so"
4913         SQLITE3="libsqlite3.so"
4914         ;;
4915     *-*-*openbsd*)
4916         LIBC="libc.so"
4917         INTL="libintl.so"
4918         SQLITE="libsqlite.so"
4919         SQLITE3="libsqlite3.so"
4920         ;;
4921     *-*-*linux*)
4922         AC_PATH_X
4923         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4924         AC_MSG_CHECKING(for the soname of libX11.so)
4925         for i in $x_libraries $dlsearch_path; do
4926                 for r in 4 5 6; do
4927                         if test -f $i/libX11.so.$r; then
4928                                 X11=libX11.so.$r
4929                                 AC_MSG_RESULT($X11)
4930                         fi
4931                 done
4932         done
4933         
4934         if test "x$X11" = "xlibX11.so"; then
4935                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4936                 X11=libX11.so.6
4937         fi
4938         ;;
4939 esac
4941 AC_SUBST(libsuffix)
4943 ######################################
4944 # EGLIB CHECKS
4945 ######################################
4947 GNUC_PRETTY=
4948 GNUC_UNUSED=
4949 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4950 if test x$GCC = xyes; then
4951    GNUC_UNUSED='__attribute__((__unused__))'
4952    GNUC_NORETURN='__attribute__((__noreturn__))'
4953    case $host_cpu in
4954      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4955    esac
4957 AC_SUBST(GNUC_PRETTY)
4958 AC_SUBST(GNUC_UNUSED)
4959 AC_SUBST(GNUC_NORETURN)
4960 AC_SUBST(BREAKPOINT)
4962 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4964 case $host in
4965 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4966     PATHSEP='\\'
4967     SEARCHSEP=';'
4968     OS="WIN32"
4969     PIDTYPE='void *'
4970     ;;
4972     PATHSEP='/'
4973     SEARCHSEP=':'
4974     OS="UNIX"
4975     PIDTYPE='int'
4976     ;;
4977 esac
4979 case $host in
4980         *-*-solaris*)
4981         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4982         ;;
4983 esac
4985 case $target in
4986 arm*-darwin*|aarch64*-*|riscv*)
4987     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4988     ;;
4989 i*86-*-darwin*)
4990     ORDER=G_LITTLE_ENDIAN
4991     ;;
4992 *-*-haiku*)
4993     LDFLAGS="$LDFLAGS -ltextencoding"
4994     ;;
4995 *-*-openbsd*)
4996     CFLAGS="$CFLAGS -pthread"
4997     LDFLAGS="$LDFLAGS -pthread"
4998     ;;
4999 esac
5001 AC_SUBST(ORDER)
5002 AC_SUBST(PATHSEP)
5003 AC_SUBST(SEARCHSEP)
5004 AC_SUBST(OS)
5005 AC_SUBST(PIDTYPE)
5007 # Defined for all targets/platforms using classic Windows API support.
5008 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
5009 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
5011 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
5012 AC_CHECK_FUNCS(getrlimit)
5013 AC_CHECK_FUNCS(fork execv execve)
5014 AC_CHECK_FUNCS(waitpid)
5016 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
5018 if test x$with_overridable_allocators = xyes; then
5019         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5020   AC_MSG_NOTICE([Overridable allocator support enabled])
5021 else
5022   AC_MSG_NOTICE([Overridable allocator support disabled])
5026 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
5027 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
5028 # removed once support for 10.6 is dropped.
5030 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
5032 if test x$target_osx = xyes; then
5033 AC_CHECK_FUNCS(getpwuid_r)
5034 elif test x$target_ios = xno; then
5035 AC_CHECK_FUNCS(strndup getpwuid_r)
5038 AC_SEARCH_LIBS(sqrtf, m)
5040 # nanosleep may not be part of libc, also search it in other libraries
5041 AC_SEARCH_LIBS(nanosleep, rt)
5043 AC_SEARCH_LIBS(dlopen, dl)
5044 old_ldflags="${LDFLAGS}"
5045 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
5046 if test $lt_cv_prog_gnu_ld = yes; then
5047         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic,-Bsymbolic"
5048 else
5049         case $host in
5050         *-*-aix*|*-*-os400*)
5051                 LDFLAGS="${LDFLAGS} -bsymbolic"
5052                 ;;
5053         *)
5054                 dnl Try to use export-dynamic anyways
5055                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic,-Bsymbolic"
5056                 ;;
5057         esac
5059 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
5060 if test $found_export_dynamic = no; then
5061         LDFLAGS="${old_ldflags}"
5064 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
5065 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
5066 AC_CHECK_LIB(iconv, iconv_open)
5067 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
5068 AC_SUBST(HAVE_ALLOCA_H)
5070 # Get the exact type of size_t, not just its size.
5071 # This is so we can find an exact printf format among u, lu, llu, I64u.
5072 # To avoid warnings about slight mismatches.
5073 # C99 runtime "zu" dependency is being avoided here.
5075 # We have to compile as C++ because C is too lenient
5076 # and lets the wrong thing compile, with warnings.
5078 # Note: "zu" or ifdef <something> have the advantage
5079 # of producing installable "biarch" headers. i.e. one Mac header
5080 # for Mac/x86 and Mac/amd64.
5082 AC_LANG_PUSH(C++)
5084 # Check long before int because it is the overwhelming Unix answer,
5085 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
5087 # long ahead of int also tends to produce biarch-compatible headers except Windows.
5089 AC_MSG_CHECKING(if size_t is unsigned long)
5090 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5091         #include <stddef.h>
5092         unsigned long *a = (size_t*)0;
5093 ])], [
5094         AC_MSG_RESULT(yes)
5095         AC_SUBST(GSIZE_FORMAT, '"lu"')
5096 ], [
5097         AC_MSG_RESULT(no)
5098         AC_MSG_CHECKING(if size_t is unsigned int)
5099         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5100                 #include <stddef.h>
5101                 unsigned *a = (size_t*)0;
5102         ])], [
5103                 AC_MSG_RESULT(yes)
5104                 AC_SUBST(GSIZE_FORMAT, '"u"')
5105         ], [
5106 # At this point the majority of systems have their answer,
5107 # and we descend into non-standard or new-standard territory.
5109 # Check __int64 first because I64 on some systems predates ll, enabling
5110 # new compiler/old runtime interop, and the types always have the same size.
5111                 AC_MSG_RESULT(no)
5112                 AC_MSG_CHECKING(if size_t is unsigned __int64)
5113                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5114                         #include <stddef.h>
5115                         unsigned __int64 *a = (size_t*)0;
5116                 ])], [
5117                         AC_MSG_RESULT(yes)
5118                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
5119                 ], [
5120                         AC_MSG_RESULT(no)
5121                         AC_MSG_CHECKING(if size_t is unsigned long long)
5122                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
5123                                 #include <stddef.h>
5124                                 unsigned long long *a = (size_t*)0;
5125                         ])], [
5126                                 AC_MSG_RESULT(yes)
5127                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
5128                         ], [
5129                                 AC_MSG_RESULT(no)
5130                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
5131                         ] )
5132                 ] )
5133         ] )
5134 ] )
5136 AC_LANG_POP
5138 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
5139 # This provides for an exact match with functions that
5140 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
5141 # uintptr_t is not necessarily the same.
5143 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
5144 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
5146 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
5147    GSIZE="size_t"
5148    GSSIZE="ptrdiff_t"
5149 else
5150    GSIZE="uintptr_t"
5151    GSSIZE="intptr_t"
5154 AC_SUBST(GSIZE)
5155 AC_SUBST(GSSIZE)
5156 AC_SUBST(GSIZE_FORMAT)
5159 # END OF EGLIB CHECKS
5162 AC_ARG_WITH([libgdiplus],
5163         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
5164         [], [with_libgdiplus=installed])
5166 # default install location
5167 libgdiplus_install_loc=libgdiplus${libsuffix}
5168 case "$host" in
5169     *-*-*linux*)
5170     libgdiplus_install_loc=libgdiplus${libsuffix}.0
5171     ;;
5172 esac
5174 case $with_libgdiplus in
5175     no)
5176     libgdiplus_loc=
5177     ;;
5179     installed)
5180     libgdiplus_loc=
5181     if test x$cross_compiling = xno; then
5182         if test x$host_darwin = xyes; then
5183             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
5184             if test -x $a; then
5185               libgdiplus_install_loc=$a
5186               libgdiplus_loc=$a
5187             fi
5188         fi
5189     fi
5190     ;;
5192     yes|sibling)
5193     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5194     ;;
5196     /*) # absolute path, assume it is an install location
5197     libgdiplus_loc=$with_libgdiplus
5198     libgdiplus_install_loc=$with_libgdiplus
5199     ;;
5201     *)
5202     libgdiplus_loc=`pwd`/$with_libgdiplus
5203     ;;
5204 esac
5205 AC_SUBST(libgdiplus_loc)
5206 AC_SUBST(libgdiplus_install_loc)
5208 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)
5209 if test "x$icall_symbol_map" = "xyes"; then
5210    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5213 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5214 if test "x$icall_export" = "xyes"; then
5215    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5218 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5219 if test "x$icall_tables" = "xno"; then
5220    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5223 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5225 if test "x$with_tls" = "x__thread"; then
5226         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5227         # Pass the information to libgc
5228         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5229         AC_MSG_CHECKING(if the tls_model attribute is supported)
5230         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5231                 ], [
5232                         AC_MSG_RESULT(yes)
5233                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5234                 ], [
5235                         AC_MSG_RESULT(no)
5236         ])
5239 if test ${TARGET} = ARM; then
5240         dnl ******************************************
5241         dnl *** Check to see what FPU is available ***
5242         dnl ******************************************
5243         AC_MSG_CHECKING(which FPU to use)
5245         #
5246         # This is a bit tricky:
5247         #
5248         # if (__ARM_PCS_VFP) {
5249         #       /* mfloat-abi=hard == VFP with hard ABI */
5250         # } elif (!__SOFTFP__) {
5251         #       /* mfloat-abi=softfp == VFP with soft ABI */
5252         # } else {
5253         #       /* mfloat-abi=soft == no VFP */
5254         # }
5255         #
5256         # The exception is iOS (w/ GCC) where none of the above
5257         # are defined (but iOS always uses the 'softfp' ABI).
5258         #
5259         # No support for FPA.
5260         #
5262         fpu=NONE
5264         # iOS GCC always uses the 'softfp' ABI.
5265         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5266                 fpu=VFP
5267         fi
5269         # Are we using the 'hard' ABI?
5270         if test x$fpu = xNONE; then
5271                 AC_TRY_COMPILE([], [
5272                         #ifndef __ARM_PCS_VFP
5273                         #error "Float ABI is not 'hard'"
5274                         #endif
5275                 ], [
5276                         fpu=VFP_HARD
5277                 ], [
5278                         fpu=NONE
5279                 ])
5280         fi
5282         # No 'hard' ABI. 'soft' or 'softfp'?
5283         if test x$fpu = xNONE; then
5284                 AC_TRY_COMPILE([], [
5285                         #ifdef __SOFTFP__
5286                         #error "Float ABI is not 'softfp'"
5287                         #endif
5288                 ], [
5289                         fpu=VFP
5290                 ], [
5291                         fpu=NONE
5292                 ])
5293         fi
5295         if test x$arm_fpu != x; then
5296            fpu=$arm_fpu
5297         fi
5299         AC_MSG_RESULT($fpu)
5300         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5301         unset fpu
5303         dnl *********************************************
5304         dnl *** Check which ARM version(s) we can use ***
5305         dnl *********************************************
5306         AC_MSG_CHECKING(which ARM version to use)
5308         AC_TRY_COMPILE([], [
5309                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5310                 #error Not on ARM v5.
5311                 #endif
5312         ], [
5313                 arm_v5=yes
5315                 arm_ver=ARMv5
5316         ], [])
5318         AC_TRY_COMPILE([], [
5319                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5320                 #error Not on ARM v6.
5321                 #endif
5322         ], [
5323                 arm_v5=yes
5324                 arm_v6=yes
5326                 arm_ver=ARMv6
5327         ], [])
5329         AC_TRY_COMPILE([], [
5330                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5331                 #error Not on ARM v7.
5332                 #endif
5333         ], [
5334                 arm_v5=yes
5335                 arm_v6=yes
5336                 arm_v7=yes
5338                 arm_ver=ARMv7
5339         ], [])
5341         AC_MSG_RESULT($arm_ver)
5343         if test x$arm_v5 = xyes; then
5344                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5345                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5346         fi
5348         if test x$arm_v6 = xyes; then
5349                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5350                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5351         fi
5353         if test x$arm_v7 = xyes; then
5354                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5355                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5356         fi
5358         if test x$host_linux = xyes; then
5359                 RID="linux-arm"
5360                 COREARCH="arm"
5361                 if test x$fpu = xNONE; then
5362                         RID="linux-armel"
5363                         COREARCH="armel"
5364                 fi
5365         fi
5368 AC_SUBST(RID)
5369 AC_SUBST(COREARCH)
5370 AC_SUBST(CORETARGETS)
5372 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5373         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5375         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5377         if test x$fpabi = xauto; then
5378                 AC_TRY_COMPILE([], [
5379                         #ifdef __riscv_float_abi_double
5380                         #error "double"
5381                         #endif
5382                 ], [
5383                         fpabi=auto
5384                 ], [
5385                         fpabi=double
5386                 ])
5387         fi
5389         if test x$fpabi = xauto; then
5390                 AC_TRY_COMPILE([], [
5391                         #ifdef __riscv_float_abi_single
5392                         #error "single"
5393                         #endif
5394                 ], [
5395                         fpabi=auto
5396                 ], [
5397                         fpabi=single
5398                 ])
5399         fi
5401         if test x$fpabi = xauto; then
5402                 AC_TRY_COMPILE([], [
5403                         #ifdef __riscv_float_abi_soft
5404                         #error "soft"
5405                         #endif
5406                 ], [
5407                         fpabi=auto
5408                 ], [
5409                         fpabi=soft
5410                 ])
5411         fi
5413         case $fpabi in
5414         double)
5415                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5416                 AC_MSG_RESULT([double-precision])
5417                 ;;
5418         single)
5419                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5420                 AC_MSG_ERROR([single-precision, not supported])
5421                 ;;
5422         soft)
5423                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5424                 AC_MSG_RESULT([soft float])
5425                 ;;
5426         auto)
5427                 AC_MSG_ERROR([unknown])
5428                 ;;
5429         *)
5430                 AC_MSG_ERROR([invalid option: $fpabi])
5431                 ;;
5432         esac
5435 if test ${TARGET} = unknown; then
5436         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5437         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5440 if test "x$platform_android" = "xyes"; then
5441         case "x${TARGET}" in
5442         xARM)
5443                 case "x$arm_ver" in
5444                 xARMv5)
5445                         BTLS_SUPPORTED=yes
5446                         BTLS_PLATFORM=android-armv5
5447                         ;;
5448                 xARMv6)
5449                         BTLS_SUPPORTED=yes
5450                         BTLS_PLATFORM=android-armv6
5451                         ;;
5452                 xARMv7)
5453                         BTLS_SUPPORTED=yes
5454                         BTLS_PLATFORM=android-armv7
5455                         ;;
5456                 *)
5457                         BTLS_SUPPORTED=no
5458                         ;;
5459                 esac
5460                 ;;
5461         xARM64)
5462                 BTLS_SUPPORTED=yes
5463                 BTLS_PLATFORM=android-v8a
5464                 ;;
5465         xX86)
5466                 BTLS_SUPPORTED=yes
5467                 BTLS_PLATFORM=android-x86
5468                 ;;
5469         xAMD64)
5470                 BTLS_SUPPORTED=yes
5471                 BTLS_PLATFORM=android-x64
5472                 ;;
5473         *)
5474                 BTLS_SUPPORTED=no
5475                 ;;
5476         esac
5479 if test ${ACCESS_UNALIGNED} = no; then
5480         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5483 if test x$host_darwin = xyes; then
5484         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5485         AS_IF(
5486                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5487                 [AC_MSG_RESULT([no])],
5488                 [
5489                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5490                         AR_FLAGS="Scru"
5491                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5492                         AC_MSG_RESULT([yes])
5493                 ]
5494         )
5497 case "x$libgc" in
5498         xincluded)
5499                 # Pass CPPFLAGS to libgc configure
5500                 # We should use a separate variable for this to avoid passing useless and
5501                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5502                 # This should be executed late so we pick up the final version of CPPFLAGS
5503                 # The problem with this approach, is that during a reconfigure, the main
5504                 # configure scripts gets invoked with these arguments, so we use separate
5505                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5506                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5507                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5508                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5509                 fi
5510                 # Don't pass -finstrument-for-thread-suspension in, 
5511                 # if these are instrumented it will be very bad news 
5512                 # (infinite recursion, undefined parking behavior, etc)
5513                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5514                 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\""
5515                 if test "x$support_boehm" = "xyes"; then
5516                         AC_CONFIG_SUBDIRS(libgc)
5517                 fi
5518                 ;;
5519 esac
5521 MALLOC_MEMPOOLS=no
5522 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5523         if test x$with_malloc_mempools = xyes; then
5524                 MALLOC_MEMPOOLS=yes
5525                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5526         fi
5530 DISABLE_MCS_DOCS=default
5531 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5532         if test x$with_mcs_docs != xyes; then
5533                 DISABLE_MCS_DOCS=yes
5534         fi
5536 if test -n "$INSTALL_4_x_TRUE"; then :
5537         DISABLE_MCS_DOCS=yes
5539 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5540    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5543 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)],[
5544         if test x$with_lazy_gc_thread_creation != xno ; then
5545                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5546         fi
5547 ], [with_lazy_gc_thread_creation=no])
5549 dnl *****************************
5550 dnl *** Thread suspend policy ***
5551 dnl *****************************
5553 dnl Set a default hybrid or cooperative suspend on some platforms
5555 dnl Coop default is set by the bitcode preset.
5557 dnl If coop isn't on by default, maybe hybrid should be?
5558 if test x$enable_cooperative_suspend_default != xyes; then
5559         case $HOST in
5560         X86 | AMD64)
5561                 dnl Some host/target confusion, there's no host_osx (and
5562                 dnl host_darwin would be true on iOS not just macOS).
5563                 if test x$target_osx = xyes; then
5564                         enable_hybrid_suspend_default=yes
5565                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5566                         enable_hybrid_suspend_default=yes
5567                 fi
5568                 ;;
5569         esac
5572 dnl Now check if there were flags overriding the defaults
5574 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])
5575 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5577 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5578         enable_cooperative_suspend=$with_cooperative_gc
5581 if test x$enable_cooperative_suspend = xdefault; then
5582         enable_cooperative_suspend=$enable_cooperative_suspend_default
5585 if test x$enable_cooperative_suspend != xno; then
5586         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5589 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5591 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])
5593 if test x$enable_hybrid_suspend = xdefault; then
5594    enable_hybrid_suspend=$enable_hybrid_suspend_default
5597 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5598         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5601 if test x$enable_hybrid_suspend != xno ; then
5602         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5605 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5607 dnl End of thread suspend policy
5609 dnl ***************************
5610 dnl *** feature experiments ***
5611 dnl ***************************
5613 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5614 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5616         if test x$enable_experiment != x ; then
5617                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5618         fi
5619         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5620                 eval "mono_experiment_test_enable_$feature='yes'"
5621         done
5623         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5624                 eval "mono_experiment_test_enable_null='yes'"
5625                 true
5626         fi
5628         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5629                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5630         fi
5631 ],[])
5633 dnl **********************
5634 dnl *** checked builds ***
5635 dnl **********************
5637 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],[
5639         if test x$enable_checked_build != x ; then
5640                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5641         fi
5642         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5643                 eval "mono_checked_build_test_enable_$feature='yes'"
5644         done
5646         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5647                 eval "mono_checked_build_test_enable_gc='yes'"
5648                 eval "mono_checked_build_test_enable_metadata='yes'"
5649                 eval "mono_checked_build_test_enable_thread='yes'"
5650                 eval "mono_checked_build_test_enable_private_types='yes'"
5651                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5652         fi
5654         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5655                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5656         fi
5658         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5659                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5660         fi
5662         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5663                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5664         fi
5666         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5667                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5668         fi
5670         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5671                 # Required
5672                 with_overridable_allocators=yes
5673                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5675                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5676         fi
5677 ], [])
5679 dnl End of checked builds
5681 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5683 AC_CHECK_HEADER([malloc.h], 
5684                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5685                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5687 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5688 # instead of libmono-static.a
5689 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5690    LIBMONO_LA=libmini-static.la
5691 else
5692    if test x$buildsgen = xyes; then
5693       LIBMONO_LA=libmonosgen-$API_VER.la
5694    else
5695       LIBMONO_LA=libmonoboehm-$API_VER.la
5696    fi
5698 AC_SUBST(LIBMONO_LA)
5700 dnl **************
5701 dnl ***  Btls  ***
5702 dnl **************
5704 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5705 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5706 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5707 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5708 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5709 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])
5711 if test "x$with_btls_android_api" = "x" ; then
5712         case "$BTLS_PLATFORM" in
5713                 android-armv5)
5714                         with_btls_android_api=16" ;;
5715                 android-armv6)
5716                         with_btls_android_api=16" ;;
5717                 android-armv7)
5718                         with_btls_android_api=16 ;;
5719                 android-v8a)
5720                         with_btls_android_api=21 ;;
5721                 android-x86)
5722                         with_btls_android_api=16 ;;
5723                 android-x64)
5724                         with_btls_android_api=21 ;;
5725         esac
5728 if test "x$enable_btls" = "xno"; then
5729    enable_btls_lib=no
5732 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5734 btls_android=no
5735 if test "x$enable_btls" = "xyes"; then
5736         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5737         if test "x$CMAKE" = "xno"; then
5738                 AC_MSG_ERROR("cmake not found")
5739         fi
5741         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5742         AC_SUBST(BTLS_ROOT)
5744         btls_arch=
5745         btls_cflags=
5746         BTLS_CMAKE_ARGS=
5748         if test "x$host_win32" = "xyes"; then
5749                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5750         fi
5752         case "$BTLS_PLATFORM" in
5753         i386)
5754                 btls_arch=i386
5755                 btls_cflags="-m32"
5756                 case $host_os in
5757                         darwin*)
5758                                 btls_cflags="$btls_cflags -arch i386"
5759                                 ;;
5760                         mingw*|cygwin*)
5761                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5762                                 if test "x$HAVE_YASM" != "xyes"; then
5763                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5764                                 fi
5765                                 ;;
5766                 esac
5767                 ;;
5768         x86_64)
5769                 btls_arch=x86_64
5770                 case $host_os in
5771                         mingw*|cygwin*)
5772                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5773                                 if test "x$HAVE_YASM" != "xyes"; then
5774                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5775                                 fi
5776                                 ;;
5777                 esac
5778                 ;;
5779         arm)
5780                 btls_arch=arm
5781                 btls_cflags="-DOPENSSL_NO_ASM=1"
5782                 ;;
5783         armsoft)
5784                 btls_arch=arm
5785                 btls_cflags="-DOPENSSL_NO_ASM=1"
5786                 ;;
5787         aarch64)
5788                 btls_arch=aarch64
5789                 btls_cflags="-march=armv8-a+crypto"
5790                 ;;
5791         s390x)
5792                 btls_arch=s390x
5793                 ;;
5794         powerpc)
5795                 btls_arch=powerpc
5796                 case $host_os in
5797                         aix*|os400*)
5798                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5799                                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5800                 esac
5801                 ;;
5802         android-armv5)
5803                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5804                 ;;
5805         android-armv6)
5806                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5807                 ;;
5808         android-armv7)
5809                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5810                 ;;
5811         android-v8a)
5812                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5813                 ;;
5814         android-x86)
5815                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5816                 ;;
5817         android-x64)
5818                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5819                 ;;
5820         riscv32)
5821                 btls_arch=riscv32
5822                 ;;
5823         riscv64)
5824                 btls_arch=riscv64
5825                 ;;
5826         *)
5827                 AC_MSG_ERROR(Invalid BTLS platform)
5828         esac
5830         if test "x$platform_android" = "xyes"; then
5831                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5832                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5833                 fi
5835                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5836                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5837                 fi
5839                 btls_android=yes
5840                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5841                 if test "x$with_btls_android_ndk" != "x"; then
5842                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5843                 else
5844                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5845                 fi
5846         fi
5848         if test "x$btls_arch" != "x"; then
5849                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5850         fi
5852         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5853         AC_SUBST(BTLS_ARCH)
5854         AC_SUBST(BTLS_CFLAGS)
5855         AC_SUBST(BTLS_PLATFORM)
5856         AC_SUBST(BTLS_CMAKE_ARGS)
5858         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5859 else
5860         enable_btls=no
5863 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5865 if test x$DISABLE_MCS_DOCS = xyes; then
5866    docs_dir=""
5867 else
5868    docs_dir=docs
5870 AC_SUBST(docs_dir)
5872 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5873 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5874 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5876 libmono_ldflags="$libmono_ldflags $LIBS"
5878 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5879 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5880 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5881 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5882 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5883 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5884 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5885 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5886 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5887 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5888 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5889 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5890 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5891 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5892 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5893 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5894 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5895 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5896 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5897 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5898 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5899 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5900 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5901 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5903 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5905 AC_SUBST(LIBC)
5906 AC_SUBST(INTL)
5907 AC_SUBST(SQLITE)
5908 AC_SUBST(SQLITE3)
5909 AC_SUBST(ODBC)
5910 AC_SUBST(X11)
5911 AC_SUBST(GDKX11)
5912 AC_SUBST(GTKX11)
5913 AC_SUBST(XINERAMA)
5914 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5915 AC_SUBST(arch_target)
5917 #This must always be defined when building the runtime
5918 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5920 mono_build_root=`pwd`
5921 AC_SUBST(mono_build_root)
5923 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5924 if test x$host_win32 = xno; then
5925         if test x$enable_msvc = xyes; then
5926                 echo "Error, --enable-msvc only supported for Windows builds."
5927                 exit 1
5928         fi
5930 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5932 if test "x$enable_msvc" = "xyes"; then
5933         if test "x$support_boehm" = "xyes"; then
5934                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5935                 exit 1
5936         fi
5937         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5938         if test "x$host_cpu" = "xi686"; then
5939                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5940                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5941                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5942                 mono_runtime_wrapper=$mono_runtime
5943         else
5944                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5945                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5946                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5947                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
5948         fi
5949         AC_SUBST(mono_msvc_build_dir)
5950         AC_SUBST(mono_msvc_build_lib_dir)
5951         AC_SUBST(mono_msvc_build_bin_dir)
5952 else
5953         mono_runtime=mono/mini/mono
5954         mono_runtime_wrapper=$mono_runtime
5957 AC_SUBST(mono_runtime)
5958 AC_SUBST(mono_runtime_wrapper)
5960 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.1.0-release/csc.exe
5961 VBCS_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/3.1.0-release/VBCSCompiler.exe
5963 if test $csc_compiler = mcs; then
5964   CSC=$mcs_topdir/class/lib/build/mcs.exe
5965 else
5966   CSC=$CSC_LOCATION
5969 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5971 mono_cfg_root=$mono_build_root/runtime
5972 if test x$host_win32 = xyes; then
5973   if test "x$cross_compiling" = "xno"; then
5974     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5975     CSC=`cygpath -m -a $CSC`
5976     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5977     VBCS_LOCATION=`cygpath -m -a $VBCS_LOCATION`
5978   else
5979     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5980   fi
5981 else
5982   mono_cfg_dir=$mono_cfg_root/etc
5985 if test "x$platform_android" = "xyes"; then
5986   mono_cfg_dir=
5989 AC_SUBST(mono_cfg_dir)
5991 AC_SUBST(CSC)
5993 AC_CONFIG_FILES([po/mcs/Makefile.in])
5995 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5996 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5997 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5999 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
6000 [   depth=../../../..
6001     case $srcdir in
6002     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6003     .) reldir=$depth ;;
6004     *) reldir=$depth/$srcdir ;;
6005     esac
6006     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
6007     cd runtime/etc/mono/1.0
6008     rm -f machine.config
6009     $LN_S $reldir/data/net_1_1/machine.config machine.config
6010     cd $depth
6011 ],[LN_S='$LN_S'])
6013 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
6014 [   depth=../../../..
6015     case $srcdir in
6016     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6017     .) reldir=$depth ;;
6018     *) reldir=$depth/$srcdir ;;
6019     esac
6020     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6021     cd runtime/etc/mono/2.0
6022     rm -f machine.config
6023     $LN_S $reldir/data/net_2_0/machine.config machine.config
6024     cd $depth
6025 ],[LN_S='$LN_S'])
6027 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
6028 [   depth=../../../..
6029     case $srcdir in
6030     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6031     .) reldir=$depth ;;
6032     *) reldir=$depth/$srcdir ;;
6033     esac
6034     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
6035     cd runtime/etc/mono/2.0
6036     rm -f web.config
6037     $LN_S $reldir/data/net_2_0/web.config web.config
6038     cd $depth
6039 ],[LN_S='$LN_S'])
6041 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
6042 [   depth=../../..
6043     case $srcdir in
6044     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6045     .) reldir=$depth ;;
6046     *) reldir=$depth/$srcdir ;;
6047     esac
6048     $ac_aux_dir/install-sh -d runtime/etc/mono/
6049     cd runtime/etc/mono/
6050     rm -f browscap.ini
6051     $LN_S $reldir/data/browscap.ini browscap.ini
6052     cd $depth
6053 ],[LN_S='$LN_S'])
6055 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
6056 [   depth=../../../../..
6057     case $srcdir in
6058     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6059     .) reldir=$depth ;;
6060     *) reldir=$depth/$srcdir ;;
6061     esac
6062     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
6063     cd runtime/etc/mono/2.0/Browsers
6064     rm -f Compat.browser
6065     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6066     cd $depth
6067 ],[LN_S='$LN_S'])
6069 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
6070 [   depth=../../../../..
6071     case $srcdir in
6072     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6073     .) reldir=$depth ;;
6074     *) reldir=$depth/$srcdir ;;
6075     esac
6076     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
6077     cd runtime/etc/mono/4.0/Browsers
6078     rm -f Compat.browser
6079     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6080     cd $depth
6081 ],[LN_S='$LN_S'])
6083 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
6084 [   depth=../../../../..
6085     case $srcdir in
6086     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6087     .) reldir=$depth ;;
6088     *) reldir=$depth/$srcdir ;;
6089     esac
6090     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
6091     cd runtime/etc/mono/4.5/Browsers
6092     rm -f Compat.browser
6093     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
6094     cd $depth
6095 ],[LN_S='$LN_S'])
6097 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
6098 [   depth=../../../..
6099     case $srcdir in
6100     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6101     .) reldir=$depth ;;
6102     *) reldir=$depth/$srcdir ;;
6103     esac
6104     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6105     cd runtime/etc/mono/4.0
6106     rm -f machine.config
6107     $LN_S $reldir/data/net_4_0/machine.config machine.config
6108     cd $depth
6109 ],[LN_S='$LN_S'])
6111 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
6112 [   depth=../../../..
6113     case $srcdir in
6114     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6115     .) reldir=$depth ;;
6116     *) reldir=$depth/$srcdir ;;
6117     esac
6118     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
6119     cd runtime/etc/mono/4.0
6120     rm -f web.config
6121     $LN_S $reldir/data/net_4_0/web.config web.config
6122     cd $depth
6123 ],[LN_S='$LN_S'])
6125 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
6126 [   depth=../../../..
6127     case $srcdir in
6128     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6129     .) reldir=$depth ;;
6130     *) reldir=$depth/$srcdir ;;
6131     esac
6132     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6133     cd runtime/etc/mono/4.5
6134     rm -f machine.config
6135     $LN_S $reldir/data/net_4_5/machine.config machine.config
6136     cd $depth
6137 ],[LN_S='$LN_S'])
6139 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
6140 [   depth=../../../..
6141     case $srcdir in
6142     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
6143     .) reldir=$depth ;;
6144     *) reldir=$depth/$srcdir ;;
6145     esac
6146     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
6147     cd runtime/etc/mono/4.5
6148     rm -f web.config
6149     $LN_S $reldir/data/net_4_5/web.config web.config
6150     cd $depth
6151 ],[LN_S='$LN_S'])
6153 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])
6154 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])
6155 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
6158 # Mono.Native Support
6159 # -------------------
6160 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
6161 # It is built as a stand-alone shared library and not bundled with the runtime because we
6162 # may need to build two different versions of it.
6164 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
6165 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
6167 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
6168 # implementation accordingly.  We build a single `libmono-native` shared library.
6170 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
6172 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
6173 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
6174 # depending on platform.
6176 # We build two versions of the shared library:
6177 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
6178 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
6180 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
6181 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
6182 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
6184 # This can be called by automated tests both to ensure that the library has been correctly installed and also
6185 # to verify that it's the correct version of it.
6188 AC_MSG_CHECKING([Mono.Native support])
6189 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
6190 if test x$disable_mono_native = xyes; then
6191         mono_native=no
6192 elif test x$target_osx = xyes; then
6193         MONO_NATIVE_CC=$CC
6194         MONO_NATIVE_CXX=$CXX
6195         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6196         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6197         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6198         MONO_NATIVE_CFLAGS=$CFLAGS
6199         MONO_NATIVE_LDFLAGS=$LDFLAGS
6201         mono_native=yes
6202         MONO_NATIVE_PLATFORM=macos
6203         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6205         if test x$enable_gss = xyes; then
6206                 MONO_NATIVE_LDFLAGS="$MONO_NATIVE_LDFLAGS -framework GSS"
6207         fi
6209         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6210                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6212         if test x$mono_native_compat = xyes; then
6213                 mono_native_compat=yes
6214                 mono_native_text="Mac OSX (compat + unified v10.12)"
6215                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6216                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6217                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6218                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6219                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6221                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6222                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6223                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6224                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6225                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6226                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6227         else
6228                 mono_native_compat=no
6229                 mono_native_text="Mac OSX"
6230         fi
6231 elif test x$mono_native_platform_ios = xyes; then
6232         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6234         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6235                 if test x$mono_native_ios_sim = xyes; then
6236                         mono_native_ios_target=ios-simulator
6237                         mono_native_text="iOS Simulator"
6238                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6239                 else
6240                         mono_native_ios_target=iphoneos
6241                         mono_native_text="iOS Device"
6242                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6243                 fi
6244                 mono_native_unified_version="10.0"
6245                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6246         ], [
6247                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6248                         if test x$mono_native_ios_sim = xyes; then
6249                                 mono_native_ios_target=tvos-simulator
6250                                 mono_native_text="AppleTV Simulator"
6251                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6252                         else
6253                                 mono_native_ios_target=tvos
6254                                 mono_native_text="AppleTV Device"
6255                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6256                         fi
6257                         mono_native_unified_version="10.0"
6258                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6259                 ], [
6260                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6261                                 if test x$mono_native_ios_sim = xyes; then
6262                                         mono_native_ios_target=watchos-simulator
6263                                         mono_native_text="Apple Watch Simulator"
6264                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6265                                 else
6266                                         mono_native_ios_target=watchos
6267                                         mono_native_text="Apple Watch Device"
6268                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6269                                 fi
6270                                 mono_native_unified_version="5.0"
6271                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6272                         ], [
6273                                 AC_MSG_ERROR([Unknown iOS Target])
6274                         ])
6275                 ])
6276         ])
6278         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6280         if test x$with_bitcode = xyes; then
6281                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6282                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6283         else
6284                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6285         fi
6287         if test x$enable_gss = xyes; then
6288                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6289         fi
6291         MONO_NATIVE_CC=$CC
6292         MONO_NATIVE_CXX=$CXX
6293         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6294         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6295         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6296         MONO_NATIVE_CFLAGS=$CFLAGS
6297         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6299         if test x$mono_native_compat = xyes; then
6300                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6301                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6302                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6303                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6304                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6305                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6307                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6308                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6309                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6310                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6311                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6312                 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"
6313         fi
6315         mono_native=yes
6316         MONO_NATIVE_PLATFORM=ios
6317 elif test x$host_linux = xyes; then
6318         mono_native_text="Linux"
6319         MONO_NATIVE_CC=$CC
6320         MONO_NATIVE_CXX=$CXX
6321         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6322         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6323         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6324         MONO_NATIVE_CFLAGS=$CFLAGS
6325         MONO_NATIVE_LDFLAGS=$LDFLAGS
6327         mono_native=yes
6328         mono_native_compat=no
6329         MONO_NATIVE_PLATFORM=linux
6331         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6332 elif test x$target_wasm = xyes; then
6333         mono_native_text="wasm"
6334         MONO_NATIVE_CC=$CC
6335         MONO_NATIVE_CXX=$CXX
6336         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6337         # The system.native code uses _WASM_ to check for wasm
6338         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6339         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6340         MONO_NATIVE_CFLAGS=$CFLAGS
6341         MONO_NATIVE_LDFLAGS=$LDFLAGS
6343         mono_native=yes
6344         mono_native_compat=no
6345         MONO_NATIVE_PLATFORM=linux
6347         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6348 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6349         mono_native_text="AIX"
6350         MONO_NATIVE_CC=$CC
6351         MONO_NATIVE_CXX=$CXX
6352         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6353         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6354         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6355         MONO_NATIVE_CFLAGS=$CFLAGS
6356         dnl nosymbolic- is a hack in case -G for linking is used, as -G seems
6357         dnl to change the way unresolved symbols work on library load in an
6358         dnl incompatible manner. (as references to runtime functions are
6359         dnl resolved later) Default params otherwise are that, so seems OK.
6360         dnl Likewise, we don't seem to need to cover the entire runtime with
6361         dnl it either, on both AIX and PASE. -brtl from -G does seem to spew
6362         dnl Big Scary TOC Warnings (tm) from the linker, but it doesn't seem
6363         dnl problematic with gcc's -mminimal-toc.
6364         dnl ----
6365         dnl flock in AIX exists in libbsd (not the same as freedesktop.org
6366         dnl libbsd) which Mono.Native needs.
6367         dnl Because of the way that the library is built by default, unresolved
6368         dnl references are kept and resolved at runtime. Often, the dependency
6369         dnl chain means libbsd is loaded anyways, but not necessarily. It's
6370         dnl better to explicitly link it, even though it has it shadows libc's
6371         dnl ioctl with its own. (As for the other unresolved imports, those
6372         dnl should be provided by the Mono runtime loaded.)
6373         MONO_NATIVE_LDFLAGS="$LDFLAGS -lbsd -Wl,-bnosymbolic-"
6375         mono_native=yes
6376         mono_native_compat=no
6377         MONO_NATIVE_PLATFORM=aix
6379         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6380 elif case $host_os in freebsd*) true;; *) false;; esac; then
6381         mono_native_text="FreeBSD"
6382         MONO_NATIVE_CC=$CC
6383         MONO_NATIVE_CXX=$CXX
6384         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6385         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6386         MONO_NATIVE_CFLAGS=$CFLAGS
6387         MONO_NATIVE_LDFLAGS=$LDFLAGS
6389         mono_native=yes
6390         mono_native_compat=no
6391         MONO_NATIVE_PLATFORM=freebsd
6392         AC_MSG_CHECKING([Mono.Native support])
6393         AC_MSG_RESULT(freebsd)
6395         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_FREEBSD"
6396 elif test x$platform_android = xyes; then
6397         mono_native_text="Android"
6398         MONO_NATIVE_CC=$CC
6399         MONO_NATIVE_CXX=$CXX
6400         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6401         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6402         MONO_NATIVE_CFLAGS=$CFLAGS
6403         MONO_NATIVE_LDFLAGS=$LDFLAGS
6404         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6406         mono_native=yes
6407         mono_native_compat=no
6408         MONO_NATIVE_PLATFORM=android
6410         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6411 else
6412         mono_native=no
6413         mono_native_text="no"
6416 AC_MSG_RESULT($mono_native_text)
6418 if test x$mono_native_compat = xyes; then
6419         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6420 else
6421         MONO_NATIVE_LIBRARY_NAME=libmono-native
6424 AC_SUBST(MONO_NATIVE_PLATFORM)
6425 AC_SUBST(MONO_NATIVE_CC)
6426 AC_SUBST(MONO_NATIVE_CXX)
6427 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6428 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6429 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6430 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6431 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6432 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6433 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6434 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6435 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6436 AC_SUBST(MONO_NATIVE_CFLAGS)
6437 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6438 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6439 AC_SUBST(MONO_NATIVE_LDFLAGS)
6440 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6441 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6442 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6443 AC_SUBST(MONO_NATIVE_LIBADD)
6445 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6446 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6447 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6448 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6449 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6450 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6451 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6452 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_FREEBSD, test x$MONO_NATIVE_PLATFORM = xfreebsd)
6454 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6455 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6456 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6457 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6458 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6460 ### C++ Linker selection
6462 # We have to lie to autotools, sometimes.
6464 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6465 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6466 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6467 # except if we're linking with LLVM which relies on it.
6469 # Explanation of the hack:
6471 # According to
6472 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6473 # automake chooses the linker that it used to compile a target based on the
6474 # _SOURCES for that target.  If the target is comprised of only C code, it
6475 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6476 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6477 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6479 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6480 # or libc++) linked in - even when Mono is written in C++, we take care not to
6481 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6482 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6483 # C++ linker - LLVM doesn't have the same restrictions.
6485 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6486 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6487 #  automake's autodetection and lets us use the linker that we want.
6489 if test "x$enable_llvm_runtime" = "xyes"; then
6490         AC_SUBST(MONO_CXXLD, [$CXX])
6491 else
6492         AC_SUBST(MONO_CXXLD, [$CC])
6495 ### Set -Werror options
6497 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6499 if test x"$GCC" = xyes; then
6501         if test "x$with_jemalloc" != "xyes"; then
6503                 # incompatible-pointer-types requires gcc circa 5.x
6505                 ORIG_CFLAGS=$CFLAGS
6506                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6507                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6508                 AC_TRY_COMPILE([],[
6509                 ], [
6510                         AC_MSG_RESULT(yes)
6511                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6512                 ], [
6513                         AC_MSG_RESULT(no)
6514                         CFLAGS=$ORIG_CFLAGS
6515                 ])
6517                 CFLAGS="$CFLAGS -Werror=return-type"
6518         fi
6520         # Implicit function declarations are not 64 bit safe
6521         # Do this late, since this causes lots of configure tests to fail
6522         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6523         # jay has a lot of implicit declarations
6524         JAY_CFLAGS="-Wno-implicit-function-declaration"
6527 AC_SUBST(CFLAGS)
6528 AC_SUBST(CPPFLAGS)
6529 AC_SUBST(LDFLAGS)
6531 # Update all submodules recursively to ensure everything is checked out
6532 if test "x$with_core" != "xonly"; then
6533         (cd $srcdir && scripts/update_submodules.sh)
6536 AC_OUTPUT([
6537 Makefile
6538 mono-uninstalled.pc
6539 acceptance-tests/Makefile
6540 llvm/Makefile
6541 scripts/mono-find-provides
6542 scripts/mono-find-requires
6543 mk/Makefile
6544 mono/Makefile
6545 mono/btls/Makefile
6546 mono/native/Makefile
6547 mono/utils/Makefile
6548 mono/utils/jemalloc/Makefile
6549 mono/metadata/Makefile
6550 mono/dis/Makefile
6551 mono/cil/Makefile
6552 mono/arch/Makefile
6553 mono/arch/x86/Makefile
6554 mono/arch/amd64/Makefile
6555 mono/arch/ppc/Makefile
6556 mono/arch/sparc/Makefile
6557 mono/arch/s390x/Makefile
6558 mono/arch/arm/Makefile
6559 mono/arch/arm64/Makefile
6560 mono/arch/mips/Makefile
6561 mono/arch/riscv/Makefile
6562 mono/sgen/Makefile
6563 mono/native/platform-type.c
6564 mono/native/platform-type-compat.c
6565 mono/native/platform-type-unified.c
6566 mono/tests/Makefile
6567 mono/tests/assembly-load-reference/Makefile
6568 mono/tests/tests-config
6569 mono/tests/gc-descriptors/Makefile
6570 mono/tests/testing_gac/Makefile
6571 mono/tests/fullaot-mixed/Makefile
6572 mono/tests/llvmonly-mixed/Makefile
6573 mono/unit-tests/Makefile
6574 mono/benchmark/Makefile
6575 mono/mini/Makefile
6576 mono/profiler/Makefile
6577 mono/eglib/Makefile
6578 mono/eglib/eglib-config.h
6579 mono/eglib/test/Makefile
6580 m4/Makefile
6581 ikvm-native/Makefile
6582 scripts/Makefile
6583 man/Makefile
6584 docs/Makefile
6585 data/Makefile
6586 data/net_2_0/Makefile
6587 data/net_4_0/Makefile
6588 data/net_4_5/Makefile
6589 data/net_2_0/Browsers/Makefile
6590 data/net_4_0/Browsers/Makefile
6591 data/net_4_5/Browsers/Makefile
6592 data/mint.pc
6593 data/mono-2.pc
6594 data/monosgen-2.pc
6595 data/mono.pc
6596 data/mono-cairo.pc
6597 data/mono-options.pc
6598 data/mono-lineeditor.pc
6599 data/monodoc.pc
6600 data/dotnet.pc
6601 data/dotnet35.pc
6602 data/wcf.pc
6603 data/cecil.pc
6604 data/system.web.extensions_1.0.pc
6605 data/system.web.extensions.design_1.0.pc
6606 data/system.web.mvc.pc
6607 data/system.web.mvc2.pc
6608 data/system.web.mvc3.pc
6609 data/aspnetwebstack.pc
6610 data/reactive.pc
6611 samples/Makefile
6612 support/Makefile
6613 data/config
6614 tools/Makefile
6615 tools/locale-builder/Makefile
6616 tools/sgen/Makefile
6617 tools/pedump/Makefile
6618 runtime/Makefile
6619 msvc/Makefile
6620 po/Makefile
6623 if test x$host_win32 = xyes; then
6624    # Get rid of 'cyg' prefixes in library names
6625    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6626    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6627    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6628    # executable doesn't work...
6629    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6632 if test x$host_darwin = xyes; then
6633    # This doesn't seem to be required and it slows down parallel builds
6634    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6637 AC_MSG_CHECKING([compiler server])
6638 AC_ARG_WITH(compiler-server, [  --with-compiler-server=yes,no,default      Enables or disables compiler server],[
6639    if test x$withval = xyes; then
6640        enable_compiler_server=yes;
6641    elif test x$withval = xno; then
6642        enable_compiler_server=no;
6643    elif test x$withval = xdefault; then
6644        enable_compiler_server=yes;
6645    else
6646        AC_MSG_ERROR([You must supply one of "yes", "no" or "default" to the --with-compiler-server option])
6647    fi
6648 ],[enable_compiler_server=yes])
6650 if test x$enable_compiler_server = xyes; then
6651    if test x$csc_compiler = xmcs; then
6652        AC_MSG_WARN([mcs does not support the compiler server])
6653        enable_compiler_server=no;
6654    fi
6658   case $prefix in
6659   NONE) prefix=$ac_default_prefix ;;
6660   esac
6661   case $exec_prefix in
6662   NONE) exec_prefix='${prefix}' ;;
6663   esac
6665   #
6666   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6667   # any existing config.make.  This allows people to share the same source tree
6668   # with different build directories, one native and one cross
6669   #
6670   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6672     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6674     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6675     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6676     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6677     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6678     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6679     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6680     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6681     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6682     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6683     echo "VERSION = $VERSION" >> $mcs_topdir/build/config.make
6685     case $INSTALL in
6686     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6687     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6688     esac
6690     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6692     export VERSION
6693     [myver=$($AWK 'BEGIN {
6694       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6695       if(length(vsplit [1]) > 4) {
6696         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6697       }
6698       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6699     }')]
6701     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6702     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6704     if test x$host_darwin = xyes; then
6705       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6706       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6707       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6708     elif test x$host_win32 = xyes; then
6709       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6710       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6711       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6712     elif test x$host_linux = xyes; then
6713       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6714       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6715       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6716     else
6717       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6718       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6719       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6720     fi
6722     echo "PLATFORM_AOT_PREFIX = $PLATFORM_AOT_PREFIX" >> $mcs_topdir/build/config.make
6723     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6724       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6725     fi
6727         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6728            enable_system_aot=yes
6729         fi
6731     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6732       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6733     fi
6735     if test x$DISABLE_MCS_DOCS = xyes; then
6736       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6737     fi
6739     if test x$has_extension_module != xno; then
6740         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6741     fi
6742     
6743     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6744     
6745     if test "x$test_bcl_opt" = "xyes"; then    
6746       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6747     fi
6749     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6750     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6751     echo "VBCS_LOCATION?=$VBCS_LOCATION" >> $srcdir/$mcsdir/build/config.make
6753     if test $csc_compiler = mcs; then
6754       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6755     fi
6757     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6758       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6759       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6761       if test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" = "xno"; then
6762         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS,$MONO_LLVM_PATH_OPTION" >> $srcdir/$mcsdir/build/config.make
6763       else
6764         echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6765       fi
6766     fi
6768     if test "x$AOT_MODE" != "x" ; then
6769       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6770     fi
6772     if test "x$enable_btls" = "xyes"; then
6773       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6774     fi
6776     if test "x$mono_native" = "xyes"; then
6777       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6778     else
6779       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6780     fi
6782     if test x$mono_native_compat = xyes; then
6783       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6784     else
6785       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6786     fi
6788     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6789     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6790     if test x$enable_compiler_server = xyes; then
6791       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6792     else
6793       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6794     fi
6795     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6797   fi
6801 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6803 btls_platform_string=
6804 if test x$enable_btls = xyes; then
6805         if test x$btls_android = xyes; then
6806                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6807         else
6808                 btls_platform_string=" ($BTLS_PLATFORM)"
6809         fi
6812 thread_suspend_msg=
6813 if test x$buildsgen = xyes; then
6814         if test x$enable_cooperative_suspend != xno; then
6815                 thread_suspend_msg="Suspend:       Cooperative"
6816         elif test x$enable_hybrid_suspend != xno; then
6817                 thread_suspend_msg="Suspend:       Hybrid"
6818         else
6819                 thread_suspend_msg="Suspend:       Preemptive"
6820         fi
6823 if test "x$with_core" == "xonly"; then
6824   echo "RID = $RID" >> netcore/config.make
6825   echo "COREARCH = $COREARCH" >> netcore/config.make
6826   echo "CORETARGETS = $CORETARGETS" >> netcore/config.make
6827   echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> netcore/config.make
6829   if test x$host_darwin = xyes; then
6830     echo "HOST_PLATFORM ?= macos" >> netcore/config.make
6831   elif test x$host_win32 = xyes; then
6832     echo "HOST_PLATFORM ?= win32" >> netcore/config.make
6833   elif test x$host_linux = xyes; then
6834     echo "HOST_PLATFORM ?= linux" >> netcore/config.make
6835   else
6836     echo "HOST_PLATFORM ?= unix" >> netcore/config.make
6837   fi
6840         
6841 echo "
6842         mcs source:    $mcsdir
6843         C# Compiler:   $csc_compiler
6844         CompilerServer:$enable_compiler_server
6846    Engine:
6847         Host:          $host
6848         Target:        $target
6849         GC:            $gc_msg 
6850         $thread_suspend_msg
6851         TLS:           $with_tls
6852         SIGALTSTACK:   $with_sigaltstack
6853         Engine:        $jit_status
6854         BigArrays:     $enable_big_arrays
6855         DTrace:        $enable_dtrace
6856         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6857         Spectre:       $spectre_mitigation_status
6858         Mono.Native:   $mono_native_text
6860    Libraries:
6861         .NET 4.x:        $with_profile4_x
6862         Xamarin.Android: $with_monodroid
6863         Xamarin.iOS:     $with_monotouch
6864         Xamarin.WatchOS: $with_monotouch_watch
6865         Xamarin.TVOS:    $with_monotouch_tv
6866         Xamarin.Mac:     $with_xammac
6867         Windows AOT:     $with_winaot
6868         Orbis:           $with_orbis
6869         Unreal:          $with_unreal
6870         WebAssembly:     $with_wasm
6871         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6872         JNI support:     $jdk_headers_found
6873         libgdiplus:      $libgdiplus_msg
6874         zlib:            $zlib_msg
6875         BTLS:            $enable_btls$btls_platform_string
6876         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6877         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6878         .NET Core:       $with_core
6879         $disabled
6881 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6882    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)