[configure] Fix windows cross compilation to generate the proper defines.
[mono.git] / configure.ac
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
3
4 AC_INIT(mono, [4.1.0],
5         [http://bugzilla.xamarin.com/enter_bug.cgi?classification=Mono])
6
7 AC_CONFIG_SRCDIR([README.md])
8 AC_CONFIG_MACRO_DIR([m4])
9 AC_CANONICAL_SYSTEM
10 AC_CANONICAL_HOST
11
12 # Gross hack to enable 'make dist' on automake 1.9+tar 1.14.
13 # The extra brackets are to foil regex-based scans.
14 m4_ifdef([_A][M_PROG_TAR],[_A][M_SET_OPTION([tar-ustar])])
15
16 AM_INIT_AUTOMAKE([1.9 dist-bzip2 tar-ustar no-dist-gzip foreign subdir-objects])
17 AC_CONFIG_HEADERS([config.h])
18 AM_MAINTAINER_MODE
19
20 API_VER=2.0
21 AC_SUBST(API_VER)
22
23 AC_PROG_LN_S
24
25 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
26
27 case $host_os in
28 *cygwin* )
29                  echo "Run configure using ./configure --host=i686-pc-mingw32"
30                  exit 1
31 esac
32
33 # In case of cygwin, override LN_S, irrespective of what it determines.
34 # The build uses cygwin, but the actual runtime doesn't.
35 case $host_os in
36 *cygwin* ) LN_S='cp -p';;
37 esac
38
39 #
40 # libgc defaults
41 #
42 libgc_configure_args=
43
44 if test -d $srcdir/libgc ; then
45   libgc_default=included
46 else
47   libgc_default=boehm
48 fi
49
50 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
51 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
52 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
53 CFLAGS_FOR_LIBGC=$CFLAGS
54 CPPFLAGS_FOR_EGLIB=$CPPFLAGS
55 CFLAGS_FOR_EGLIB=$CFLAGS
56
57 # libgc uses some deprecated APIs
58 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
59
60 #
61 # These are the flags that need to be stored in the mono.pc file for 
62 # compiling code that will embed Mono
63 #
64 libmono_cflags=""
65 libmono_ldflags=""
66 AC_SUBST(libmono_cflags)
67 AC_SUBST(libmono_ldflags)
68
69 # Variable to have relocatable .pc files (lib, or lib64)
70 reloc_libdir=`basename ${libdir}`
71 AC_SUBST(reloc_libdir)
72
73 # Set to yes if Unix sockets cannot be created in an anonymous namespace
74 need_link_unlink=no
75
76 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
77 extra_runtime_ldflags=""
78
79 # Thread configuration inspired by sleepycat's db
80 AC_MSG_CHECKING([host platform characteristics])
81 libgc_threads=no
82 has_dtrace=no
83 parallel_mark=yes
84 ikvm_native=yes
85
86 case "$host" in
87         powerpc*-*-linux*)
88                 # https://bugzilla.novell.com/show_bug.cgi?id=504411
89                 disable_munmap=yes
90         ;;
91 esac
92
93 host_win32=no
94 target_win32=no
95 platform_android=no
96 platform_darwin=no
97 case "$host" in
98         *-mingw*|*-*-cygwin*)
99                 AC_DEFINE(HOST_WIN32,1,[Host Platform is Win32])
100                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
101                 AC_DEFINE(PLATFORM_NO_SYMLINKS,1,[This platform does not support symlinks])
102                 host_win32=yes
103                 mono_cv_clang=no
104                 if test "x$cross_compiling" = "xno"; then
105                         if test "x$host" == "x$build" -a "x$host" == "x$target"; then
106                                 target_win32=yes
107                         fi
108                 else
109                         target_win32=yes
110                 fi
111                 HOST_CC="gcc"
112                 # Windows XP SP2 is required
113                 CPPFLAGS="$CPPFLAGS -DWINVER=0x0502 -D_WIN32_WINNT=0x0502 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
114                 LDFLAGS="$LDFLAGS -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
115                 libmono_cflags="-mms-bitfields -mwindows"
116                 libmono_ldflags="-mms-bitfields -mwindows"
117                 libdl=
118                 libgc_threads=win32
119                 libgc_default=included
120                 with_sigaltstack=no
121                 with_tls=pthread
122                 LN_S=cp
123                 # This forces libgc to use the DllMain based thread registration code on win32
124                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
125                 ;;
126         *-*-*netbsd*)
127                 host_win32=no
128                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
129                 libmono_cflags="-D_REENTRANT"
130                 LDFLAGS="$LDFLAGS -pthread"
131                 CPPFLAGS="$CPPFLAGS -DPLATFORM_BSD"
132                 libmono_ldflags="-pthread"
133                 need_link_unlink=yes
134                 libdl="-ldl"
135                 libgc_threads=pthreads
136                 with_sigaltstack=no
137                 use_sigposix=yes
138                 ;;
139         *-*-kfreebsd*-gnu)
140                 host_win32=no
141                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
142                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
143                 libmono_ldflags="-lpthread -pthread"
144                 libdl="-ldl"
145                 libgc_threads=pthreads
146                 need_link_unlink=yes
147                 with_sigaltstack=no
148                 use_sigposix=yes
149                 ;;
150         *-*-*freebsd*)
151                 host_win32=no
152                 if test "x$PTHREAD_CFLAGS" = "x"; then
153                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
154                         libmono_cflags=
155                 else
156                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
157                         libmono_cflags="$PTHREAD_CFLAGS"
158                 fi
159                 if test "x$PTHREAD_LIBS" = "x"; then
160                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
161                         libmono_ldflags="-pthread"
162                 else
163                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
164                         libmono_ldflags="$PTHREAD_LIBS"
165                 fi
166                 CPPFLAGS="$CPPFLAGS -DPLATFORM_BSD"
167                 need_link_unlink=yes
168                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
169                 libdl=
170                 libgc_threads=pthreads
171                 use_sigposix=yes
172                 has_dtrace=yes
173                 ;;
174         *-*-*openbsd*)
175                 host_win32=no
176                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DPLATFORM_BSD -D_REENTRANT -DUSE_MMAP"
177                 if test "x$disable_munmap" != "xyes"; then
178                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
179                 fi
180                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
181                 LDFLAGS="$LDFLAGS -pthread"
182                 need_link_unlink=yes
183                 AC_DEFINE(PTHREAD_POINTER_ID)
184                 libdl=
185                 libgc_default=boehm
186                 libgc_threads=pthreads
187                 with_sigaltstack=no
188                 use_sigposix=yes
189                 ;;
190         *-*-linux-android*)
191                 host_win32=no
192                 platform_android=yes
193                 AC_DEFINE(PLATFORM_ANDROID,1,[Targeting the Android platform])
194                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
195
196                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
197                 if test "x$disable_munmap" != "xyes"; then
198                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
199                 fi
200                 libmono_cflags="-D_REENTRANT"
201                 libdl="-ldl"
202                 libgc_threads=pthreads
203                 use_sigposix=yes
204
205                 with_tls=pthread
206                 with_sigaltstack=no
207                 with_static_mono=no
208
209                 # Android doesn't support boehm, as it's missing <link.h>
210                 support_boehm=no
211                 with_gc=sgen
212
213                 # isinf(3) requires -lm; see isinf check below
214                 LDFLAGS="$LDFLAGS -lm"
215
216                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
217                 # PAGE_SIZE; breaks mono/io-layer/collection.c
218                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
219                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
220                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
221
222                 # The configure check can't detect this
223                 AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
224
225                 # to bypass the underscore linker check, can't work when cross-compiling
226                 mono_cv_uscore=yes
227                 mono_cv_clang=no
228                 ;;
229         *-*-linux*)
230                 host_win32=no
231                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
232                 if test "x$disable_munmap" != "xyes"; then
233                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
234                 fi
235                 libmono_cflags="-D_REENTRANT"
236                 libdl="-ldl"
237                 libgc_threads=pthreads
238                 use_sigposix=yes
239                 if test "x$cross_compiling" != "xno"; then
240                         # to bypass the underscore linker check, not
241                         # available during cross-compilation
242                         mono_cv_uscore=no
243                 fi
244                 case "$host" in
245                 aarch64-*)
246                         support_boehm=no
247                         with_gc=sgen
248                         ;;
249                 esac
250                 ;;
251         *-*-nacl*)
252                 host_win32=no
253                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
254                 if test "x$disable_munmap" != "xyes"; then
255                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
256                 fi
257                 libmono_cflags="-D_REENTRANT"
258                 libdl=
259                 libgc_threads=pthreads
260                 libgc_default=boehm
261                 use_sigposix=yes
262                 ikvm_native=no
263                 AC_DEFINE(DISABLE_SOCKETS,1,[Disable sockets support])
264                 AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
265                 ;;
266         *-*-hpux*)
267                 host_win32=no
268                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
269                 # +ESdbgasm only valid on bundled cc on RISC
270                 # silently ignored for ia64
271                 if test $GCC != "yes"; then
272                         CFLAGS="$CFLAGS +ESdbgasm"
273                         # Arrange for run-time dereferencing of null
274                         # pointers to produce a SIGSEGV signal.
275                         LDFLAGS="$LDFLAGS -z"
276                 fi
277                 CFLAGS="$CFLAGS +ESdbgasm"
278                 LDFLAGS="$LDFLAGS -z"
279                 libmono_cflags="-D_REENTRANT"
280                 libmono_ldflags="-lpthread"
281                 libgc_threads=pthreads
282                 need_link_unlink=yes
283                 use_sigposix=yes
284                 ;;
285         *-*-solaris*)
286                 host_win32=no
287                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DPLATFORM_SOLARIS"
288                 need_link_unlink=yes
289                 libmono_cflags="-D_REENTRANT"
290                 libgc_threads=pthreads
291                 # This doesn't seem to work on solaris/x86, but the configure test runs
292                 with_tls=pthread
293                 has_dtrace=yes
294                 use_sigposix=yes
295                 enable_solaris_tar_check=yes
296                 ;;
297         *-*-darwin*)
298                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
299                 host_win32=no
300                 platform_darwin=yes
301                 target_mach=yes
302                 CPPFLAGS="$CPPFLAGS -no-cpp-precomp -D_THREAD_SAFE -DGC_MACOSX_THREADS -DPLATFORM_MACOSX -DUSE_MMAP -DUSE_MUNMAP"
303                 libmono_cflags="-D_THREAD_SAFE"
304                 need_link_unlink=yes
305                 AC_DEFINE(PTHREAD_POINTER_ID)
306                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
307                 libdl=
308                 libgc_threads=pthreads
309                 has_dtrace=yes
310                 if test "x$cross_compiling" = "xyes"; then
311                         has_broken_apple_cpp=yes
312                 fi
313                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
314                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
315                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
316                 case "$host" in
317                         dnl Snow Leopard and newer config.guess reports as this
318                         i*86-*-darwin*)
319                                 BROKEN_DARWIN_FLAGS="-arch i386 -D_XOPEN_SOURCE"
320                                 BROKEN_DARWIN_CPPFLAGS="-D_XOPEN_SOURCE"
321                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
322                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
323                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
324                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
325                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
326                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
327                                 CPPFLAGS_FOR_EGLIB="$CPPFLAGS_FOR_EGLIB $BROKEN_DARWIN_CPPFLAGS"
328                                 CFLAGS_FOR_EGLIB="$CFLAGS_FOR_EGLIB $BROKEN_DARWIN_FLAGS"
329                                 ;;
330                         x*64-*-darwin*)
331                                 ;;
332                         arm*-darwin*)
333                                 has_dtrace=no
334                                 ;;                      
335                 esac
336                 ;;
337         *-*-haiku*)
338                 host_win32=no
339                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_THREAD_SAFE"
340                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
341                 libdl=
342                 LIBS="$LIBS -lnetwork"
343                 need_link_unlink=yes
344                 AC_DEFINE(PTHREAD_POINTER_ID)
345                 libgc_threads=pthreads
346                 use_sigposix=yes
347                 ;;
348         *)
349                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
350                 host_win32=no
351                 libdl="-ldl"
352                 ;;
353 esac
354 AC_MSG_RESULT(ok)
355
356 if test x$need_link_unlink = xyes; then
357    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
358 fi
359
360 AC_SUBST(extra_runtime_ldflags)
361 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
362 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
363 AM_CONDITIONAL(PLATFORM_GNU, echo x$target_os | grep -q -- -gnu)
364 AM_CONDITIONAL(PLATFORM_LINUX, echo x$target_os | grep -q linux)
365 AM_CONDITIONAL(PLATFORM_DARWIN, test x$platform_darwin = xyes)
366 AM_CONDITIONAL(PLATFORM_SIGPOSIX, test x$use_sigposix = xyes)
367 AM_CONDITIONAL(PLATFORM_ANDROID, test x$platform_android = xyes)
368
369 AC_CHECK_TOOL(CC, gcc, gcc)
370 AC_PROG_CC
371 AC_CHECK_TOOL(CXX, g++, g++)
372 AC_PROG_CXX
373 AM_PROG_AS
374 AC_PROG_INSTALL
375 AC_PROG_AWK
376 AM_PROG_CC_C_O
377 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
378 : ${CCAS='$(CC)'}
379 # Set ASFLAGS if not already set.
380 : ${CCASFLAGS='$(CFLAGS)'}
381 AC_SUBST(CCAS)
382 AC_SUBST(CCASFLAGS)
383
384 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
385 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
386 if test "x$CXX" = "xg++"; then
387         if test "x$GXX" != "xyes"; then
388                 # automake/libtool is so broken, it requires g++ even if the c++ sources
389                 # are inside automake conditionals
390                 AC_MSG_ERROR([You need to install g++])
391         fi
392 fi
393
394 dnl may require a specific autoconf version
395 dnl AC_PROG_CC_FOR_BUILD
396 dnl CC_FOR_BUILD not automatically detected
397 CC_FOR_BUILD=$CC
398 CFLAGS_FOR_BUILD=$CFLAGS
399 BUILD_EXEEXT=
400 if test "x$cross_compiling" = "xyes"; then
401         CC_FOR_BUILD=cc
402         CFLAGS_FOR_BUILD=
403         BUILD_EXEEXT=""
404 fi
405 AC_SUBST(CC_FOR_BUILD)
406 AC_SUBST(CFLAGS_FOR_BUILD)
407 AC_SUBST(HOST_CC)
408 AC_SUBST(BUILD_EXEEXT)
409
410 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
411 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
412
413 # Set STDC_HEADERS
414 AC_HEADER_STDC
415 AC_LIBTOOL_WIN32_DLL
416 # This causes monodis to not link correctly
417 #AC_DISABLE_FAST_INSTALL
418 AM_PROG_LIBTOOL
419 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
420 DOLT
421
422 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
423 AC_SUBST(export_ldflags)
424
425 # Test whenever ld supports -version-script
426 AC_PROG_LD
427 AC_PROG_LD_GNU
428
429 AM_ICONV()
430
431 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)
432 AC_CHECK_HEADERS(sys/param.h sys/socket.h sys/ipc.h sys/sem.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)
433 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
434                   [], [], [#include <stddef.h>
435                   #include <sys/socket.h>
436                   #include <linux/socket.h>])
437
438 AC_CHECK_HEADERS(sys/user.h, [], [],
439 [
440 #ifdef HAVE_SYS_PARAM_H
441 # include <sys/param.h>
442 #endif
443 ])
444
445 AC_CHECK_HEADERS(linux/serial.h)
446
447 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
448 if test x$have_zlib = xyes; then
449    AC_TRY_COMPILE([#include <zlib.h>], [
450    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
451    return 0;
452    #else
453    #error No good zlib found
454    #endif
455    ],[
456         AC_MSG_RESULT(Using system zlib)
457         zlib_msg="system zlib"
458         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
459    ],[
460         AC_MSG_RESULT(Using embedded zlib)
461         have_zlib=no
462         zlib_msg="bundled zlib"
463    ])
464 fi
465
466 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
467 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
468
469 # for mono/metadata/debug-symfile.c
470 AC_CHECK_HEADERS(elf.h)
471
472 # for support
473 AC_CHECK_HEADERS(poll.h)
474 AC_CHECK_HEADERS(sys/poll.h)
475 AC_CHECK_HEADERS(sys/wait.h)
476 AC_CHECK_HEADERS(grp.h)
477 AC_CHECK_HEADERS(syslog.h)
478
479 # for mono/dis
480 AC_CHECK_HEADERS(wchar.h)
481 AC_CHECK_HEADERS(ieeefp.h)
482 AC_MSG_CHECKING(for isinf)
483 AC_TRY_LINK([#include <math.h>], [
484         int f = isinf (1.0);
485 ], [
486         AC_MSG_RESULT(yes)
487         AC_DEFINE(HAVE_ISINF, 1, [isinf available])
488 ], [
489         # We'll have to use signals
490         AC_MSG_RESULT(no)
491 ])
492 # mingw
493 AC_CHECK_FUNCS(_finite, , AC_MSG_CHECKING(for _finite in math.h)
494         AC_TRY_LINK([#include <math.h>], 
495         [ _finite(0.0); ], 
496         AC_DEFINE(HAVE__FINITE, 1, [Have _finite in -lm]) AC_MSG_RESULT(yes),
497         AC_MSG_RESULT(no)))
498
499 # for Linux statfs support
500 AC_CHECK_HEADERS(linux/magic.h)
501
502 # not 64 bit clean in cross-compile
503 AC_CHECK_SIZEOF(void *, 4)
504
505 AC_CACHE_CHECK([for clang],
506         mono_cv_clang,[
507         AC_TRY_COMPILE([], [
508                 #ifdef __clang__
509                 #else
510                 #error "FAILED"
511                 #endif
512                 return 0;
513         ],
514         [mono_cv_clang=yes],
515         [mono_cv_clang=no],
516         [])
517 ])
518
519 AC_ARG_ENABLE(visiblity-hidden,
520 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden]
521    disable_visibility_hidden=no, disable_visibility_hidden=yes)
522
523 WARN=''
524 if test x"$GCC" = xyes; then
525         WARN='-Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes  -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value'
526
527                 # We require C99 with some GNU extensions, e.g. `linux` macro
528                 CFLAGS="$CFLAGS -std=gnu99"
529
530                 # The runtime code does not respect ANSI C strict aliasing rules
531                 CFLAGS="$CFLAGS -fno-strict-aliasing"
532
533                 # We rely on signed overflow to behave
534                 CFLAGS="$CFLAGS -fwrapv"
535
536                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
537                 if test x"$disable_visibility_hidden" = xno; then
538                    # Don't export any symbols by default
539                    SHARED_CFLAGS="-fvisibility=hidden"
540                    CFLAGS_FOR_EGLIB="$CFLAGS_FOR_EGLIB -fvisibility=hidden"
541                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
542                 fi
543
544                 ORIG_CFLAGS=$CFLAGS
545                 # Check for the normal version, since gcc ignores unknown -Wno options
546                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
547                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
548                 AC_TRY_COMPILE([],[
549                                 return 0;
550                 ], [
551                    AC_MSG_RESULT(yes)
552                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
553                 ], [
554                    AC_MSG_RESULT(no)
555                    CFLAGS=$ORIG_CFLAGS
556                 ])
557
558                 if test "x$mono_cv_clang" = "xyes"; then
559                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
560                    WARN="$WARN -Qunused-arguments"
561                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign"
562                 fi
563 else
564         # The Sun Forte compiler complains about inline functions that access static variables
565         # so disable all inlining.
566         case "$host" in
567         *-*-solaris*)
568                 CFLAGS="$CFLAGS -Dinline="
569                 ;;
570         esac
571 fi
572 CFLAGS="$CFLAGS -g $WARN"
573 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
574 CPPFLAGS="$CPPFLAGS -g $WARN"
575
576 # Where's the 'mcs' source tree?
577 if test -d $srcdir/mcs; then
578   mcsdir=mcs
579 else
580   mcsdir=../mcs
581 fi
582
583 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
584         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
585                 mcsdir=$with_mcs_path
586         fi
587 )
588
589 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
590
591 #
592 # A sanity check to catch cases where the package was unpacked
593 # with an ancient tar program (Solaris)
594 #
595 AC_ARG_ENABLE(solaris-tar-check,
596 [  --disable-solaris-tar-check    disable solaris tar check],
597    do_solaris_tar_check=no, do_solaris_tar_check=yes)
598
599 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
600         AC_MSG_CHECKING(integrity of package)
601         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
602         then
603                 AC_MSG_RESULT(ok)
604         else
605                 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"
606                 AC_MSG_ERROR([$errorm])
607         fi
608 fi
609
610 if test "x$with_mcs_path" != "x"; then
611 mcs_topdir=$(cd "$mcsdir" && pwd)
612 mcs_topdir_from_srcdir=$mcs_topdir
613 else
614 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
615 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
616 fi
617
618 # Convert mcs_topdir* paths to Windows syntax.
619 if test x$cross_compiling$host_win32 = xnoyes; then
620   mcs_topdir=$(cygpath -m $mcs_topdir)
621   case $mcs_topdir_from_srcdir in
622     /cygdrive/*)
623         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
624         ;;
625   esac
626 fi
627
628 AC_SUBST([mcs_topdir])
629 AC_SUBST([mcs_topdir_from_srcdir])
630
631 # Where's the 'olive' source tree?
632 if test -d $srcdir/olive; then
633   olivedir=olive
634 else
635   olivedir=../olive
636 fi
637
638 if test -d $srcdir/$olivedir; then
639 olive_topdir='$(top_srcdir)/'$olivedir
640 fi
641
642 # gettext: prepare the translation directories. 
643 # we do not configure the full gettext, as we consume it dynamically from C#
644 AM_PO_SUBDIRS
645
646 if test "x$USE_NLS" = "xyes"; then
647    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
648
649    if test "x$HAVE_MSGFMT" = "xno"; then
650           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
651    fi
652 fi
653
654 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
655
656 pkg_config_path=
657 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
658         if test x$with_crosspkgdir = "x"; then
659                 if test -s $PKG_CONFIG_PATH; then
660                         pkg_config_path=$PKG_CONFIG_PATH
661                 fi
662         else
663                 pkg_config_path=$with_crosspkgdir
664                 PKG_CONFIG_PATH=$pkg_config_path
665                 export PKG_CONFIG_PATH
666         fi
667 )
668
669 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
670 if test x$werror_flag = xyes; then
671         WERROR_CFLAGS="-Werror"
672 fi
673 AC_SUBST([WERROR_CFLAGS])
674 AC_SUBST([SHARED_CFLAGS])
675
676 ac_configure_args="$ac_configure_args \"CPPFLAGS_FOR_EGLIB=$EGLIB_CPPFLAGS\" \"CFLAGS_FOR_EGLIB=$CFLAGS_FOR_EGLIB\""
677 AC_CONFIG_SUBDIRS(eglib)
678
679 GLIB_CFLAGS='-I$(top_srcdir)/eglib/src -I$(top_builddir)/eglib/src'
680 GLIB_LIBS='-L$(top_builddir)/eglib/src -leglib -lm'
681 BUILD_GLIB_CFLAGS="$GLIB_CFLAGS"
682 BUILD_GLIB_LIBS="$GLIB_LIBS"
683 GMODULE_CFLAGS="$GLIB_CFLAGS"
684 GMODULE_LIBS="$GLIB_LIBS"
685   
686 AC_SUBST(GLIB_CFLAGS)
687 AC_SUBST(GLIB_LIBS)
688 AC_SUBST(GMODULE_CFLAGS)
689 AC_SUBST(GMODULE_LIBS)
690 AC_SUBST(BUILD_GLIB_CFLAGS)
691 AC_SUBST(BUILD_GLIB_LIBS)
692
693 # Enable support for fast thread-local storage
694 # Some systems have broken support, so we allow to disable it.
695 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
696
697 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
698 # This does not work on some platforms (bug #55253)
699 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
700
701 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
702 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
703 # Same as --with-shared_mono=no
704 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
705
706 if test "x$enable_static" = "xno"; then
707    with_static_mono=no
708 fi
709
710 if test "x$enable_shared" = "xno"; then
711    with_shared_mono=no
712 fi
713
714 if test "x$enable_libraries" = "xno"; then
715    with_shared_mono=no
716 fi
717
718 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
719
720 case $host in
721 *nacl* ) with_shared_mono=yes;;
722 esac
723
724 if test "x$host_win32" = "xyes"; then
725    # Boehm GC requires the runtime to be in its own dll
726    with_static_mono=no
727 fi
728
729 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
730 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
731 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
732
733 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
734 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
735         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
736         ORIG_CFLAGS=$CFLAGS
737         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
738         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
739         AC_TRY_COMPILE([], [
740                 return 0;
741         ], [
742            AC_MSG_RESULT(yes)
743            # Pass it to libgc as well
744            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
745         ], [
746            AC_MSG_RESULT(no)
747            CFLAGS=$ORIG_CFLAGS
748         ])
749 fi
750
751 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
752
753 if test x$enable_small_config = xyes; then
754         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
755         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
756 fi
757
758 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)
759
760 DISABLED_FEATURES=none
761
762 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
763      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
764      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, simd, soft_debug, perfcounters, normalization, assembly_remapping, shared_perfcounters, remoting,
765          security, sgen_remset, sgen_marksweep_par, sgen_marksweep_fixed, sgen_marksweep_fixed_par, sgen_copying, shared_handles.],
766 [
767         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
768                 eval "mono_feature_disable_$feature='yes'"
769         done
770         DISABLED_FEATURES=$enable_minimal
771         disabled="Disabled:      $enable_minimal"
772 ],[])
773
774 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
775
776 if test "x$mono_feature_disable_aot" = "xyes"; then
777         AC_DEFINE(DISABLE_AOT_COMPILER, 1, [Disable AOT Compiler])
778         AC_MSG_NOTICE([Disabled AOT compiler])
779 fi
780
781 if test "x$mono_feature_disable_profiler" = "xyes"; then
782         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
783         AC_MSG_NOTICE([Disabled support for the profiler])
784 fi
785 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
786
787 if test "x$mono_feature_disable_decimal" = "xyes"; then
788         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
789         AC_MSG_NOTICE([Disabled support for decimal])
790 fi
791
792 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
793         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
794         AC_MSG_NOTICE([Disabled support for P/Invoke])
795 fi
796
797 if test "x$mono_feature_disable_debug" = "xyes"; then
798         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
799         AC_MSG_NOTICE([Disabled support for runtime debugging])
800 fi
801
802 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
803         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
804         mono_feature_disable_reflection_emit_save=yes
805         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
806 fi
807
808 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
809         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
810         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
811 fi
812
813 if test "x$mono_feature_disable_large_code" = "xyes"; then
814         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
815         AC_MSG_NOTICE([Disabled support for large assemblies])
816 fi
817
818 if test "x$mono_feature_disable_logging" = "xyes"; then
819         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
820         AC_MSG_NOTICE([Disabled support for logging])
821 fi
822
823 if test "x$mono_feature_disable_com" = "xyes"; then
824         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
825         AC_MSG_NOTICE([Disabled COM support])
826 fi
827
828 if test "x$mono_feature_disable_ssa" = "xyes"; then
829         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
830         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
831 fi
832
833 if test "x$mono_feature_disable_generics" = "xyes"; then
834         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
835         AC_MSG_NOTICE([Disabled Generics Support])
836 fi
837
838 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
839         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
840         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
841 fi
842
843 if test "x$mono_feature_disable_portability" = "xyes"; then
844         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
845         AC_MSG_NOTICE([Disabled IO Portability layer])
846 fi
847
848 if test "x$mono_feature_disable_attach" = "xyes"; then
849         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
850         AC_MSG_NOTICE([Disabled agent attach])
851 fi
852
853 if test "x$mono_feature_disable_full_messages" = "xyes"; then
854         AC_DEFINE(DISABLE_FULL_MESSAGES, 1, [Disables building in the full table of WAPI messages])
855         AC_MSG_NOTICE([Disabled full messages for Win32 errors, only core message strings shipped])
856 fi
857
858 if test "x$mono_feature_disable_verifier" = "xyes"; then
859         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
860         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
861 fi
862
863 if test "x$mono_feature_disable_jit" = "xyes"; then
864         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode will be supported by the runtime.])
865         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT will be supported])
866 fi
867
868 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
869
870 if test "x$mono_feature_disable_simd" = "xyes"; then
871         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
872         AC_MSG_NOTICE([Disabled SIMD support])
873 fi
874
875 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
876         AC_DEFINE(DISABLE_SOFT_DEBUG, 1, [Disable Soft Debugger Agent.])
877         AC_MSG_NOTICE([Disabled Soft Debugger.])
878 fi
879
880 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
881         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
882         AC_MSG_NOTICE([Disabled Performance Counters.])
883 fi
884 if test "x$mono_feature_disable_normalization" = "xyes"; then
885         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
886         AC_MSG_NOTICE([Disabled String normalization support.])
887 fi
888
889 if test "x$mono_feature_disable_assembly_remapping" = "xyes"; then
890         AC_DEFINE(DISABLE_ASSEMBLY_REMAPPING, 1, [Disable assembly remapping.])
891         AC_MSG_NOTICE([Disabled Assembly remapping.])
892 fi
893
894 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
895         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
896         AC_MSG_NOTICE([Disabled Shared perfcounters.])
897 fi
898
899 if test "x$mono_feature_disable_appdomains" = "xyes"; then
900         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
901         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
902 fi
903
904 if test "x$mono_feature_disable_remoting" = "xyes"; then
905         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
906         AC_MSG_NOTICE([Disabled remoting])
907 fi
908
909 if test "x$mono_feature_disable_security" = "xyes"; then
910         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
911         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
912 fi
913
914 if test "x$mono_feature_disable_sgen_remset" = "xyes"; then
915         AC_DEFINE(DISABLE_SGEN_REMSET, 1, [Disable wbarrier=remset support in SGEN.])
916         AC_MSG_NOTICE([Disabled wbarrier=remset support in SGEN.])
917 fi
918
919 if test "x$mono_feature_disable_sgen_marksweep_par" = "xyes"; then
920         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_PAR, 1, [Disable major=marksweep-par support in SGEN.])
921         AC_MSG_NOTICE([Disabled major=marksweep-par support in SGEN.])
922 fi
923
924 if test "x$mono_feature_disable_sgen_marksweep_fixed" = "xyes"; then
925         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_FIXED, 1, [Disable major=marksweep-fixed support in SGEN.])
926         AC_MSG_NOTICE([Disabled major=marksweep-fixed support in SGEN.])
927 fi
928
929 if test "x$mono_feature_disable_sgen_marksweep_fixed_par" = "xyes"; then
930         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_FIXED_PAR, 1, [Disable major=marksweep-fixed-par support in SGEN.])
931         AC_MSG_NOTICE([Disabled major=marksweep-fixed-par support in SGEN.])
932 fi
933
934 if test "x$mono_feature_disable_sgen_copying" = "xyes"; then
935         AC_DEFINE(DISABLE_SGEN_MAJOR_COPYING, 1, [Disable major=copying support in SGEN.])
936         AC_MSG_NOTICE([Disabled major=copying support in SGEN.])
937 fi
938
939 if test "x$mono_feature_disable_shared_handles" = "xyes"; then
940         AC_DEFINE(DISABLE_SHARED_HANDLES, 1, [Disable inter-process shared handles])
941         AC_SUBST(DISABLE_SHARED_HANDLES)
942 fi
943
944 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
945 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
946
947 has_extension_module=no
948 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
949 [
950         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
951                 if test x$extension = xdefault ; then
952                         has_extension_module=yes;
953                 fi
954         done
955         if test x$enable_extension_module = xyes; then
956                 has_extension_module=yes;
957         fi
958 ], [])
959
960 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
961
962 if test x$has_extension_module != xno ; then
963         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
964         AC_MSG_NOTICE([Enabling mono extension module.])
965 fi
966
967 AC_ARG_ENABLE(gsharing, [  --enable-gsharing Enable gsharing], enable_gsharing=$enableval, enable_gsharing=no)
968 if test x$enable_gsharing = xyes; then
969         AC_DEFINE(ENABLE_GSHAREDVT,1,[Gsharing])
970 fi
971
972 # A synonym
973 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing], enable_gsharedvt=$enableval, enable_gsharedvt=no)
974 if test x$enable_gsharedvt = xyes; then
975         AC_DEFINE(ENABLE_GSHAREDVT,1,[Gsharedvt])
976 fi
977
978 AC_ARG_ENABLE(native-types, [  --enable-native-types Enable native types], enable_native_types=$enableval, enable_native_types=no)
979 if test x$enable_native_types = xyes; then
980         AC_DEFINE(MONO_NATIVE_TYPES,1,[native types])
981 fi
982
983 AC_MSG_CHECKING(for visibility __attribute__)
984 AC_COMPILE_IFELSE([
985         AC_LANG_SOURCE([[
986                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
987                 int main () { doit (); return 0; }
988         ]])
989 ], [
990    have_visibility_hidden=yes
991    AC_MSG_RESULT(yes)
992 ], [
993    have_visibility_hidden=no
994    AC_MSG_RESULT(no)
995 ])
996
997 AC_MSG_CHECKING(for deprecated __attribute__)
998 AC_TRY_COMPILE([
999      int doit (void) __attribute__ ((deprecated));
1000      int doit (void) { return 0; }
1001 ], [
1002         return 0;
1003 ], [
1004    have_deprecated=yes
1005    AC_MSG_RESULT(yes)
1006 ], [
1007    have_deprecated=no
1008    AC_MSG_RESULT(no)
1009 ])
1010
1011 dnl
1012 dnl Boehm GC configuration
1013 dnl
1014
1015 AC_ARG_WITH(libgc,   [  --with-gc=boehm,included,none  Controls the Boehm GC config, default=included],[libgc=$with_gc],[libgc=$libgc_default])
1016
1017 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1018 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1019
1020 AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1021 if test x$enable_parallel_mark = xyes; then
1022         libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1023 fi
1024
1025 gc_headers=no
1026 gc_msg=""
1027 use_included_gc=no
1028 LIBGC_CPPFLAGS=
1029 LIBGC_LIBS=
1030 LIBGC_STATIC_LIBS=
1031 libgc_dir=
1032 case "x$libgc" in
1033         xboehm|xbohem|xyes)
1034                 AC_CHECK_HEADERS(gc.h gc/gc.h, gc_headers=yes)
1035                 AC_CHECK_LIB(gc, GC_malloc, found_boehm="yes",,$libdl)
1036
1037                 if test "x$found_boehm" != "xyes"; then
1038                         AC_MSG_ERROR("GC requested but libgc not found! Install libgc or run configure with --with-gc=none.")
1039                 fi
1040                 if test "x$gc_headers" != "xyes"; then
1041                         AC_MSG_ERROR("GC requested but header files not found! You may need to install them by hand.")
1042                 fi
1043
1044                 LIBGC_LIBS="-lgc $libdl"
1045                 LIBGC_STATIC_LIBS="$LIBGC_LIBS"
1046                 libmono_ldflags="$libmono_ldflags -lgc"
1047                 BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1048
1049                 # AC_CHECK_FUNCS does not work for some reason...
1050                 AC_CHECK_LIB(gc, GC_gcj_malloc, found_gcj_malloc="yes",,$libdl)
1051                 if test "x$found_gcj_malloc" = "xyes"; then
1052                         BOEHM_DEFINES="-DHAVE_GC_GCJ_MALLOC $BOEHM_DEFINES"
1053                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "System Boehm (with typed GC)", [GC description])
1054                         gc_msg="System Boehm with typed GC"
1055                 else
1056                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "System Boehm (no typed GC)", [GC description])
1057                         gc_msg="System Boehm (without typed GC)"
1058                 fi
1059                 AC_CHECK_LIB(gc, GC_enable, found_gc_enable="yes",,$libdl)
1060                 if test "x$found_gc_enable" = "xyes"; then
1061                         BOEHM_DEFINES="-DHAVE_GC_ENABLE $BOEHM_DEFINES"
1062                 fi
1063
1064                 # check whether we need to explicitly allow
1065                 # thread registering
1066                 AC_CHECK_LIB(gc, GC_allow_register_threads, found_allow_register_threads="yes",,$libdl)
1067                 if test "x$found_allow_register_threads" = "xyes"; then
1068                    AC_DEFINE(HAVE_GC_ALLOW_REGISTER_THREADS, 1, [GC requires thread registration])
1069                 fi
1070                 ;;
1071
1072         xincluded)
1073                 use_included_gc=yes
1074                 if test "x$support_boehm" = "xyes"; then
1075                         libgc_dir=libgc
1076                 fi
1077
1078                 LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1079                 LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1080                 LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1081
1082                 BOEHM_DEFINES="-DHAVE_BOEHM_GC -DHAVE_GC_H -DUSE_INCLUDED_LIBGC -DHAVE_GC_GCJ_MALLOC -DHAVE_GC_ENABLE"
1083
1084                 if test x$target_win32 = xyes; then
1085                         BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1086                         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1087                 fi
1088
1089                 gc_msg="Included Boehm GC with typed GC"
1090                 if test x$enable_parallel_mark = xyes; then
1091                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1092                         gc_msg="$gc_msg and parallel mark"
1093                 else
1094                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1095                 fi
1096                 ;;
1097
1098         xsgen)
1099                 AC_MSG_WARN("Use --with-sgen instead, --with-gc= controls Boehm configuration")
1100                 ;;
1101
1102         xnone)
1103                 AC_MSG_WARN("Compiling mono without GC.")
1104                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1105                 AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1106                 gc_msg="none"
1107                 ;;
1108         *)
1109                 AC_MSG_ERROR([Invalid argument to --with-gc.])
1110                 ;;
1111 esac
1112
1113 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])
1114 if test "x$large_heap" = "xyes"; then
1115    CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1116 fi
1117
1118 AM_CONDITIONAL(INCLUDED_LIBGC, test x$use_included_gc = xyes)
1119 AC_SUBST(LIBGC_CPPFLAGS)
1120 AC_SUBST(LIBGC_LIBS)
1121 AC_SUBST(LIBGC_STATIC_LIBS)
1122 AC_SUBST(libgc_dir)
1123 AC_SUBST(BOEHM_DEFINES)
1124
1125 dnl
1126 dnl End of Boehm GC Configuration
1127 dnl
1128
1129 dnl *************************************
1130 dnl *** Checks for zero length arrays ***
1131 dnl *************************************
1132 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1133 AC_TRY_COMPILE([
1134         struct s {
1135                 int  length;
1136                 char data [0];
1137         };
1138 ], [], [
1139         AC_MSG_RESULT(yes)
1140         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1141 ], [
1142         AC_MSG_RESULT(no)
1143         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1144 ])
1145
1146 AC_CHECK_HEADERS(nacl/nacl_dyncode.h)
1147
1148 dnl ***********************************
1149 dnl *** Checks for signals
1150 dnl ***********************************
1151 AC_CHECK_HEADERS(signal.h)
1152 AC_CHECK_FUNCS(sigaction)
1153
1154 if test x$target_win32 = xno; then
1155
1156         dnl hires monotonic clock support
1157         AC_SEARCH_LIBS(clock_gettime, rt)
1158
1159         dnl dynamic loader support
1160         AC_CHECK_FUNC(dlopen, DL_LIB="",
1161                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1162         )
1163         if test x$dl_support = xno; then
1164                 AC_MSG_WARN([No dynamic loading support available])
1165         else
1166                 LIBS="$LIBS $DL_LIB"
1167                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1168                 dnl from glib's configure.ac
1169                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1170                         mono_cv_uscore,[
1171                         AC_TRY_RUN([#include <dlfcn.h>
1172                         int mono_underscore_test (void) { return 42; }
1173                         int main() {
1174                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1175                           handle = dlopen ((void*)0, 0);
1176                           if (handle) {
1177                             f1 = dlsym (handle, "mono_underscore_test");
1178                             f2 = dlsym (handle, "_mono_underscore_test");
1179                           } return (!f2 || f1);
1180                         }],
1181                                 [mono_cv_uscore=yes],
1182                                 [mono_cv_uscore=no],
1183                         [])
1184                 ])
1185                 if test "x$mono_cv_uscore" = "xyes"; then
1186                         MONO_DL_NEED_USCORE=1
1187                 else
1188                         MONO_DL_NEED_USCORE=0
1189                 fi
1190                 AC_SUBST(MONO_DL_NEED_USCORE)
1191                 AC_CHECK_FUNC(dlerror)
1192         fi
1193
1194         dnl ******************************************************************
1195         dnl *** Checks for the IKVM JNI interface library                  ***
1196         dnl ******************************************************************
1197         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])
1198
1199         ikvm_native_dir=
1200         if test x$with_ikvm_native = xyes; then
1201                 ikvm_native_dir=ikvm-native
1202                 jdk_headers_found="IKVM Native"
1203         fi
1204
1205         AC_SUBST(ikvm_native_dir)
1206
1207         AC_CHECK_HEADERS(execinfo.h)
1208
1209         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1210
1211         AC_CHECK_FUNCS(getgrgid_r)
1212         AC_CHECK_FUNCS(getgrnam_r)
1213         AC_CHECK_FUNCS(getpwnam_r)
1214         AC_CHECK_FUNCS(getpwuid_r)
1215         AC_CHECK_FUNCS(getresuid)
1216         AC_CHECK_FUNCS(setresuid)
1217         AC_CHECK_FUNCS(kqueue)
1218         AC_CHECK_FUNCS(backtrace_symbols)
1219         AC_CHECK_FUNCS(mkstemp)
1220         AC_CHECK_FUNCS(mmap)
1221         AC_CHECK_FUNCS(madvise)
1222         AC_CHECK_FUNCS(getrusage)
1223         AC_CHECK_FUNCS(getpriority)
1224         AC_CHECK_FUNCS(setpriority)
1225         AC_CHECK_FUNCS(dl_iterate_phdr)
1226         AC_CHECK_FUNCS(dladdr)
1227         AC_CHECK_FUNCS(sysconf)
1228         AC_CHECK_FUNCS(getrlimit)
1229
1230         AC_CHECK_FUNCS(sched_setaffinity)
1231         AC_CHECK_FUNCS(sched_getcpu)
1232
1233         dnl ****************************************************************
1234         dnl *** Check for sched_setaffinity from glibc versions before   ***
1235         dnl *** 2.3.4. The older versions of the function only take 2    ***
1236         dnl *** parameters, not 3.                                       ***
1237         dnl ***                                                          ***
1238         dnl *** Because the interface change was not made in a minor     ***
1239         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1240         dnl *** won't always indicate the interface sched_affinity has.  ***
1241         dnl ****************************************************************
1242         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1243         AC_TRY_COMPILE([#include <sched.h>], [
1244             int mask = 1; 
1245             sched_setaffinity(0, &mask);
1246                         return 0;
1247         ], [
1248                 # Yes, we have it...
1249                 AC_MSG_RESULT(yes)
1250                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1251         ], [
1252                 # We have the new, three-parameter version
1253                 AC_MSG_RESULT(no)
1254         ])
1255
1256
1257         dnl ******************************************************************
1258         dnl *** Check for large file support                               ***
1259         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1260         dnl ******************************************************************
1261         
1262         # Check that off_t can represent 2**63 - 1 correctly, working around
1263         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1264         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1265         large_offt=no
1266         AC_DEFUN([LARGE_FILES], [
1267                 large_CPPFLAGS=$CPPFLAGS
1268                 CPPFLAGS="$CPPFLAGS $1"
1269                 AC_TRY_COMPILE([
1270                         #include <sys/types.h>
1271                         #include <limits.h>
1272                 ], [
1273                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1274                         #define COMPILE_TIME_ASSERT(pred) \
1275                                 switch(0){case 0:case pred:;}
1276                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1277                 ], [
1278                         AC_MSG_RESULT(ok)
1279                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1280                         large_CPPFLAGS="$large_CPPFLAGS $1"
1281                         large_offt=yes
1282                 ], [
1283                         AC_MSG_RESULT(no)
1284                 ])
1285                 CPPFLAGS=$large_CPPFLAGS
1286         ])
1287
1288         AC_MSG_CHECKING(if off_t is 64 bits wide)
1289         LARGE_FILES("")
1290         if test $large_offt = no; then
1291                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1292                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1293         fi
1294         if test $large_offt = no; then
1295                 AC_MSG_WARN([No 64 bit file size support available])
1296         fi
1297         
1298         dnl *****************************
1299         dnl *** Checks for libsocket  ***
1300         dnl *****************************
1301         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1302
1303         case "$host" in
1304                 *-*-*freebsd*)
1305                         dnl *****************************
1306                         dnl *** Checks for libinotify ***
1307                         dnl *****************************
1308                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1309         esac
1310
1311         dnl *******************************
1312         dnl *** Checks for MSG_NOSIGNAL ***
1313         dnl *******************************
1314         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1315         AC_TRY_COMPILE([#include <sys/socket.h>], [
1316                 int f = MSG_NOSIGNAL;
1317         ], [
1318                 # Yes, we have it...
1319                 AC_MSG_RESULT(yes)
1320                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
1321         ], [
1322                 # We'll have to use signals
1323                 AC_MSG_RESULT(no)
1324         ])
1325
1326         dnl *****************************
1327         dnl *** Checks for IPPROTO_IP ***
1328         dnl *****************************
1329         AC_MSG_CHECKING(for IPPROTO_IP)
1330         AC_TRY_COMPILE([#include <netinet/in.h>], [
1331                 int level = IPPROTO_IP;
1332         ], [
1333                 # Yes, we have it...
1334                 AC_MSG_RESULT(yes)
1335                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
1336         ], [
1337                 # We'll have to use getprotobyname
1338                 AC_MSG_RESULT(no)
1339         ])
1340
1341         dnl *******************************
1342         dnl *** Checks for IPPROTO_IPV6 ***
1343         dnl *******************************
1344         AC_MSG_CHECKING(for IPPROTO_IPV6)
1345         AC_TRY_COMPILE([#include <netinet/in.h>], [
1346                 int level = IPPROTO_IPV6;
1347         ], [
1348                 # Yes, we have it...
1349                 AC_MSG_RESULT(yes)
1350                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
1351         ], [
1352                 # We'll have to use getprotobyname
1353                 AC_MSG_RESULT(no)
1354         ])
1355
1356         dnl ******************************
1357         dnl *** Checks for IPPROTO_TCP ***
1358         dnl ******************************
1359         AC_MSG_CHECKING(for IPPROTO_TCP)
1360         AC_TRY_COMPILE([#include <netinet/in.h>], [
1361                 int level = IPPROTO_TCP;
1362         ], [
1363                 # Yes, we have it...
1364                 AC_MSG_RESULT(yes)
1365                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
1366         ], [
1367                 # We'll have to use getprotobyname
1368                 AC_MSG_RESULT(no)
1369         ])
1370
1371         dnl *****************************
1372         dnl *** Checks for SOL_IP     ***
1373         dnl *****************************
1374         AC_MSG_CHECKING(for SOL_IP)
1375         AC_TRY_COMPILE([#include <netdb.h>], [
1376                 int level = SOL_IP;
1377         ], [
1378                 # Yes, we have it...
1379                 AC_MSG_RESULT(yes)
1380                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
1381         ], [
1382                 # We'll have to use getprotobyname
1383                 AC_MSG_RESULT(no)
1384         ])
1385
1386         dnl *****************************
1387         dnl *** Checks for SOL_IPV6     ***
1388         dnl *****************************
1389         AC_MSG_CHECKING(for SOL_IPV6)
1390         AC_TRY_COMPILE([#include <netdb.h>], [
1391                 int level = SOL_IPV6;
1392         ], [
1393                 # Yes, we have it...
1394                 AC_MSG_RESULT(yes)
1395                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
1396         ], [
1397                 # We'll have to use getprotobyname
1398                 AC_MSG_RESULT(no)
1399         ])
1400
1401         dnl *****************************
1402         dnl *** Checks for SOL_TCP    ***
1403         dnl *****************************
1404         AC_MSG_CHECKING(for SOL_TCP)
1405         AC_TRY_COMPILE([#include <netdb.h>], [
1406                 int level = SOL_TCP;
1407         ], [
1408                 # Yes, we have it...
1409                 AC_MSG_RESULT(yes)
1410                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
1411         ], [
1412                 # We'll have to use getprotobyname
1413                 AC_MSG_RESULT(no)
1414         ])
1415
1416         dnl *****************************
1417         dnl *** Checks for IP_PKTINFO ***
1418         dnl *****************************
1419         AC_MSG_CHECKING(for IP_PKTINFO)
1420         AC_TRY_COMPILE([#include <linux/in.h>], [
1421                 int level = IP_PKTINFO;
1422         ], [
1423                 # Yes, we have it...
1424                 AC_MSG_RESULT(yes)
1425                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1426         ], [
1427                 AC_MSG_RESULT(no)
1428         ])
1429
1430         dnl *****************************
1431         dnl *** Checks for IPV6_PKTINFO ***
1432         dnl *****************************
1433         AC_MSG_CHECKING(for IPV6_PKTINFO)
1434         AC_TRY_COMPILE([#include <netdb.h>], [
1435                 int level = IPV6_PKTINFO;
1436         ], [
1437                 # Yes, we have it...
1438                 AC_MSG_RESULT(yes)
1439                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
1440         ], [
1441                 AC_MSG_RESULT(no)
1442         ])
1443
1444         dnl **********************************
1445         dnl *** Checks for IP_DONTFRAG     ***
1446         dnl **********************************
1447         AC_MSG_CHECKING(for IP_DONTFRAG)
1448         AC_TRY_COMPILE([#include <netinet/in.h>], [
1449                 int level = IP_DONTFRAG;
1450         ], [
1451                 # Yes, we have it...
1452                 AC_MSG_RESULT(yes)
1453                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
1454         ], [
1455                 AC_MSG_RESULT(no)
1456         ])
1457
1458         dnl **********************************
1459         dnl *** Checks for IP_DONTFRAGMENT ***
1460         dnl **********************************
1461         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
1462         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
1463                 int level = IP_DONTFRAGMENT;
1464         ], [
1465                 # Yes, we have it...
1466                 AC_MSG_RESULT(yes)
1467                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
1468         ], [
1469                 AC_MSG_RESULT(no)
1470         ])
1471
1472         dnl **********************************
1473         dnl *** Checks for IP_MTU_DISCOVER ***
1474         dnl **********************************
1475         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
1476         AC_TRY_COMPILE([#include <linux/in.h>], [
1477                 int level = IP_MTU_DISCOVER;
1478         ], [
1479                 # Yes, we have it...
1480                 AC_MSG_RESULT(yes)
1481                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
1482         ], [
1483                 AC_MSG_RESULT(no)
1484         ])
1485
1486         dnl **********************************
1487         dnl *** Checks for  IP_PMTUDISC_DO ***
1488         dnl **********************************
1489         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
1490         AC_TRY_COMPILE([#include <linux/in.h>], [
1491                 int level = IP_PMTUDISC_DO;
1492         ], [
1493                 # Yes, we have it...
1494                 AC_MSG_RESULT(yes)
1495                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
1496         ], [
1497                 AC_MSG_RESULT(no)
1498         ])
1499
1500         dnl *********************************
1501         dnl *** Check for struct ip_mreqn ***
1502         dnl *********************************
1503         AC_MSG_CHECKING(for struct ip_mreqn)
1504         AC_TRY_COMPILE([#include <netinet/in.h>], [
1505                 struct ip_mreqn mreq;
1506                 mreq.imr_address.s_addr = 0;
1507         ], [
1508                 # Yes, we have it...
1509                 AC_MSG_RESULT(yes)
1510                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
1511         ], [
1512                 # We'll just have to try and use struct ip_mreq
1513                 AC_MSG_RESULT(no)
1514                 AC_MSG_CHECKING(for struct ip_mreq)
1515                 AC_TRY_COMPILE([#include <netinet/in.h>], [
1516                         struct ip_mreq mreq;
1517                         mreq.imr_interface.s_addr = 0;
1518                 ], [
1519                         # Yes, we have it...
1520                         AC_MSG_RESULT(yes)
1521                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
1522                 ], [
1523                         # No multicast support
1524                         AC_MSG_RESULT(no)
1525                 ])
1526         ])
1527         
1528         dnl **********************************
1529         dnl *** Check for getaddrinfo ***
1530         dnl **********************************
1531         AC_MSG_CHECKING(for getaddrinfo)
1532                 AC_TRY_LINK([
1533                 #include <stdio.h>
1534                 #include <netdb.h>
1535         ], [
1536                 getaddrinfo(NULL,NULL,NULL,NULL);
1537         ], [
1538                 # Yes, we have it...
1539                 AC_MSG_RESULT(yes)
1540                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
1541         ], [
1542                 AC_MSG_RESULT(no)
1543         ])
1544
1545         dnl **********************************
1546         dnl *** Check for gethostbyname2_r ***
1547         dnl **********************************
1548         AC_MSG_CHECKING(for gethostbyname2_r)
1549                 AC_TRY_LINK([
1550                 #include <stdio.h>
1551                 #include <netdb.h>
1552         ], [
1553
1554                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
1555         ], [
1556                 # Yes, we have it...
1557                 AC_MSG_RESULT(yes)
1558                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
1559         ], [
1560                 AC_MSG_RESULT(no)
1561         ])
1562
1563         dnl **********************************
1564         dnl *** Check for gethostbyname2 ***
1565         dnl **********************************
1566         AC_MSG_CHECKING(for gethostbyname2)
1567                 AC_TRY_LINK([
1568                 #include <stdio.h>
1569                 #include <netdb.h>
1570         ], [
1571                 gethostbyname2(NULL,0);
1572         ], [
1573                 # Yes, we have it...
1574                 AC_MSG_RESULT(yes)
1575                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
1576         ], [
1577                 AC_MSG_RESULT(no)
1578         ])
1579
1580         dnl **********************************
1581         dnl *** Check for gethostbyname ***
1582         dnl **********************************
1583         AC_MSG_CHECKING(for gethostbyname)
1584                 AC_TRY_LINK([
1585                 #include <stdio.h>
1586                 #include <netdb.h>
1587         ], [
1588                 gethostbyname(NULL);
1589         ], [
1590                 # Yes, we have it...
1591                 AC_MSG_RESULT(yes)
1592                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
1593         ], [
1594                 AC_MSG_RESULT(no)
1595         ])
1596
1597         dnl **********************************
1598         dnl *** Check for getprotobyname ***
1599         dnl **********************************
1600         AC_MSG_CHECKING(for getprotobyname)
1601                 AC_TRY_LINK([
1602                 #include <stdio.h>
1603                 #include <netdb.h>
1604         ], [
1605                 getprotobyname(NULL);
1606         ], [
1607                 # Yes, we have it...
1608                 AC_MSG_RESULT(yes)
1609                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
1610         ], [
1611                 AC_MSG_RESULT(no)
1612         ])
1613
1614         dnl **********************************
1615         dnl *** Check for getnameinfo ***
1616         dnl **********************************
1617         AC_MSG_CHECKING(for getnameinfo)
1618                 AC_TRY_LINK([
1619                 #include <stdio.h>
1620                 #include <netdb.h>
1621         ], [
1622                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
1623         ], [
1624                 # Yes, we have it...
1625                 AC_MSG_RESULT(yes)
1626                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
1627         ], [
1628                 AC_MSG_RESULT(no)
1629         ])
1630
1631
1632         dnl **********************************
1633         dnl *** Check for inet_ntop ***
1634         dnl **********************************
1635         AC_MSG_CHECKING(for inet_ntop)
1636                 AC_TRY_LINK([
1637                 #include <stdio.h>
1638                 #include <arpa/inet.h>
1639         ], [
1640                 inet_ntop (0, NULL, NULL, 0);
1641         ], [
1642                 # Yes, we have it...
1643                 AC_MSG_RESULT(yes)
1644                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
1645         ], [
1646                 AC_MSG_RESULT(no)
1647         ])
1648
1649         dnl *****************************
1650         dnl *** Checks for libnsl     ***
1651         dnl *****************************
1652         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
1653
1654         AC_CHECK_FUNCS(inet_pton inet_aton)
1655
1656         dnl *****************************
1657         dnl *** Checks for libxnet    ***
1658         dnl *****************************
1659         case "${host}" in
1660                 *solaris* )
1661                         AC_MSG_CHECKING(for Solaris XPG4 support)
1662                         if test -f /usr/lib/libxnet.so; then
1663                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
1664                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
1665                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
1666                                 LIBS="$LIBS -lxnet"
1667                                 AC_MSG_RESULT(yes)
1668                         else
1669                                 AC_MSG_RESULT(no)
1670                         fi
1671
1672                         if test "$GCC" = "yes"; then
1673                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
1674                         fi
1675                 ;;
1676         esac
1677
1678         dnl *****************************
1679         dnl *** Checks for libpthread ***
1680         dnl *****************************
1681 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
1682 # and libpthread does not exist
1683 #
1684         case "${host}" in
1685                 *-*-*freebsd*)
1686                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
1687                 ;;
1688                 *-*-*openbsd*)
1689                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
1690                 ;;
1691                 *)
1692                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
1693                 ;;
1694         esac
1695         AC_CHECK_HEADERS(pthread.h)
1696         AC_CHECK_HEADERS(pthread_np.h)
1697         AC_CHECK_FUNCS(pthread_mutex_timedlock)
1698         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np)
1699         AC_CHECK_FUNCS(pthread_kill)
1700         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
1701         AC_TRY_COMPILE([ #include <pthread.h>], [
1702                 pthread_mutexattr_t attr;
1703                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
1704         ], [
1705                 AC_MSG_RESULT(ok)
1706         ], [
1707                 AC_MSG_RESULT(no)
1708                 AC_ERROR(Posix system lacks support for recursive mutexes)
1709         ])
1710         AC_CHECK_FUNCS(pthread_attr_setstacksize)
1711         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
1712         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
1713
1714         dnl **********************************
1715         dnl *** Check for mincore ***
1716         dnl **********************************
1717         AC_MSG_CHECKING(for mincore)
1718                 AC_TRY_LINK([
1719                 #include <stdio.h>
1720                 #include <sys/types.h>
1721                 #include <sys/mman.h>
1722         ], [
1723                 mincore(NULL, 0, NULL);
1724         ], [
1725                 # Yes, we have it...
1726                 AC_MSG_RESULT(yes)
1727                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
1728         ], [
1729                 AC_MSG_RESULT(no)
1730         ])
1731
1732         dnl ***********************************
1733         dnl *** Checks for working __thread ***
1734         dnl ***********************************
1735         AC_MSG_CHECKING(for working __thread)
1736         if test "x$with_tls" != "x__thread"; then
1737                 AC_MSG_RESULT(disabled)
1738         elif test "x$cross_compiling" = "xyes"; then
1739                 AC_MSG_RESULT(cross compiling, assuming yes)
1740         else
1741                 AC_TRY_RUN([
1742                         #if defined(__APPLE__) && defined(__clang__)
1743                         #error "__thread does not currently work with clang on Mac OS X"
1744                         #endif
1745                         
1746                         #include <pthread.h>
1747                         __thread int i;
1748                         static int res1, res2;
1749
1750                         void thread_main (void *arg)
1751                         {
1752                                 i = arg;
1753                                 sleep (1);
1754                                 if (arg == 1)
1755                                         res1 = (i == arg);
1756                                 else
1757                                         res2 = (i == arg);
1758                         }
1759
1760                         int main () {
1761                                 pthread_t t1, t2;
1762
1763                                 i = 5;
1764
1765                                 pthread_create (&t1, NULL, thread_main, 1);
1766                                 pthread_create (&t2, NULL, thread_main, 2);
1767
1768                                 pthread_join (t1, NULL);
1769                                 pthread_join (t2, NULL);
1770
1771                                 return !(res1 + res2 == 2);
1772                         }
1773                 ], [
1774                                 AC_MSG_RESULT(yes)
1775                 ], [
1776                                 AC_MSG_RESULT(no)
1777                                 with_tls=pthread
1778                 ])
1779         fi
1780
1781         dnl **************************************
1782         dnl *** Checks for working sigaltstack ***
1783         dnl **************************************
1784         AC_MSG_CHECKING(for working sigaltstack)
1785         if test "x$with_sigaltstack" != "xyes"; then
1786                 AC_MSG_RESULT(disabled)
1787         elif test "x$cross_compiling" = "xyes"; then
1788                 AC_MSG_RESULT(cross compiling, assuming yes)
1789         else
1790                 AC_TRY_RUN([
1791                         #include <stdio.h>
1792                         #include <stdlib.h>
1793                         #include <unistd.h>
1794                         #include <signal.h>
1795                         #include <pthread.h>
1796                         #include <sys/wait.h>
1797                         #if defined(__FreeBSD__) || defined(__NetBSD__)
1798                         #define SA_STACK SA_ONSTACK
1799                         #endif
1800                         static void
1801                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
1802                         {
1803                                 exit (0);
1804                         }
1805
1806                         volatile char*__ptr = NULL;
1807                         static void *
1808                         loop (void *ignored)
1809                         {
1810                                 *__ptr = 0;
1811                                 return NULL;
1812                         }
1813
1814                         static void
1815                         child ()
1816                         {
1817                                 struct sigaction sa;
1818                         #ifdef __APPLE__
1819                                 stack_t sas;
1820                         #else
1821                                 struct sigaltstack sas;
1822                         #endif
1823                                 pthread_t id;
1824                                 pthread_attr_t attr;
1825
1826                                 sa.sa_sigaction = sigsegv_signal_handler;
1827                                 sigemptyset (&sa.sa_mask);
1828                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
1829                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
1830                                         perror ("sigaction");
1831                                         return;
1832                                 }
1833
1834                                 /* x86 darwin deliver segfaults using SIGBUS */
1835                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
1836                                         perror ("sigaction");
1837                                         return;
1838                                 }
1839                                 sas.ss_sp = malloc (SIGSTKSZ);
1840                                 sas.ss_size = SIGSTKSZ;
1841                                 sas.ss_flags = 0;
1842                                 if (sigaltstack (&sas, NULL) == -1) {
1843                                         perror ("sigaltstack");
1844                                         return;
1845                                 }
1846
1847                                 pthread_attr_init (&attr);
1848                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
1849                                         printf ("pthread_create\n");
1850                                         return;
1851                                 }
1852
1853                                 sleep (100);
1854                         }
1855
1856                         int
1857                         main ()
1858                         {
1859                                 pid_t son;
1860                                 int status;
1861                                 int i;
1862
1863                                 son = fork ();
1864                                 if (son == -1) {
1865                                         return 1;
1866                                 }
1867
1868                                 if (son == 0) {
1869                                         child ();
1870                                         return 0;
1871                                 }
1872
1873                                 for (i = 0; i < 300; ++i) {
1874                                         waitpid (son, &status, WNOHANG);
1875                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
1876                                                 return 0;
1877                                         usleep (10000);
1878                                 }
1879
1880                                 kill (son, SIGKILL);
1881                                 return 1;
1882                         }
1883
1884                 ], [
1885                                 AC_MSG_RESULT(yes)
1886                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
1887                 ], [
1888                                 with_sigaltstack=no
1889                                 AC_MSG_RESULT(no)
1890                 ])
1891         fi
1892
1893         dnl ********************************
1894         dnl *** Checks for semaphore lib ***
1895         dnl ********************************
1896         # 'Real Time' functions on Solaris
1897         # posix4 on Solaris 2.6
1898         # pthread (first!) on Linux
1899         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
1900
1901         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
1902         AC_CHECK_FUNCS(shm_open)
1903
1904         dnl ********************************
1905         dnl *** Checks for timezone stuff **
1906         dnl ********************************
1907         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
1908                 AC_TRY_COMPILE([
1909                         #include <time.h>
1910                         ], [
1911                         struct tm tm;
1912                         tm.tm_gmtoff = 1;
1913                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
1914         if test $ac_cv_struct_tm_gmtoff = yes; then
1915                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
1916         else
1917                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
1918                         AC_TRY_COMPILE([
1919                                 #include <time.h>
1920                         ], [
1921                                 timezone = 1;
1922                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
1923                 if test $ac_cv_var_timezone = yes; then
1924                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
1925                 else
1926                         AC_ERROR(unable to find a way to determine timezone)
1927                 fi
1928         fi
1929
1930         dnl *********************************
1931         dnl *** Checks for math functions ***
1932         dnl *********************************
1933         AC_SEARCH_LIBS(sqrtf, m)
1934         if test "x$has_broken_apple_cpp" != "xyes"; then
1935                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
1936                         AC_TRY_LINK([#include <math.h>], 
1937                         [ finite(0.0); ], 
1938                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
1939                         AC_MSG_RESULT(no)))
1940         fi
1941         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
1942                 AC_TRY_LINK([#include <math.h>], 
1943                 [ isfinite(0.0); ], 
1944                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
1945                 AC_MSG_RESULT(no)))
1946
1947         dnl ****************************************************************
1948         dnl *** Checks for working poll() (macosx defines it but doesn't ***
1949         dnl *** have it in the library (duh))                            ***
1950         dnl ****************************************************************
1951         AC_CHECK_FUNCS(poll)
1952
1953         dnl *************************
1954         dnl *** Check for signbit ***
1955         dnl *************************
1956         AC_MSG_CHECKING(for signbit)
1957         AC_TRY_LINK([#include <math.h>], [
1958                 int s = signbit(1.0);
1959         ], [
1960                 AC_MSG_RESULT(yes)
1961                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
1962         ], [
1963                 AC_MSG_RESULT(no)
1964         ]) 
1965
1966         dnl **********************************
1967         dnl *** epoll                      ***
1968         dnl **********************************
1969         if test "x$ac_cv_header_nacl_nacl_dyncode_h" = "xno"; then
1970                 AC_CHECK_HEADERS(sys/epoll.h)
1971                 haveepoll=no
1972                 AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
1973                 if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
1974                         AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
1975                 fi
1976         fi
1977
1978         havekqueue=no
1979
1980         AC_CHECK_HEADERS(sys/event.h)
1981         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
1982
1983         dnl **************************************
1984         dnl * Darwin has a race that prevents us from using reliably:
1985         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
1986         dnl * Since kqueue is mostly used for scaling large web servers, 
1987         dnl * and very few folks run Mono on large web servers on OSX, falling
1988         dnl * back 
1989         dnl **************************************
1990         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
1991                 if test "x$platform_darwin" = "xno"; then
1992                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
1993                 fi
1994         fi
1995
1996         dnl ******************************
1997         dnl *** Checks for SIOCGIFCONF ***
1998         dnl ******************************
1999         AC_CHECK_HEADERS(sys/ioctl.h)
2000         AC_CHECK_HEADERS(net/if.h, [], [],
2001            [
2002            #ifdef HAVE_SYS_TYPES_H
2003            # include <sys/types.h>
2004            #endif
2005            #ifdef HAVE_SYS_SOCKET_H
2006            # include <sys/socket.h>
2007            #endif
2008            ])
2009         AC_MSG_CHECKING(for ifreq)
2010         AC_TRY_COMPILE([
2011                 #include <stdio.h>
2012                 #include <sys/ioctl.h>
2013                 #include <net/if.h>
2014                 ], [
2015                 struct ifconf ifc;
2016                 struct ifreq *ifr;
2017                 void *x;
2018                 ifc.ifc_len = 0;
2019                 ifc.ifc_buf = NULL;
2020                 x = (void *) &ifr->ifr_addr;
2021                 ],[
2022                         AC_MSG_RESULT(yes)
2023                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2024                 ], [
2025                         AC_MSG_RESULT(no)
2026                 ])
2027         dnl **********************************
2028         dnl ***     Checks for sin_len     ***
2029         dnl **********************************
2030         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2031         AC_TRY_COMPILE([
2032                 #include <netinet/in.h>
2033                 ], [
2034                 struct sockaddr_in saddr;
2035                 saddr.sin_len = sizeof (saddr);
2036                 ],[
2037                         AC_MSG_RESULT(yes)
2038                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2039                 ], [
2040                         AC_MSG_RESULT(no)
2041                 ])      
2042         dnl **********************************
2043         dnl ***    Checks for sin6_len     ***
2044         dnl **********************************
2045         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2046         AC_TRY_COMPILE([
2047                 #include <netinet/in.h>
2048                 ], [
2049                 struct sockaddr_in6 saddr6;
2050                 saddr6.sin6_len = sizeof (saddr6);
2051                 ],[
2052                         AC_MSG_RESULT(yes)
2053                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2054                 ], [
2055                         AC_MSG_RESULT(no)
2056                 ])
2057         dnl **********************************
2058         dnl *** Check for getifaddrs       ***
2059         dnl **********************************
2060         AC_MSG_CHECKING(for getifaddrs)
2061                 AC_TRY_LINK([
2062                 #include <stdio.h>
2063                 #include <sys/types.h>
2064                 #include <sys/socket.h>
2065                 #include <ifaddrs.h>
2066         ], [
2067                 getifaddrs(NULL);
2068         ], [
2069                 # Yes, we have it...
2070                 AC_MSG_RESULT(yes)
2071                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2072         ], [
2073                 AC_MSG_RESULT(no)
2074         ])
2075         dnl **********************************
2076         dnl *** Check for if_nametoindex   ***
2077         dnl **********************************
2078         AC_MSG_CHECKING(for if_nametoindex)
2079                 AC_TRY_LINK([
2080                 #include <stdio.h>
2081                 #include <sys/types.h>
2082                 #include <sys/socket.h>
2083                 #include <net/if.h>
2084         ], [
2085                 if_nametoindex(NULL);
2086         ], [
2087                 # Yes, we have it...
2088                 AC_MSG_RESULT(yes)
2089                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2090         ], [
2091                 AC_MSG_RESULT(no)
2092         ])
2093                         
2094         dnl **********************************
2095         dnl *** Checks for MonoPosixHelper ***
2096         dnl **********************************
2097         AC_CHECK_HEADERS(checklist.h)
2098         AC_CHECK_HEADERS(pathconf.h)
2099         AC_CHECK_HEADERS(fstab.h)
2100         AC_CHECK_HEADERS(attr/xattr.h)
2101         AC_CHECK_HEADERS(sys/extattr.h)
2102         AC_CHECK_HEADERS(sys/sendfile.h)
2103         AC_CHECK_HEADERS(sys/statvfs.h)
2104         AC_CHECK_HEADERS(sys/statfs.h)
2105         AC_CHECK_HEADERS(sys/vfstab.h)
2106         AC_CHECK_HEADERS(sys/xattr.h)
2107         AC_CHECK_HEADERS(sys/mman.h)
2108         AC_CHECK_HEADERS(sys/param.h)
2109         AC_CHECK_HEADERS(sys/mount.h, [], [],
2110                 [
2111                 #ifdef HAVE_SYS_PARAM_H
2112                 # include <sys/param.h>
2113                 #endif
2114                 ])
2115         AC_CHECK_HEADERS(sys/mount.h)
2116         AC_CHECK_FUNCS(confstr)
2117         AC_CHECK_FUNCS(seekdir telldir)
2118         AC_CHECK_FUNCS(getdomainname)
2119         AC_CHECK_FUNCS(setdomainname)
2120         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2121         AC_CHECK_FUNCS(setgroups)
2122         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2123         AC_CHECK_FUNCS(getfsstat)
2124         AC_CHECK_FUNCS(lutimes futimes)
2125         AC_CHECK_FUNCS(mremap)
2126         AC_CHECK_FUNCS(remap_file_pages)
2127         AC_CHECK_FUNCS(posix_fadvise)
2128         AC_CHECK_FUNCS(posix_fallocate)
2129         AC_CHECK_FUNCS(posix_madvise)
2130         AC_CHECK_FUNCS(vsnprintf)
2131         AC_CHECK_FUNCS(sendfile)
2132         AC_CHECK_FUNCS(gethostid sethostid)
2133         AC_CHECK_FUNCS(sethostname)
2134         AC_CHECK_FUNCS(statfs)
2135         AC_CHECK_FUNCS(fstatfs)
2136         AC_CHECK_FUNCS(statvfs)
2137         AC_CHECK_FUNCS(fstatvfs)
2138         AC_CHECK_FUNCS(stime)
2139         AC_CHECK_FUNCS(strerror_r)
2140         AC_CHECK_FUNCS(ttyname_r)
2141         AC_CHECK_FUNCS(psignal)
2142         AC_CHECK_FUNCS(getlogin_r)
2143         AC_CHECK_FUNCS(lockf)
2144         AC_CHECK_FUNCS(swab)
2145         AC_CHECK_FUNCS(setusershell endusershell)
2146         AC_CHECK_FUNCS(futimens utimensat)
2147         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2148         AC_CHECK_FUNCS(readv writev preadv pwritev)
2149         AC_CHECK_FUNCS(setpgid)
2150         AC_CHECK_SIZEOF(size_t)
2151         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2152                 [#include <sys/types.h>
2153                  #include <sys/stat.h>
2154                  #include <unistd.h>])
2155         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2156                 [#include <sys/types.h>
2157                  #include <sys/stat.h>
2158                  #include <unistd.h>])
2159         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2160                 [#include <sys/time.h>])
2161         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2162                 [#include <unistd.h>
2163                  #include <fcntl.h>])
2164         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2165                 [#include <sys/uio.h>])
2166         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2167                 [#include <sys/poll.h>])
2168         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2169                 [#include <sys/types.h>
2170                  #include <sys/stat.h>
2171                  #include <unistd.h>])
2172         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2173                 [#include <time.h>])
2174         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2175                 [#include <sys/time.h>
2176                  #include <sys/types.h>
2177                  #include <utime.h>])
2178         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2179                 [#include <sys/time.h>])
2180         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2181                 [#include <sys/types.h>
2182                  #include <utime.h>])
2183         AC_CHECK_MEMBERS(
2184                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2185                 [#include <sys/types.h>
2186                  #include <dirent.h>])
2187         AC_CHECK_MEMBERS(
2188                 [struct passwd.pw_gecos],,, 
2189                 [#include <sys/types.h>
2190                  #include <pwd.h>])
2191         AC_CHECK_MEMBERS(
2192                 [struct statfs.f_flags],,, 
2193                 [#include <sys/types.h>
2194                  #include <sys/vfs.h>])
2195         AC_CHECK_MEMBERS(
2196                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_ctim],,, 
2197                 [#include <sys/types.h>
2198                  #include <sys/stat.h>
2199                  #include <unistd.h>])
2200
2201         dnl Favour xattr through glibc, but use libattr if we have to
2202         AC_CHECK_FUNC(lsetxattr, ,
2203                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2204         )
2205         AC_SUBST(XATTR_LIB)
2206
2207         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2208         AC_CHECK_MEMBERS(
2209                 [struct kinfo_proc.kp_proc],,, 
2210                 [#include <sys/types.h>
2211                  #include <sys/param.h>
2212                  #include <sys/sysctl.h>
2213                  #include <sys/proc.h>
2214                  ])
2215
2216         dnl *********************************
2217         dnl *** Checks for Windows compilation ***
2218         dnl *********************************
2219         AC_CHECK_HEADERS(sys/time.h)
2220         AC_CHECK_HEADERS(sys/param.h)
2221         AC_CHECK_HEADERS(dirent.h)
2222
2223         dnl ******************************************
2224         dnl *** Checks for OSX and iOS compilation ***
2225         dnl ******************************************
2226         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2227
2228         dnl *********************************
2229         dnl *** Check for Console 2.0 I/O ***
2230         dnl *********************************
2231         AC_CHECK_HEADERS([curses.h])
2232         AC_CHECK_HEADERS([term.h], [], [],
2233         [#if HAVE_CURSES_H
2234          #include <curses.h>
2235          #endif
2236         ])
2237         AC_CHECK_HEADERS([termios.h])
2238
2239         dnl * This is provided in io-layer, but on windows it's only available
2240         dnl * on xp+
2241         AC_DEFINE(HAVE_GETPROCESSID, 1, [Define if GetProcessId is available])
2242 else
2243         dnl *********************************
2244         dnl *** Checks for Windows compilation ***
2245         dnl *********************************
2246         AC_CHECK_HEADERS(winternl.h)
2247
2248         jdk_headers_found=no
2249         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
2250         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
2251         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
2252         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
2253         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
2254         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
2255         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
2256
2257         dnl *********************************
2258         dnl *** Check for struct ip_mreqn ***
2259         dnl *********************************
2260         AC_MSG_CHECKING(for struct ip_mreqn)
2261         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2262                 struct ip_mreqn mreq;
2263                 mreq.imr_address.s_addr = 0;
2264         ], [
2265                 # Yes, we have it...
2266                 AC_MSG_RESULT(yes)
2267                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
2268         ], [
2269                 # We'll just have to try and use struct ip_mreq
2270                 AC_MSG_RESULT(no)
2271                 AC_MSG_CHECKING(for struct ip_mreq)
2272                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2273                         struct ip_mreq mreq;
2274                         mreq.imr_interface.s_addr = 0;
2275                 ], [
2276                         # Yes, we have it...
2277                         AC_MSG_RESULT(yes)
2278                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
2279                 ], [
2280                         # No multicast support
2281                         AC_MSG_RESULT(no)
2282                 ])
2283         ])
2284
2285         dnl **********************************
2286         dnl *** Check for getaddrinfo ***
2287         dnl **********************************
2288         AC_MSG_CHECKING(for getaddrinfo)
2289                 AC_TRY_LINK([
2290                 #include <stdio.h>
2291                 #include <winsock2.h>
2292                 #include <ws2tcpip.h>
2293         ], [
2294                 getaddrinfo(NULL,NULL,NULL,NULL);
2295         ], [
2296                 # Yes, we have it...
2297                 AC_MSG_RESULT(yes)
2298                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2299         ], [
2300                 AC_MSG_RESULT(no)
2301         ])
2302
2303         dnl **********************************
2304         dnl *** Check for gethostbyname ***
2305         dnl **********************************
2306         AC_MSG_CHECKING(for gethostbyname)
2307                 AC_TRY_LINK([
2308                 #include <stdio.h>
2309                 #include <winsock2.h>
2310                 #include <ws2tcpip.h>
2311         ], [
2312                 gethostbyname(NULL);
2313         ], [
2314                 # Yes, we have it...
2315                 AC_MSG_RESULT(yes)
2316                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2317         ], [
2318                 AC_MSG_RESULT(no)
2319         ])
2320
2321         dnl **********************************
2322         dnl *** Check for getprotobyname ***
2323         dnl **********************************
2324         AC_MSG_CHECKING(for getprotobyname)
2325                 AC_TRY_LINK([
2326                 #include <stdio.h>
2327                 #include <winsock2.h>
2328                 #include <ws2tcpip.h>
2329         ], [
2330                 getprotobyname(NULL);
2331         ], [
2332                 # Yes, we have it...
2333                 AC_MSG_RESULT(yes)
2334                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2335         ], [
2336                 AC_MSG_RESULT(no)
2337         ])
2338
2339         dnl **********************************
2340         dnl *** Check for getnameinfo ***
2341         dnl **********************************
2342         AC_MSG_CHECKING(for getnameinfo)
2343                 AC_TRY_LINK([
2344                 #include <stdio.h>
2345                 #include <winsock2.h>
2346                 #include <ws2tcpip.h>
2347         ], [
2348                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2349         ], [
2350                 # Yes, we have it...
2351                 AC_MSG_RESULT(yes)
2352                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2353         ], [
2354                 AC_MSG_RESULT(no)
2355         ])
2356
2357         dnl **********************************
2358         dnl *** Check for inet_ntop ***
2359         dnl **********************************
2360         AC_MSG_CHECKING(for inet_ntop)
2361                 AC_TRY_LINK([
2362                 #include <stdio.h>
2363                 #include <winsock2.h>
2364                 #include <ws2tcpip.h>
2365         ], [
2366                 inet_ntop (0, NULL, NULL, 0);
2367         ], [
2368                 # Yes, we have it...
2369                 AC_MSG_RESULT(yes)
2370                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2371         ], [
2372                 AC_MSG_RESULT(no)
2373         ])
2374
2375         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
2376         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
2377         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
2378         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
2379         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
2380         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
2381         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
2382
2383         AC_MSG_CHECKING(for GetProcessId)
2384         AC_TRY_COMPILE([#include <windows.h>], [
2385                 GetProcessId (0);
2386         ], [
2387            AC_MSG_RESULT(yes)
2388            AC_DEFINE(HAVE_GETPROCESSID)
2389         ], [
2390            AC_MSG_RESULT(no)
2391         ])
2392 fi
2393
2394 dnl socklen_t check
2395 AC_MSG_CHECKING(for socklen_t)
2396 AC_TRY_COMPILE([
2397 #include <sys/types.h>
2398 #include <sys/socket.h>
2399 ],[
2400   socklen_t foo;
2401 ],[
2402 ac_cv_c_socklen_t=yes
2403         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
2404         AC_MSG_RESULT(yes)
2405 ],[
2406         AC_MSG_RESULT(no)
2407 ])
2408
2409 AC_MSG_CHECKING(for array element initializer support)
2410 AC_TRY_COMPILE([#include <sys/socket.h>], [
2411         const int array[] = {[1] = 2,};
2412 ], [
2413         # Yes, we have it...
2414         AC_MSG_RESULT(yes)
2415         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
2416 ], [
2417         # We'll have to use signals
2418         AC_MSG_RESULT(no)
2419 ])
2420
2421 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
2422         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
2423         AC_TRY_LINK([#include <math.h>], 
2424         [ static void *p = &trunc; ],
2425         [
2426                 AC_DEFINE(HAVE_TRUNC) 
2427                 AC_MSG_RESULT(yes)
2428                 ac_cv_trunc=yes
2429         ],
2430         AC_MSG_RESULT(no)))
2431
2432 if test "x$ac_cv_truncl" != "xyes"; then
2433    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
2434 fi
2435
2436 AC_CHECK_FUNCS(round)
2437 AC_CHECK_FUNCS(rint)
2438 AC_CHECK_FUNCS(execvp)
2439
2440 dnl ****************************
2441 dnl *** Look for /dev/random ***
2442 dnl ****************************
2443
2444 AC_MSG_CHECKING([if usage of random device is requested])
2445 AC_ARG_ENABLE(dev-random,
2446 [  --disable-dev-random    disable the use of the random device (enabled by default)],
2447 try_dev_random=$enableval, try_dev_random=yes)
2448
2449 AC_MSG_RESULT($try_dev_random)
2450
2451 case "{$build}" in
2452     *-openbsd*)
2453     NAME_DEV_RANDOM="/dev/srandom"
2454     ;;
2455
2456 dnl Win32 does not have /dev/random, they have their own method...
2457
2458     *-mingw*|*-*-cygwin*)
2459     ac_cv_have_dev_random=no
2460     ;;
2461
2462 dnl Everywhere else, it's /dev/random
2463
2464     *)
2465     NAME_DEV_RANDOM="/dev/random"
2466     ;;
2467 esac
2468
2469 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
2470
2471 dnl Now check if the device actually exists
2472
2473 if test "x$try_dev_random" = "xyes"; then
2474     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
2475     [if test -r "$NAME_DEV_RANDOM" ; then
2476         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
2477     if test "x$ac_cv_have_dev_random" = "xyes"; then
2478         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
2479     fi
2480 else
2481     AC_MSG_CHECKING(for random device)
2482     ac_cv_have_dev_random=no
2483     AC_MSG_RESULT(has been disabled)
2484 fi
2485
2486 if test "x$host_win32" = "xyes"; then
2487     AC_DEFINE(HAVE_CRYPT_RNG)
2488 fi
2489
2490 if test "x$ac_cv_have_dev_random" = "xno" \
2491     && test "x$host_win32" = "xno"; then
2492     AC_MSG_WARN([[
2493 ***
2494 *** A system-provided entropy source was not found on this system.
2495 *** Because of this, the System.Security.Cryptography random number generator
2496 *** will throw a NotImplemented exception.
2497 ***
2498 *** If you are seeing this message, and you know your system DOES have an
2499 *** entropy collection in place, please contact <crichton@gimp.org> and
2500 *** provide information about the system and how to access the random device.
2501 ***
2502 *** Otherwise you can install either egd or prngd and set the environment
2503 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
2504 ***]])
2505 fi
2506  
2507 AC_MSG_CHECKING([if inter-process shared handles are requested])
2508 # Same as --enable-minimal=shared_handles
2509 AC_ARG_ENABLE(shared-handles, [  --disable-shared-handles disable inter-process shared handles], try_shared_handles=$enableval, try_shared_handles=yes)
2510 AC_MSG_RESULT($try_shared_handles)
2511 if test "x$try_shared_handles" != "xyes"; then
2512         AC_DEFINE(DISABLE_SHARED_HANDLES, 1, [Disable inter-process shared handles])
2513         AC_SUBST(DISABLE_SHARED_HANDLES)
2514 fi
2515
2516 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)
2517
2518 AC_ARG_ENABLE(perf-events, [  --enable-perf-events Enable using `perf` for profiling on Linux], test_perf_events=$enableval, test_perf_events=no)
2519 if test "x$test_perf_events" == "xyes"; then
2520         AC_DEFINE(ENABLE_PERF_EVENTS, 1, [Enable using `perf` for profiling on Linux])
2521         AC_SUBST(ENABLE_PERF_EVENTS)
2522 fi
2523
2524 AC_MSG_CHECKING([if big-arrays are to be enabled])
2525 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)
2526 if test "x$enable_big_arrays" = "xyes" ; then
2527     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
2528         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
2529     else
2530         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
2531     fi
2532 fi
2533 AC_MSG_RESULT($enable_big_arrays)
2534
2535 dnl **************
2536 dnl *** DTRACE ***
2537 dnl **************
2538
2539 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
2540
2541 if test "x$enable_dtrace" = "xyes"; then
2542    if test "x$has_dtrace" = "xno"; then
2543           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
2544    fi
2545    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
2546    if test "x$DTRACE" = "xno"; then
2547           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
2548           enable_dtrace=no
2549    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
2550           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
2551           enable_dtrace=no
2552    fi
2553 fi
2554
2555 dtrace_g=no
2556 if test "x$enable_dtrace" = "xyes"; then
2557         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
2558         DTRACEFLAGS=
2559         if test "x$ac_cv_sizeof_void_p" = "x8"; then
2560                 case "$host" in
2561                         powerpc-*-darwin*)
2562                         DTRACEFLAGS="-arch ppc64"
2563                         ;;
2564                         i*86-*-darwin*)
2565                         DTRACEFLAGS="-arch x86_64"
2566                         ;;
2567                         *)
2568                         DTRACEFLAGS=-64
2569                         ;;
2570                 esac
2571         else
2572                 case "$host" in
2573                         powerpc-*-darwin*)
2574                         DTRACEFLAGS="-arch ppc"
2575                         ;;
2576                         i*86-*-darwin*)
2577                         DTRACEFLAGS="-arch i386"
2578                         ;;
2579                         *)
2580                         DTRACEFLAGS=-32
2581                         ;;
2582                 esac
2583         fi
2584         AC_SUBST(DTRACEFLAGS)
2585         case "$host" in
2586                 *-*-solaris*)
2587                 dtrace_g=yes
2588                 ;;
2589         esac
2590         AC_CHECK_HEADERS([sys/sdt.h])
2591 fi
2592 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
2593 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
2594
2595 dnl **************
2596 dnl ***  NaCl  ***
2597 dnl **************
2598
2599 AC_ARG_ENABLE(nacl_codegen, [  --enable-nacl-codegen      Enable Native Client code generation], enable_nacl_codegen=$enableval, enable_nacl_codegen=no)
2600 AC_ARG_ENABLE(nacl_gc, [  --enable-nacl-gc           Enable Native Client garbage collection], enable_nacl_gc=$enableval, enable_nacl_gc=no)
2601
2602 AM_CONDITIONAL(NACL_CODEGEN, test x$enable_nacl_codegen != xno)
2603
2604 dnl
2605 dnl Hack to use system mono for operations in build/install not allowed in NaCl.
2606 dnl
2607 nacl_self_host=""
2608 if test "x$ac_cv_header_nacl_nacl_dyncode_h" = "xyes"; then
2609    nacl_self_host="nacl_self_host"
2610 fi
2611 AC_SUBST(nacl_self_host)
2612
2613 if test "x$enable_nacl_codegen" = "xyes"; then
2614    MONO_NACL_ALIGN_MASK_OFF=1
2615    AC_DEFINE(TARGET_NACL, 1, [...])
2616    AC_DEFINE(__native_client_codegen__, 1, [...])
2617 else
2618    MONO_NACL_ALIGN_MASK_OFF=0
2619    AC_DEFINE(__default_codegen__, 1, [...])
2620 fi
2621 if test "x$enable_nacl_gc" = "xyes"; then
2622    if test "x$TARGET" = "xAMD64" -o "x$TARGET" = "xX86"; then
2623       INSTRUMENT_CFLAG="-finstrument-for-thread-suspension"
2624    else
2625       # Not yet implemented
2626       INSTRUMENT_CFLAG=""
2627    fi
2628    CPPFLAGS="$CPPFLAGS $INSTRUMENT_CFLAG -D__native_client_gc__"
2629 fi
2630 AC_SUBST(MONO_NACL_ALIGN_MASK_OFF)
2631
2632 dnl **************
2633 dnl ***  LLVM  ***
2634 dnl **************
2635
2636 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=no)
2637 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
2638 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)
2639
2640 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
2641
2642 if test "x$enable_llvm" = "xyes"; then
2643    if test "x$with_llvm" != "x"; then
2644           LLVM_CONFIG=$with_llvm/bin/llvm-config
2645           if test x$target_win32 = xyes; then
2646                 LLVM_CONFIG=$LLVM_CONFIG.exe
2647           fi
2648           if test ! -x $LLVM_CONFIG; then
2649                  AC_MSG_ERROR([LLVM executable $LLVM_CONFIG not found.])
2650       fi
2651    else
2652       AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
2653       if test "x$LLVM_CONFIG" = "xno"; then
2654              AC_MSG_ERROR([llvm-config not found.])
2655       fi
2656    fi
2657
2658    llvm_codegen="x86codegen"
2659    case "$target" in
2660    arm*)
2661                 llvm_codegen="armcodegen"
2662                 ;;
2663    esac
2664
2665    if test "x$target_win32" = "xno"; then
2666
2667    # The output of --cflags seems to include optimizations flags too
2668    LLVM_CFLAGS=`$LLVM_CONFIG --cflags | sed -e 's/-O2//g' | sed -e 's/-O0//g' | sed -e 's/-fomit-frame-pointer//g' | sed -e 's/-fPIC//g'`
2669    # LLVM is compiled with -fno-rtti, so we need this too, since our classes inherit
2670    # from LLVM classes.
2671    LLVM_CXXFLAGS="`$LLVM_CONFIG --cxxflags` -fno-rtti"
2672    LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
2673    # This might include empty lines
2674    LLVM_SYSTEM_LIBS=`$LLVM_CONFIG --system-libs 2>/dev/null | grep -- -`
2675    if test "x$host" != "x$target"; then
2676       # No need for jit libs
2677       LLVM_LIBS=`$LLVM_CONFIG --libs core bitwriter`
2678    else
2679       LLVM_LIBS=`$LLVM_CONFIG --libs core bitwriter jit mcjit $llvm_codegen`
2680    fi
2681    LLVM_LIBS="$LLVM_LIBS $LLVM_LDFLAGS $LLVM_SYSTEM_LIBS -lstdc++"
2682
2683    expected_llvm_version="3.4svn-mono-mono/e656cac"
2684
2685    # Should be something like '2.6' or '2.7svn'
2686    llvm_version=`$LLVM_CONFIG --version`
2687    llvm_api_version=`$LLVM_CONFIG --mono-api-version 2>/dev/null`
2688    AC_MSG_CHECKING(LLVM version)
2689    AC_MSG_RESULT($llvm_version)
2690    if echo $llvm_version | grep -q 'mono'; then
2691           if test "x$enable_llvm_version_check" == "xyes"; then
2692                  if test "$llvm_version" != "$expected_llvm_version"; then
2693                         AC_MSG_ERROR([Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version"])
2694                  fi
2695           fi
2696    else
2697           AC_MSG_ERROR([Compiling with stock LLVM is not supported, please use the Mono LLVM repo at https://github.com/mono/llvm, with the GIT branch which matches this version of mono, i.e. 'mono-2-10' for Mono 2.10.])
2698    fi
2699
2700    else
2701        LLVM_CFLAGS="-I$with_llvm/include -DNDEBUG -D__NO_CTYPE_INLINE -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
2702        LLVM_CXXFLAGS="$LLVM_CFLAGS -std=gnu++11 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -Woverloaded-virtual -Wcast-qual"
2703        LLVM_LDFLAGS="-L$with_llvm/lib"
2704        LLVM_SYSTEM_LIBS="-lshell32 -lpsapi -limagehlp -ldbghelp -lm"
2705        LLVM_LIBS="-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter \
2706          -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo \
2707          -lLLVMARMAsmPrinter -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler \
2708          -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc \
2709          -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMJIT \
2710          -lLLVMIRReader -lLLVMAsmParser -lLLVMLineEditor -lLLVMMCAnalysis -lLLVMInstrumentation \
2711          -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils \
2712          -lLLVMipa -lLLVMAnalysis -lLLVMProfileData -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld \
2713          -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMExecutionEngine -lLLVMMC -lLLVMCore \
2714          -lLLVMSupport -lstdc++"
2715        LLVM_LIBS="$LLVM_LIBS $LLVM_SYSTEM_LIBS"
2716
2717        llvm_config_path=$with_llvm/include/llvm/Config/llvm-config.h
2718        llvm_api_version=`awk '/MONO_API_VERSION/ { print $3 }' $llvm_config_path`
2719    fi  
2720
2721    if test "x$llvm_api_version" = "x"; then
2722           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=0"
2723           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=0"
2724    else
2725           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=$llvm_api_version"
2726           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=$llvm_api_version"
2727    fi   
2728
2729    AC_DEFINE_UNQUOTED(LLVM_VERSION, "$llvm_version", [Full version of LLVM libraties])
2730
2731    AC_SUBST(LLVM_CFLAGS)
2732    AC_SUBST(LLVM_CXXFLAGS)
2733    AC_SUBST(LLVM_LIBS)
2734    AC_SUBST(LLVM_LDFLAGS)
2735    AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
2736 fi
2737
2738 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
2739 if test "x$enable_loadedllvm" = "xyes"; then
2740    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
2741 fi
2742 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
2743
2744 TARGET="unknown"
2745 ACCESS_UNALIGNED="yes"
2746
2747 LIBC="libc.so.6"
2748 INTL="libc.so.6"
2749 SQLITE="libsqlite.so.0"
2750 SQLITE3="libsqlite3.so.0"
2751 X11="libX11.so"
2752 GDKX11="libgdk-x11-2.0.so.0"
2753 GTKX11="libgtk-x11-2.0.so.0"
2754 XINERAMA="libXinerama.so.1"
2755
2756 sizeof_register="SIZEOF_VOID_P"
2757
2758 jit_wanted=true
2759 sgen_supported=false
2760 boehm_supported=true
2761 case "$host" in
2762         mips*)
2763                 TARGET=MIPS;
2764                 arch_target=mips;
2765                 sgen_supported=true
2766                 ACCESS_UNALIGNED="no"
2767
2768                 AC_MSG_CHECKING(for mips n32)
2769                 AC_TRY_COMPILE([],[
2770                 #if _MIPS_SIM != _ABIN32
2771                 #error Not mips n32
2772                 #endif
2773                 return 0;
2774                 ],[
2775                 AC_MSG_RESULT(yes)
2776                 sizeof_register=8
2777                 ],[
2778                 AC_MSG_RESULT(no)
2779                 ])
2780                 ;;
2781         i*86-*-*)
2782                 TARGET=X86;
2783                 arch_target=x86;
2784                 case $host_os in
2785                   solaris*)
2786                         LIBC="libc.so"
2787                         INTL="libintl.so"
2788                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
2789                                 TARGET=AMD64
2790                                 arch_target=amd64
2791                         fi
2792
2793                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
2794                         # int astruct __attribute__ ((visibility ("hidden")));
2795                         # void foo ()
2796                         # {
2797                         #       void *p = &astruct;
2798                         # }
2799                         # gcc -fPIC --shared -o libfoo.so foo.c
2800                         # yields:
2801                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
2802                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
2803                         have_visibility_hidden=no
2804                         sgen_supported=true
2805                         ;;
2806                   mingw*|cygwin*)
2807                         sgen_supported=true
2808                         have_visibility_hidden=no                 
2809                         ;;
2810                   haiku*)
2811                         LIBC=libroot.so
2812                         ;;
2813                   linux*)
2814                         sgen_supported=true
2815                         AOT_SUPPORTED="yes"
2816                         ;;
2817                   darwin*)
2818                         sgen_supported=true
2819                         AOT_SUPPORTED="yes"
2820                         ;;
2821                   openbsd*|freebsd*|kfreebsd-gnu*)
2822                         sgen_supported=true
2823                         ;;
2824                 esac
2825                 ;;
2826         x86_64-*-* | amd64-*-*)
2827                 TARGET=AMD64;
2828                 arch_target=amd64;
2829                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
2830                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
2831                         sizeof_register=8
2832                 fi
2833                 case $host_os in
2834                   linux*)
2835                         sgen_supported=true
2836                         AOT_SUPPORTED="yes"
2837                         ;;
2838                   darwin*)
2839                         sgen_supported=true
2840                         AOT_SUPPORTED="yes"
2841                         ;;
2842                   openbsd*|freebsd*|kfreebsd-gnu*)
2843                         sgen_supported=true
2844                         ;;
2845                   mingw*)
2846                         sgen_supported=true
2847                         ;;
2848                 esac
2849                 case "$host" in
2850                         x86_64-*-nacl*)
2851                                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
2852                                 sizeof_register=8
2853                                 ;;
2854                 esac
2855                 ;;
2856         ia64-*-*)
2857                 TARGET=IA64
2858                 arch_target=ia64
2859                 ACCESS_UNALIGNED="no"
2860                 LIBC="libc.so.6.1"
2861                 INTL="libc.so.6.1"
2862                 AC_CHECK_LIB(unwind, _U_dyn_register, [], [AC_MSG_ERROR(library libunwind not found)])
2863                 libmono_ldflags="-lunwind"
2864                 ;;
2865         sparc*-*-*)
2866                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
2867                    TARGET=SPARC64
2868                 else
2869                         TARGET=SPARC
2870                 fi
2871                 arch_target=sparc;
2872                 ACCESS_UNALIGNED="no"
2873                 case $host_os in
2874                   linux*) ;;
2875                   *)
2876                         LIBC="libc.so"
2877                         INTL="libintl.so"
2878                 esac
2879                 if test x"$GCC" = xyes; then
2880                         # We don't support v8 cpus
2881                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
2882                 fi
2883                 if test x"$AR" = xfalse; then
2884                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
2885                 fi
2886                 sgen_supported=true
2887                 ;;
2888         *-mingw*|*-*-cygwin*)
2889                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
2890                 have_visibility_hidden=no
2891                 INTL="intl"
2892                 ;;
2893         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
2894         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | powerpc-*-freebsd* )
2895                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
2896                         TARGET=POWERPC64;
2897                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
2898                         CFLAGS="$CFLAGS -mminimal-toc"
2899                 else
2900                         TARGET=POWERPC;
2901                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
2902                 fi
2903                 arch_target=ppc;
2904                 case $host_os in
2905                   linux*|darwin*)
2906                         sgen_supported=true
2907                         ;;
2908                 esac
2909                 ;;
2910         arm*-darwin*)
2911                 TARGET=ARM;
2912                 arch_target=arm;
2913                 ACCESS_UNALIGNED="no"
2914                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
2915                 sgen_supported=true
2916                 ;;
2917         arm*-linux*)
2918                 TARGET=ARM;
2919                 arch_target=arm;
2920                 ACCESS_UNALIGNED="no"
2921                 sgen_supported=true
2922                 AOT_SUPPORTED="yes"
2923                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
2924                 ;;
2925 # TODO: make proper support for NaCl host.
2926 #        arm*-*nacl)
2927 #               TARGET=ARM;
2928 #               arch_target=arm;
2929 #               ACCESS_UNALIGNED="no"
2930 #               sgen_supported=true
2931 #               AOT_SUPPORTED="no"
2932 #               ;;
2933         aarch64-*)
2934                 # https://lkml.org/lkml/2012/7/15/133
2935                 TARGET=ARM64
2936                 arch_target=arm64
2937                 sgen_supported=true
2938                 boehm_supported=false
2939                 ;;
2940         s390x-*-linux*)
2941                 TARGET=S390X;
2942                 arch_target=s390x;
2943                 ACCESS_UNALIGNED="yes"
2944                 sgen_supported=true
2945                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
2946                 ;;
2947 esac
2948
2949 HOST=$TARGET
2950
2951 if test "x$host" != "x$target"; then
2952    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
2953    enable_mcs_build=no
2954    case "$target" in
2955    arm*-darwin*)
2956                 TARGET=ARM;
2957                 arch_target=arm;
2958                 ACCESS_UNALIGNED="no"
2959                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
2960                 # Can't use tls, since it depends on the runtime detection of tls offsets
2961                 # in mono-compiler.h
2962                 with_tls=pthread
2963                 ;;
2964    powerpc64-ps3-linux-gnu)
2965                 TARGET=POWERPC64
2966                 arch_target=powerpc64
2967                 AC_DEFINE(TARGET_PS3, 1, [...])
2968                 # It would be better to just use TARGET_POWERPC64, but lots of code already
2969                 # uses this define
2970                 AC_DEFINE(__mono_ppc64__, 1, [...])
2971                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
2972                 sizeof_register=8
2973                 target_byte_order=G_BIG_ENDIAN
2974                 ;;
2975    powerpc64-xbox360-linux-gnu)
2976                 TARGET=POWERPC64
2977                 arch_target=powerpc64
2978                 AC_DEFINE(TARGET_XBOX360, 1, [...])
2979                 # It would be better to just use TARGET_POWERPC64, but lots of code already
2980                 # uses this define
2981                 sizeof_register=8
2982                 target_byte_order=G_BIG_ENDIAN
2983                 ;;
2984    x86_64-*-nacl)
2985                 TARGET=AMD64
2986                 arch_target=amd64
2987                 AC_DEFINE(TARGET_AMD64, 1, [...])
2988                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
2989                 sizeof_register=8
2990                 ;;
2991 # TODO: make proper support for NaCl target.
2992 #   arm*-*nacl)
2993 #               TARGET=ARM
2994 #               arch_target=arm
2995 #               AC_DEFINE(TARGET_ARM, 1, [...])
2996 #               ACCESS_UNALIGNED="no"
2997 #               sizeof_register=4
2998 #               CPPFLAGS="$CPPFLAGS \
2999 #                    -D__ARM_EABI__ \
3000 #                    -D__arm__ \
3001 #                    -D__portable_native_client__ \
3002 #                    -Dtimezone=_timezone \
3003 #                    -DDISABLE_SOCKETS \
3004 #                    -DDISABLE_ATTACH \
3005 #                    -DUSE_NEWLIB"
3006                 # Can't use tls, since it depends on the runtime detection of tls offsets
3007                 # in mono-compiler.h
3008 #               with_tls=pthread
3009 #               ;;
3010    i686-*-nacl)
3011                 TARGET=X86
3012                 arch_target=x86
3013                 AC_DEFINE(TARGET_X86, 1, [...])
3014                 sizeof_register=4
3015                 ;;
3016    arm*-linux-*)
3017                 TARGET=ARM;
3018                 arch_target=arm;
3019                 AC_DEFINE(TARGET_ARM, 1, [...])
3020                 AC_DEFINE(TARGET_ANDROID, 1, [...])
3021                 ACCESS_UNALIGNED="no"
3022                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3023                 # Can't use tls, since it depends on the runtime detection of tls offsets
3024                 # in mono-compiler.h
3025                 with_tls=pthread
3026                 target_mach=no
3027                 case "$target" in
3028                 armv7l-unknown-linux-gnueabi*)
3029                         # TEGRA
3030                         CPPFLAGS="$CPPFLAGS"
3031                         ;;
3032                 armv5-*-linux-androideabi*)
3033                         CPPFLAGS="$CPPFLAGS"
3034                         ;;
3035                 esac
3036                 ;;
3037    i686*-linux-*)
3038                 TARGET=X86;
3039                 arch_target=x86;
3040                 AC_DEFINE(TARGET_X86, 1, [...])
3041                 AC_DEFINE(TARGET_ANDROID, 1, [...])
3042                 CPPFLAGS="$CPPFLAGS"
3043                 sgen_supported=true
3044                 # Can't use tls, since it depends on the runtime detection of tls offsets
3045                 # in mono-compiler.h            
3046                 with_tls=pthread
3047                 target_mach=no
3048                 ;;
3049    x86_64*-linux-*)
3050                 TARGET=AMD64;
3051                 arch_target=amd64;
3052                 AC_DEFINE(TARGET_AMD64, 1, [...])
3053                 AC_DEFINE(TARGET_ANDROID, 1, [...])
3054                 CPPFLAGS="$CPPFLAGS"
3055                 sgen_supported=true
3056                 # Can't use tls, since it depends on the runtime detection of tls offsets
3057                 # in mono-compiler.h
3058                 with_tls=pthread
3059                 target_mach=no
3060                 ;;
3061    x86_64-ps4-freebsd)
3062                 TARGET=AMD64;
3063                 arch_target=amd64;
3064                 AC_DEFINE(TARGET_AMD64, 1, [...])
3065                 AC_DEFINE(TARGET_PS4, 1, [...])
3066                 CPPFLAGS="$CPPFLAGS"
3067                 sgen_supported=true
3068                 # Can't use tls, since it depends on the runtime detection of tls offsets
3069                 # in mono-compiler.h
3070                 with_tls=pthread
3071                 target_mach=no
3072                 target_win32=no
3073                 ;;
3074    aarch64*-linux-*)
3075                 TARGET=ARM64;
3076                 arch_target=arm64;
3077                 AC_DEFINE(TARGET_ARM64, 1, [...])
3078                 AC_DEFINE(TARGET_ANDROID, 1, [...])
3079                 CPPFLAGS="$CPPFLAGS"
3080                 # Can't use tls, since it depends on the runtime detection of tls offsets
3081                 # in mono-compiler.h
3082                 with_tls=pthread
3083                 target_mach=no
3084                 ;;
3085         aarch64-*)
3086                 TARGET=ARM64
3087                 ;;
3088         *)
3089                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
3090         esac
3091 fi
3092
3093 case "$TARGET" in
3094 X86)
3095         AC_DEFINE(TARGET_X86, 1, [...])
3096         ;;
3097 AMD64)
3098         AC_DEFINE(TARGET_AMD64, 1, [...])
3099         ;;
3100 ARM)
3101         AC_DEFINE(TARGET_ARM, 1, [...])
3102         ;;
3103 ARM64)
3104         AC_DEFINE(TARGET_ARM64, 1, [...])
3105         ;;
3106 POWERPC)
3107         AC_DEFINE(TARGET_POWERPC, 1, [...])
3108         ;;
3109 POWERPC64)
3110         AC_DEFINE(TARGET_POWERPC, 1, [...])
3111         AC_DEFINE(TARGET_POWERPC64, 1, [...])
3112         ;;
3113 S390X)
3114         AC_DEFINE(TARGET_S390X, 1, [...])
3115         ;;
3116 MIPS)
3117         AC_DEFINE(TARGET_MIPS, 1, [...])
3118         ;;
3119 IA64)
3120         AC_DEFINE(TARGET_IA64, 1, [...])
3121         ;;
3122 SPARC)
3123         AC_DEFINE(TARGET_SPARC, 1, [...])
3124         ;;
3125 SPARC64)
3126         AC_DEFINE(TARGET_SPARC64, 1, [...])
3127         ;;
3128 esac
3129
3130 dnl *************
3131 dnl *** VTUNE ***
3132 dnl *************
3133
3134 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
3135 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
3136
3137 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
3138
3139 if test "x$enable_vtune" = "xyes"; then
3140         if test "x$with_vtune" = "x"; then
3141                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
3142         else
3143                 VTUNE_PATH=$with_vtune
3144         fi
3145         VTUNE_INCLUDE=$VTUNE_PATH/include
3146         case "$TARGET" in
3147         X86)
3148                 VTUNE_LIB=$VTUNE_PATH/lib32
3149                 ;;
3150         AMD64)
3151                 VTUNE_LIB=$VTUNE_PATH/lib64
3152                 ;;
3153         *)
3154                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
3155                 ;;
3156         esac
3157         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
3158                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
3159         fi
3160         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
3161                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
3162         fi
3163
3164         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
3165         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
3166
3167         AC_SUBST(VTUNE_LIBS)
3168         AC_SUBST(VTUNE_CFLAGS)
3169 fi
3170 dnl Use GCC atomic ops if they work on the target.
3171 if test x$GCC = "xyes"; then
3172         case $TARGET in
3173         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
3174                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
3175                 ;;
3176         esac
3177 fi
3178
3179 if test "x$target_mach" = "xyes"; then
3180    if test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
3181           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3182           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3183           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3184    else
3185        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
3186        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
3187        #error fail this for ios
3188        #endif
3189        return 0;
3190        ], [
3191                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
3192           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
3193           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
3194        ], [
3195           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3196           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3197           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3198        ])
3199         fi
3200    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
3201 fi
3202
3203 if test "x$sizeof_register" = "x4"; then
3204    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
3205 elif test "x$sizeof_register" = "x8"; then
3206    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
3207 else
3208    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
3209 fi
3210
3211 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
3212    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
3213 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
3214    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
3215 else
3216    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
3217 fi
3218
3219 if test "x$have_visibility_hidden" = "xyes"; then
3220    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
3221 fi
3222
3223 if test "x$have_deprecated" = "xyes"; then
3224    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
3225 fi
3226
3227 dnl 
3228 dnl Simple Generational checks (sgen)
3229 dnl
3230 if $sgen_supported; then
3231    build_sgen_default=yes
3232 else
3233    build_sgen_default=no
3234 fi
3235 SGEN_DEFINES=
3236 AC_ARG_WITH(sgen, [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=$build_sgen_default])
3237 if test x$buildsgen = xyes; then
3238    if $sgen_supported; then
3239        SGEN_DEFINES="-DHAVE_SGEN_GC -DHAVE_MOVING_COLLECTOR"
3240        gc_msg="sgen and $gc_msg"
3241    else
3242        buildsgen=no
3243        AC_MSG_WARN("Sgen is not supported on this platform")
3244    fi
3245 fi
3246 AC_SUBST(SGEN_DEFINES)
3247 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
3248
3249 jit_status="Building and using the JIT"
3250
3251 libsuffix=".so"
3252
3253 case "$host" in
3254      *-*-darwin*)
3255         libsuffix=".dylib"
3256         LIBC="libc.dylib"
3257         INTL="libintl.dylib"
3258         SQLITE="libsqlite.0.dylib"
3259         SQLITE3="libsqlite3.0.dylib"
3260         X11="libX11.dylib"
3261         GDKX11="libgdk-x11-2.0.dylib"
3262         GTKX11="libgtk-x11-2.0.dylib"
3263         ;;
3264      *-*-*netbsd*)
3265         LIBC="libc.so.12"
3266         INTL="libintl.so.0"
3267         ;;
3268      *-*-kfreebsd*-gnu)
3269         LIBC="libc.so.0.1"
3270         INTL="libc.so.0.1"
3271         X11="libX11.so.6"
3272         ;;
3273     *-*-*freebsd*)
3274         LIBC="libc.so"
3275         INTL="libintl.so"
3276         SQLITE="libsqlite.so"
3277         SQLITE3="libsqlite3.so"
3278         ;;
3279     *-*-*openbsd*)
3280         LIBC="libc.so"
3281         INTL="libintl.so"
3282         SQLITE="libsqlite.so"
3283         SQLITE3="libsqlite3.so"
3284         ;;
3285     *-*-*linux*)
3286         AC_PATH_X
3287         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
3288         AC_MSG_CHECKING(for the soname of libX11.so)
3289         for i in $x_libraries $dlsearch_path; do
3290                 for r in 4 5 6; do
3291                         if test -f $i/libX11.so.$r; then
3292                                 X11=libX11.so.$r
3293                                 AC_MSG_RESULT($X11)
3294                         fi
3295                 done
3296         done
3297         
3298         if test "x$X11" = "xlibX11.so"; then
3299                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
3300                 X11=libX11.so.6
3301         fi
3302         ;;
3303 esac
3304
3305
3306 AC_SUBST(libsuffix)
3307
3308 AC_ARG_WITH([libgdiplus],
3309         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
3310         [], [with_libgdiplus=installed])
3311
3312 # default install location
3313 libgdiplus_install_loc=libgdiplus${libsuffix}
3314 case $with_libgdiplus in
3315     no|installed)
3316     libgdiplus_loc=
3317     ;;
3318
3319     yes|sibling)
3320     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
3321     ;;
3322
3323     /*) # absolute path, assume it is an install location
3324     libgdiplus_loc=$with_libgdiplus
3325     libgdiplus_install_loc=$with_libgdiplus
3326     ;;
3327
3328     *)
3329     libgdiplus_loc=`pwd`/$with_libgdiplus
3330     ;;
3331 esac
3332 AC_SUBST([libgdiplus_loc])
3333 AC_SUBST([libgdiplus_install_loc])
3334
3335 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)
3336 if test "x$icall_symbol_map" = "xyes"; then
3337    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
3338 fi
3339
3340 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
3341 if test "x$icall_export" = "xyes"; then
3342    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
3343 fi
3344
3345 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
3346 if test "x$icall_tables" = "xno"; then
3347    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
3348 fi
3349
3350 if test "x$with_tls" = "x__thread"; then
3351         AC_DEFINE(HAVE_KW_THREAD, 1, [Have __thread keyword])
3352         # Pass the information to libgc
3353         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
3354         AC_MSG_CHECKING(if the tls_model attribute is supported)
3355         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
3356                 ], [
3357                         AC_MSG_RESULT(yes)
3358                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
3359                 ], [
3360                         AC_MSG_RESULT(no)
3361         ])
3362 fi
3363
3364 if test ${TARGET} = ARM; then
3365         dnl ******************************************
3366         dnl *** Check to see what FPU is available ***
3367         dnl ******************************************
3368         AC_MSG_CHECKING(which FPU to use)
3369
3370         #
3371         # This is a bit tricky:
3372         #
3373         # if (__ARM_PCS_VFP) {
3374         #       /* mfloat-abi=hard == VFP with hard ABI */
3375         # } elif (!__SOFTFP__) {
3376         #       /* mfloat-abi=softfp == VFP with soft ABI */
3377         # } else {
3378         #       /* mfloat-abi=soft == no VFP */
3379         # }
3380         #
3381         # The exception is iOS (w/ GCC) where none of the above
3382         # are defined (but iOS always uses the 'softfp' ABI).
3383         #
3384         # No support for FPA.
3385         #
3386
3387         fpu=NONE
3388
3389         # iOS GCC always uses the 'softfp' ABI.
3390         if test x"$GCC" = xyes && test x$platform_darwin = xyes; then
3391                 fpu=VFP
3392         fi
3393
3394         # Are we using the 'hard' ABI?
3395         if test x$fpu = xNONE; then
3396                 AC_TRY_COMPILE([], [
3397                         #ifndef __ARM_PCS_VFP
3398                         #error "Float ABI is not 'hard'"
3399                         #endif
3400                         return 0;
3401                 ], [
3402                         fpu=VFP_HARD
3403                 ], [
3404                         fpu=NONE
3405                 ])
3406         fi
3407
3408         # No 'hard' ABI. 'soft' or 'softfp'?
3409         if test x$fpu = xNONE; then
3410                 AC_TRY_COMPILE([], [
3411                         #ifdef __SOFTFP__
3412                         #error "Float ABI is not 'softfp'"
3413                         #endif
3414                         return 0;
3415                 ], [
3416                         fpu=VFP
3417                 ], [
3418                         fpu=NONE
3419                 ])
3420         fi
3421
3422         AC_MSG_RESULT($fpu)
3423         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
3424         unset fpu
3425
3426         dnl *********************************************
3427         dnl *** Check which ARM version(s) we can use ***
3428         dnl *********************************************
3429         AC_MSG_CHECKING(which ARM version to use)
3430
3431         AC_TRY_COMPILE([], [
3432                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
3433                 #error Not on ARM v5.
3434                 #endif
3435                 return 0;
3436         ], [
3437                 arm_v5=yes
3438
3439                 arm_ver=ARMv5
3440         ], [])
3441
3442         AC_TRY_COMPILE([], [
3443                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
3444                 #error Not on ARM v6.
3445                 #endif
3446                 return 0;
3447         ], [
3448                 arm_v5=yes
3449                 arm_v6=yes
3450
3451                 arm_ver=ARMv6
3452         ], [])
3453
3454         AC_TRY_COMPILE([], [
3455                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
3456                 #error Not on ARM v7.
3457                 #endif
3458                 return 0;
3459         ], [
3460                 arm_v5=yes
3461                 arm_v6=yes
3462                 arm_v7=yes
3463
3464                 arm_ver=ARMv7
3465         ], [])
3466
3467         AC_MSG_RESULT($arm_ver)
3468
3469         if test x$arm_v5 = xyes; then
3470                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
3471                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
3472         fi
3473
3474         if test x$arm_v6 = xyes; then
3475                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
3476                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
3477         fi
3478
3479         if test x$arm_v7 = xyes; then
3480                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
3481                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
3482         fi
3483 fi
3484
3485 if test ${TARGET} = ARM; then
3486         if test "x${with_jumptables}" = "xyes"; then
3487                 AC_DEFINE(USE_JUMP_TABLES, 1, Use jump tables in JIT)
3488         fi
3489 fi
3490
3491 if test ${TARGET} = unknown; then
3492         CPPFLAGS="$CPPFLAGS -DNO_PORT"
3493         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
3494 fi
3495
3496 if test ${ACCESS_UNALIGNED} = no; then
3497         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
3498 fi
3499
3500 case "x$libgc" in
3501         xincluded)
3502                 # Pass CPPFLAGS to libgc configure
3503                 # We should use a separate variable for this to avoid passing useless and
3504                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
3505                 # This should be executed late so we pick up the final version of CPPFLAGS
3506                 # The problem with this approach, is that during a reconfigure, the main
3507                 # configure scripts gets invoked with these arguments, so we use separate
3508                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
3509                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
3510                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
3511                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
3512                 fi
3513                 # Don't pass -finstrument-for-thread-suspension in, 
3514                 # if these are instrumented it will be very bad news 
3515                 # (infinite recursion, undefined parking behavior, etc)
3516                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
3517                 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\""
3518                 if test "x$support_boehm" = "xyes"; then
3519                         AC_CONFIG_SUBDIRS(libgc)
3520                 fi
3521                 ;;
3522 esac
3523
3524 AC_ARG_WITH(profile4_5,[  --with-profile4_5=yes,no        If you want to install the 4.5 FX (defaults to yes)],                [], [with_profile4_5=yes])
3525 AC_ARG_WITH(monodroid, [  --with-monodroid=yes,no         If you want to build the MonoDroid assemblies (defaults to no)],     [], [with_monodroid=no])
3526 AC_ARG_WITH(monotouch, [  --with-monotouch=yes,no,only    If you want to build the MonoTouch assemblies (defaults to no)],     [], [with_monotouch=no])
3527 AC_ARG_WITH(xammac,    [  --with-xammac=yes,no,only       If you want to build the Xamarin.Mac assemblies (defaults to no)],   [], [with_xammac=no])
3528
3529 OPROFILE=no
3530 AC_ARG_WITH(oprofile,[  --with-oprofile=no,<oprofile install dir>   Enable oprofile support (defaults to no)],[
3531         if test x$with_oprofile != xno; then
3532             oprofile_include=$with_oprofile/include
3533             if test ! -f $oprofile_include/opagent.h; then
3534                   AC_MSG_ERROR([oprofile include file not found at $oprofile_include/opagent.h])
3535                 fi
3536             OPROFILE=yes
3537                 OPROFILE_CFLAGS="-I$oprofile_include"
3538             OPROFILE_LIBS="-L$with_oprofile/lib/oprofile -lopagent"
3539             AC_DEFINE(HAVE_OPROFILE,1,[Have oprofile support])
3540         fi
3541 ])
3542
3543 MALLOC_MEMPOOLS=no
3544 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
3545         if test x$with_malloc_mempools = xyes; then
3546                 MALLOC_MEMPOOLS=yes
3547                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
3548         fi
3549 ])
3550
3551
3552 DISABLE_MCS_DOCS=no
3553 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
3554         if test x$with_mcs_docs != xyes; then
3555                 DISABLE_MCS_DOCS=yes
3556         fi
3557 ])
3558 if test x$with_profile4_5 != xyes; then
3559         DISABLE_MCS_DOCS=yes
3560 fi
3561
3562 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)],[
3563         if test x$with_lazy_gc_thread_creation != xno ; then
3564                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
3565         fi
3566 ], [with_lazy_gc_thread_creation=no])
3567
3568 AC_ARG_WITH(cooperative_gc, [  --with-cooperative-gc=yes|no      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)],[
3569         if test x$with_cooperative_gc != xno ; then
3570                 AC_DEFINE(USE_COOP_GC,1,[Enable cooperative stop-the-world garbage collection.])
3571         fi
3572 ], [with_cooperative_gc=no])
3573
3574 AC_CHECK_HEADER([malloc.h], 
3575                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
3576                         [Define to 1 if you have /usr/include/malloc.h.])],,)
3577
3578 if test x"$GCC" = xyes; then
3579         # Implicit function declarations are not 64 bit safe
3580         # Do this late, since this causes lots of configure tests to fail
3581         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3582         # jay has a lot of implicit declarations
3583         JAY_CFLAGS="-Wno-implicit-function-declaration"
3584 fi
3585
3586 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
3587 # instead of libmono-static.a
3588 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
3589    LIBMONO_LA=libmini-static.la
3590 else
3591    if test x$buildsgen = xyes; then
3592       LIBMONO_LA=libmonosgen-$API_VER.la
3593    else
3594       LIBMONO_LA=libmonoboehm-$API_VER.la
3595    fi
3596 fi
3597 AC_SUBST(LIBMONO_LA)
3598
3599 dnl
3600 dnl Consistency settings
3601 dnl
3602 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
3603    DISABLE_MCS_DOCS=yes
3604    with_profile4_5=no
3605    with_monodroid=no
3606    with_monotouch=no
3607    with_xammac=no
3608 fi
3609
3610 if test x$DISABLE_MCS_DOCS = xyes; then
3611    docs_dir=""
3612 else
3613    docs_dir=docs
3614 fi
3615 AC_SUBST(docs_dir)
3616
3617 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
3618 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
3619
3620 AM_CONDITIONAL(HAVE_OPROFILE, test x$OPROFILE = xyes)
3621 AC_SUBST(OPROFILE_CFLAGS)
3622 AC_SUBST(OPROFILE_LIBS)
3623
3624 libmono_ldflags="$libmono_ldflags $LIBS"
3625
3626 AM_CONDITIONAL(INSTALL_4_5, [test "x$with_profile4_5" = xyes])
3627 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
3628 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
3629 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
3630 AM_CONDITIONAL(ONLY_MONOTOUCH, [test "x$with_monotouch" = "xonly"])
3631 AM_CONDITIONAL(ONLY_XAMMAC, [test "x$with_xammac" = "xonly"])
3632
3633 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
3634 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
3635 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
3636 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
3637 AM_CONDITIONAL(X86, test x$TARGET = xX86)
3638 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
3639 AM_CONDITIONAL(IA64, test x$TARGET = xIA64)
3640 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
3641 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
3642 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
3643 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
3644 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
3645 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
3646 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
3647 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
3648 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
3649 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
3650 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
3651
3652 AM_CONDITIONAL(INCLUDED_LIBGC, test x$libgc = xincluded)
3653
3654 AC_SUBST(LIBC)
3655 AC_SUBST(INTL)
3656 AC_SUBST(SQLITE)
3657 AC_SUBST(SQLITE3)
3658 AC_SUBST(X11)
3659 AC_SUBST(GDKX11)
3660 AC_SUBST(GTKX11)
3661 AC_SUBST(XINERAMA)
3662 AC_DEFINE_UNQUOTED(ARCHITECTURE,"$arch_target",[The architecture this is running on])
3663 AC_SUBST(arch_target)
3664 AC_SUBST(CFLAGS)
3665 AC_SUBST(CPPFLAGS)
3666 AC_SUBST(LDFLAGS)
3667
3668 mono_build_root=`pwd`
3669 AC_SUBST(mono_build_root)
3670
3671 mono_runtime=mono/mini/mono
3672 AC_SUBST(mono_runtime)
3673
3674 mono_cfg_root=$mono_build_root/runtime
3675 if test x$host_win32 = xyes; then
3676   if test "x$cross_compiling" = "xno"; then
3677     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
3678   else
3679     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
3680   fi
3681 else
3682   mono_cfg_dir=$mono_cfg_root/etc
3683 fi
3684 AC_SUBST(mono_cfg_dir)
3685
3686 AC_CONFIG_FILES([po/mcs/Makefile.in])
3687
3688 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
3689 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
3690
3691 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
3692 [   depth=../../../..
3693     case $srcdir in
3694     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3695     .) reldir=$depth ;;
3696     *) reldir=$depth/$srcdir ;;
3697     esac
3698     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
3699     cd runtime/etc/mono/1.0
3700     rm -f machine.config
3701     $LN_S $reldir/data/net_1_1/machine.config machine.config
3702     cd $depth
3703 ],[LN_S='$LN_S'])
3704
3705 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
3706 [   depth=../../../..
3707     case $srcdir in
3708     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3709     .) reldir=$depth ;;
3710     *) reldir=$depth/$srcdir ;;
3711     esac
3712     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
3713     cd runtime/etc/mono/2.0
3714     rm -f machine.config
3715     $LN_S $reldir/data/net_2_0/machine.config machine.config
3716     cd $depth
3717 ],[LN_S='$LN_S'])
3718
3719 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
3720 [   depth=../../../..
3721     case $srcdir in
3722     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3723     .) reldir=$depth ;;
3724     *) reldir=$depth/$srcdir ;;
3725     esac
3726     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
3727     cd runtime/etc/mono/2.0
3728     rm -f web.config
3729     $LN_S $reldir/data/net_2_0/web.config web.config
3730     cd $depth
3731 ],[LN_S='$LN_S'])
3732
3733 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
3734 [   depth=../../..
3735     case $srcdir in
3736     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3737     .) reldir=$depth ;;
3738     *) reldir=$depth/$srcdir ;;
3739     esac
3740     $ac_aux_dir/install-sh -d runtime/etc/mono/
3741     cd runtime/etc/mono/
3742     rm -f browscap.ini
3743     $LN_S $reldir/data/browscap.ini browscap.ini
3744     cd $depth
3745 ],[LN_S='$LN_S'])
3746
3747 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
3748 [   depth=../../../../..
3749     case $srcdir in
3750     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3751     .) reldir=$depth ;;
3752     *) reldir=$depth/$srcdir ;;
3753     esac
3754     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
3755     cd runtime/etc/mono/2.0/Browsers
3756     rm -f Compat.browser
3757     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
3758     cd $depth
3759 ],[LN_S='$LN_S'])
3760
3761 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
3762 [   depth=../../../../..
3763     case $srcdir in
3764     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3765     .) reldir=$depth ;;
3766     *) reldir=$depth/$srcdir ;;
3767     esac
3768     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
3769     cd runtime/etc/mono/4.0/Browsers
3770     rm -f Compat.browser
3771     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
3772     cd $depth
3773 ],[LN_S='$LN_S'])
3774
3775 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
3776 [   depth=../../../../..
3777     case $srcdir in
3778     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3779     .) reldir=$depth ;;
3780     *) reldir=$depth/$srcdir ;;
3781     esac
3782     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
3783     cd runtime/etc/mono/4.5/Browsers
3784     rm -f Compat.browser
3785     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
3786     cd $depth
3787 ],[LN_S='$LN_S'])
3788
3789 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
3790 [   depth=../../../..
3791     case $srcdir in
3792     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3793     .) reldir=$depth ;;
3794     *) reldir=$depth/$srcdir ;;
3795     esac
3796     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
3797     cd runtime/etc/mono/4.0
3798     rm -f machine.config
3799     $LN_S $reldir/data/net_4_0/machine.config machine.config
3800     cd $depth
3801 ],[LN_S='$LN_S'])
3802
3803 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
3804 [   depth=../../../..
3805     case $srcdir in
3806     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3807     .) reldir=$depth ;;
3808     *) reldir=$depth/$srcdir ;;
3809     esac
3810     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
3811     cd runtime/etc/mono/4.0
3812     rm -f web.config
3813     $LN_S $reldir/data/net_4_0/web.config web.config
3814     cd $depth
3815 ],[LN_S='$LN_S'])
3816
3817 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
3818 [   depth=../../../..
3819     case $srcdir in
3820     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3821     .) reldir=$depth ;;
3822     *) reldir=$depth/$srcdir ;;
3823     esac
3824     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
3825     cd runtime/etc/mono/4.5
3826     rm -f machine.config
3827     $LN_S $reldir/data/net_4_5/machine.config machine.config
3828     cd $depth
3829 ],[LN_S='$LN_S'])
3830
3831 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
3832 [   depth=../../../..
3833     case $srcdir in
3834     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
3835     .) reldir=$depth ;;
3836     *) reldir=$depth/$srcdir ;;
3837     esac
3838     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
3839     cd runtime/etc/mono/4.5
3840     rm -f web.config
3841     $LN_S $reldir/data/net_4_5/web.config web.config
3842     cd $depth
3843 ],[LN_S='$LN_S'])
3844
3845 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])
3846 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])
3847
3848 AC_OUTPUT([
3849 Makefile
3850 mono-uninstalled.pc
3851 scripts/mono-find-provides
3852 scripts/mono-find-requires
3853 mono/Makefile
3854 mono/utils/Makefile
3855 mono/metadata/Makefile
3856 mono/dis/Makefile
3857 mono/cil/Makefile
3858 mono/arch/Makefile
3859 mono/arch/x86/Makefile
3860 mono/arch/amd64/Makefile
3861 mono/arch/ppc/Makefile
3862 mono/arch/sparc/Makefile
3863 mono/arch/s390x/Makefile
3864 mono/arch/arm/Makefile
3865 mono/arch/arm64/Makefile
3866 mono/arch/ia64/Makefile
3867 mono/arch/mips/Makefile
3868 mono/tests/Makefile
3869 mono/tests/tests-config
3870 mono/tests/assemblyresolve/Makefile
3871 mono/tests/cas/Makefile
3872 mono/tests/cas/assembly/Makefile
3873 mono/tests/cas/demand/Makefile
3874 mono/tests/cas/inheritance/Makefile
3875 mono/tests/cas/linkdemand/Makefile
3876 mono/tests/cas/threads/Makefile
3877 mono/tests/gc-descriptors/Makefile
3878 mono/unit-tests/Makefile
3879 mono/benchmark/Makefile
3880 mono/io-layer/Makefile
3881 mono/mini/Makefile
3882 mono/profiler/Makefile
3883 m4/Makefile
3884 ikvm-native/Makefile
3885 scripts/Makefile
3886 man/Makefile
3887 docs/Makefile
3888 data/Makefile
3889 data/net_2_0/Makefile
3890 data/net_4_0/Makefile
3891 data/net_4_5/Makefile
3892 data/net_2_0/Browsers/Makefile
3893 data/net_4_0/Browsers/Makefile
3894 data/net_4_5/Browsers/Makefile
3895 data/mint.pc
3896 data/mono-2.pc
3897 data/monosgen-2.pc
3898 data/mono.pc
3899 data/mono-cairo.pc
3900 data/mono-nunit.pc
3901 data/mono-options.pc
3902 data/mono-lineeditor.pc
3903 data/monodoc.pc
3904 data/dotnet.pc
3905 data/dotnet35.pc
3906 data/wcf.pc
3907 data/cecil.pc
3908 data/system.web.extensions_1.0.pc
3909 data/system.web.extensions.design_1.0.pc
3910 data/system.web.mvc.pc
3911 data/system.web.mvc2.pc
3912 data/system.web.mvc3.pc
3913 data/aspnetwebstack.pc
3914 data/reactive.pc
3915 samples/Makefile
3916 support/Makefile
3917 data/config
3918 tools/Makefile
3919 tools/locale-builder/Makefile
3920 tools/sgen/Makefile
3921 tools/monograph/Makefile
3922 runtime/Makefile
3923 msvc/Makefile
3924 po/Makefile
3925 ])
3926
3927 # Update all submodules recursively to ensure everything is checked out
3928 $srcdir/scripts/update_submodules
3929
3930 if test x$host_win32 = xyes; then
3931    # Get rid of 'cyg' prefixes in library names
3932    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
3933    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
3934    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
3935    # executable doesn't work...
3936    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
3937 fi
3938
3939 if test x$platform_darwin = xyes; then
3940    # This doesn't seem to be required and it slows down parallel builds
3941    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
3942 fi
3943
3944 (
3945   case $prefix in
3946   NONE) prefix=$ac_default_prefix ;;
3947   esac
3948   case $exec_prefix in
3949   NONE) exec_prefix='${prefix}' ;;
3950   esac
3951
3952   #
3953   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
3954   # any existing config.make.  This allows people to share the same source tree
3955   # with different build directories, one native and one cross
3956   #
3957   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
3958
3959     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
3960
3961     echo "prefix=$prefix" > $mcs_topdir/build/config.make
3962     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
3963     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
3964     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
3965     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
3966     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
3967     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
3968     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
3969
3970     case $INSTALL in
3971     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
3972     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
3973     esac
3974
3975     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
3976
3977     export VERSION
3978     [myver=$($AWK 'BEGIN {
3979       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
3980       if(length(vsplit [1]) > 4) {
3981         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
3982       }
3983       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
3984     }')]
3985
3986     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
3987
3988     if test x$platform_darwin = xyes; then
3989       echo "PLATFORM = darwin" >> $mcs_topdir/build/config.make
3990     fi
3991
3992         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
3993            enable_system_aot=yes
3994         fi
3995
3996     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
3997       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
3998     fi
3999
4000     if test x$DISABLE_MCS_DOCS = xyes; then
4001       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
4002     fi
4003
4004     if test x$has_extension_module != xno; then
4005         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
4006     fi
4007
4008         default_profile=net_4_5
4009     if test -z "$INSTALL_MONODROID_TRUE"; then :
4010                 default_profile=monodroid
4011     fi
4012     if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
4013                 default_profile=monotouch
4014     fi
4015         if test -z "$INSTALL_XAMMAC_TRUE"; then :
4016                 default_profile=xammac
4017         fi
4018     if test -z "$INSTALL_4_5_TRUE"; then :
4019                 default_profile=net_4_5
4020     fi
4021     
4022     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
4023     
4024     if test "x$test_bcl_opt" = "xyes"; then    
4025       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
4026     fi
4027
4028   fi
4029
4030   # if we have an olive folder, override the default settings
4031   if test -d $olivedir; then
4032
4033     if test x$cross_compiling = xno && test x$enable_olive_build != xno; then
4034
4035       test -w $srcdir/$olivedir/build || chmod +w $srcdir/$olivedir/build
4036
4037       echo "prefix=$prefix" > $srcdir/$olivedir/build/config.make
4038       echo "exec_prefix=$exec_prefix" >> $srcdir/$olivedir/build/config.make
4039       echo 'mono_libdir=${exec_prefix}/lib' >> $srcdir/$olivedir/build/config.make
4040       echo 'MCS_FLAGS = $(PLATFORM_DEBUG_FLAGS)' >> $srcdir/$olivedir/build/config.make
4041       echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $srcdir/$olivedir/build/config.make
4042       echo "MONO_VERSION = $myver" >> $srcdir/$olivedir/build/config.make
4043     fi
4044   fi
4045
4046 )
4047
4048 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
4049
4050 echo "
4051         mcs source:    $mcsdir
4052
4053    Engine:
4054         Host:          $host
4055         Target:        $target
4056         GC:            $gc_msg 
4057         TLS:           $with_tls
4058         SIGALTSTACK:   $with_sigaltstack
4059         Engine:        $jit_status
4060         oprofile:      $OPROFILE
4061         BigArrays:     $enable_big_arrays
4062         DTrace:        $enable_dtrace
4063         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm)
4064
4065    Libraries:
4066         .NET 4.5:      $with_profile4_5
4067         MonoDroid:     $with_monodroid
4068         MonoTouch:     $with_monotouch
4069         Xamarin.Mac:   $with_xammac
4070         JNI support:   $jdk_headers_found
4071         libgdiplus:    $libgdiplus_msg
4072         zlib:          $zlib_msg
4073         $disabled
4074 "
4075 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
4076    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)
4077 fi