1# configure.ac -- Go library configure script.
2
3# Copyright 2009 The Go Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style
5# license that can be found in the LICENSE file.
6
7# Process this file with autoreconf to produce configure.
8
9AC_PREREQ(2.64)
10AC_INIT(package-unused, version-unused,, libgo)
11AC_CONFIG_SRCDIR(Makefile.am)
12AC_CONFIG_HEADER(config.h)
13
14libtool_VERSION=8:0:0
15AC_SUBST(libtool_VERSION)
16
17AM_ENABLE_MULTILIB(, ..)
18
19AC_CANONICAL_SYSTEM
20target_alias=${target_alias-$host_alias}
21
22AM_INIT_AUTOMAKE([1.9.3 no-define foreign no-dist -Wall -Wno-portability])
23AH_TEMPLATE(PACKAGE, [Name of package])
24AH_TEMPLATE(VERSION, [Version number of package])
25
26m4_rename([_AC_ARG_VAR_PRECIOUS],[glibgo_PRECIOUS])
27m4_define([_AC_ARG_VAR_PRECIOUS],[])
28AC_PROG_CC
29AC_PROG_GO
30m4_rename_force([glibgo_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
31
32AC_SUBST(CFLAGS)
33
34AM_MAINTAINER_MODE
35
36AC_PROG_LD
37AC_PROG_RANLIB
38AC_CHECK_TOOL(OBJCOPY, objcopy, missing-objcopy)
39
40AC_LIBTOOL_DLOPEN
41AM_PROG_LIBTOOL
42AC_SUBST(enable_shared)
43AC_SUBST(enable_static)
44
45CC_FOR_BUILD=${CC_FOR_BUILD:-gcc}
46AC_SUBST(CC_FOR_BUILD)
47
48AC_PROG_AWK
49
50WARN_FLAGS='-Wall -Wextra -Wwrite-strings -Wcast-qual'
51AC_SUBST(WARN_FLAGS)
52
53AC_ARG_ENABLE(werror, [AS_HELP_STRING([--enable-werror],
54                                      [turns on -Werror @<:@default=yes@:>@])])
55if test "x$enable_werror" != "xno"; then
56  WERROR="-Werror"
57fi
58AC_SUBST(WERROR)
59
60glibgo_toolexecdir=no
61glibgo_toolexeclibdir=no
62
63AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
64AC_ARG_ENABLE([version-specific-runtime-libs],
65  AC_HELP_STRING([--enable-version-specific-runtime-libs],
66                 [Specify that runtime libraries should be installed in a compiler-specific directory]),
67  [case "$enableval" in
68    yes) version_specific_libs=yes ;;
69    no)  version_specific_libs=no ;;
70    *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
71   esac],
72  [version_specific_libs=no])
73AC_MSG_RESULT($version_specific_libs)
74
75# Version-specific runtime libs processing.
76if test $version_specific_libs = yes; then
77  glibgo_toolexecdir='${libdir}/gcc/${host_alias}'
78  glibgo_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
79fi
80
81# Calculate glibgo_toolexecdir, glibgo_toolexeclibdir
82# Install a library built with a cross compiler in tooldir, not libdir.
83if test -n "$with_cross_host" &&
84   test x"$with_cross_host" != x"no"; then
85  nover_glibgo_toolexecdir='${exec_prefix}/${host_alias}'
86  nover_glibgo_toolexeclibdir='${toolexecdir}/lib'
87else
88  nover_glibgo_toolexecdir='${libdir}/gcc/${host_alias}'
89  nover_glibgo_toolexeclibdir='${libdir}'
90fi
91multi_os_directory=`$GOC -print-multi-os-directory`
92case $multi_os_directory in
93  .) ;; # Avoid trailing /.
94  *) nover_glibgo_toolexeclibdir=${nover_glibgo_toolexeclibdir}/${multi_os_directory} ;;
95esac
96
97if test x"$glibgo_toolexecdir" = x"no"; then
98  glibgo_toolexecdir="${nover_glibgo_toolexecdir}"
99  glibgo_toolexeclibdir="${nover_glibgo_toolexeclibdir}"
100fi
101
102AC_SUBST(glibgo_toolexecdir)
103AC_SUBST(glibgo_toolexeclibdir)
104AC_SUBST(nover_glibgo_toolexeclibdir)
105
106# See if the user wants to configure without libffi.  Some
107# architectures don't support it.  FIXME: We should set a default
108# based on the host.
109AC_ARG_WITH(libffi,
110  AS_HELP_STRING([--without-libffi],
111                 [don't use libffi]),
112  [:],
113  [with_libffi=${with_libffi_default-yes}])
114
115LIBFFI=
116LIBFFIINCS=
117if test "$with_libffi" != no; then
118   AC_DEFINE(USE_LIBFFI, 1, [Define if we're to use libffi.])
119   LIBFFI=../libffi/libffi_convenience.la
120   LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I../libffi/include'
121fi
122AC_SUBST(LIBFFI)
123AC_SUBST(LIBFFIINCS)
124
125# See if the user wants to configure without libatomic. This is useful if we are
126# on an architecture for which libgo does not need an atomic support library and
127# libatomic does not support our C compiler.
128AC_ARG_WITH(libatomic,
129  AS_HELP_STRING([--without-libatomic],
130                 [don't use libatomic]),
131  [:],
132  [with_libatomic=${with_libatomic_default-yes}])
133
134LIBATOMIC=
135if test "$with_libatomic" != no; then
136   LIBATOMIC=../libatomic/libatomic_convenience.la
137fi
138AC_SUBST(LIBATOMIC)
139
140# Used to tell GNU make to include a file without telling automake to
141# include it.
142go_include="-include"
143AC_SUBST(go_include)
144
145is_darwin=no
146is_freebsd=no
147is_irix=no
148is_linux=no
149is_netbsd=no
150is_openbsd=no
151is_dragonfly=no
152is_rtems=no
153is_solaris=no
154GOOS=unknown
155case ${host} in
156  *-*-darwin*)   is_darwin=yes;  GOOS=darwin ;;
157  *-*-freebsd*)  is_freebsd=yes; GOOS=freebsd ;;
158  *-*-irix6*)    is_irix=yes;    GOOS=irix ;;
159  *-*-linux*)    is_linux=yes;   GOOS=linux ;;
160  *-*-netbsd*)	 is_netbsd=yes;  GOOS=netbsd ;;
161  *-*-openbsd*)  is_openbsd=yes; GOOS=openbsd ;;
162  *-*-dragonfly*) is_dragonfly=yes; GOOS=dragonfly ;;
163  *-*-rtems*)    is_rtems=yes;   GOOS=rtems ;;
164  *-*-solaris2*) is_solaris=yes; GOOS=solaris ;;
165esac
166AM_CONDITIONAL(LIBGO_IS_DARWIN, test $is_darwin = yes)
167AM_CONDITIONAL(LIBGO_IS_FREEBSD, test $is_freebsd = yes)
168AM_CONDITIONAL(LIBGO_IS_IRIX, test $is_irix = yes)
169AM_CONDITIONAL(LIBGO_IS_LINUX, test $is_linux = yes)
170AM_CONDITIONAL(LIBGO_IS_NETBSD, test $is_netbsd = yes)
171AM_CONDITIONAL(LIBGO_IS_OPENBSD, test $is_openbsd = yes)
172AM_CONDITIONAL(LIBGO_IS_DRAGONFLY, test $is_dragonfly = yes)
173AM_CONDITIONAL(LIBGO_IS_RTEMS, test $is_rtems = yes)
174AM_CONDITIONAL(LIBGO_IS_SOLARIS, test $is_solaris = yes)
175AC_SUBST(GOOS)
176
177dnl Test whether we need to use DejaGNU or whether we can use the
178dnl simpler gotest approach.  We can only use gotest for a native
179dnl build.
180USE_DEJAGNU=no
181case ${host} in
182  *-*-rtems*) USE_DEJAGNU=yes ;;
183  ${build}) ;;
184  *) USE_DEJAGNU=yes ;;
185esac
186AC_SUBST(USE_DEJAGNU)
187
188dnl N.B. Keep in sync with gcc/testsuite/go.test/go-test.exp (go-set-goarch).
189is_386=no
190is_alpha=no
191is_arm=no
192is_arm64=no
193is_m68k=no
194mips_abi=unknown
195is_ppc=no
196is_ppc64=no
197is_ppc64le=no
198is_s390=no
199is_s390x=no
200is_sparc=no
201is_sparc64=no
202is_x86_64=no
203GOARCH=unknown
204case ${host} in
205  alpha*-*-*)
206    is_alpha=yes
207    GOARCH=alpha
208    ;;
209  aarch64-*-*)
210    is_arm64=yes
211    GOARCH=arm64
212    ;;
213  arm*-*-* | strongarm*-*-* | ep9312*-*-* | xscale-*-*)
214    is_arm=yes
215    GOARCH=arm
216    ;;
217changequote(,)dnl
218  i[34567]86-*-* | x86_64-*-*)
219changequote([,])dnl
220    AC_COMPILE_IFELSE([
221#ifdef __x86_64__
222#error 64-bit
223#endif],
224[is_386=yes], [is_x86_64=yes])
225    if test "$is_386" = "yes"; then
226      GOARCH=386
227    else
228      GOARCH=amd64
229    fi
230    ;;
231  m68k*-*-*)
232    is_m68k=yes
233    GOARCH=m68k
234    ;;
235  mips*-*-*)
236    AC_COMPILE_IFELSE([
237#if _MIPS_SIM != _ABIO32
238#error not o32
239#endif],
240[mips_abi="o32"],
241	[AC_COMPILE_IFELSE([
242#if _MIPS_SIM != _ABIN32
243#error not n32
244#endif],
245[mips_abi="n32"],
246	[AC_COMPILE_IFELSE([
247#if _MIPS_SIM != _ABI64
248#error not n64
249#endif],
250[mips_abi="n64"],
251	[AC_COMPILE_IFELSE([
252#if _MIPS_SIM != _ABIO64
253#error not o64
254#endif],
255[mips_abi="o64"],
256	[AC_MSG_ERROR([unknown MIPS ABI])
257[mips_abi="n32"]])])])])
258    case "$mips_abi" in
259    "o32") GOARCH=mipso32 ;;
260    "n32") GOARCH=mipsn32 ;;
261    "n64") GOARCH=mipsn64 ;;
262    "o64") GOARCH=mipso64 ;;
263    esac
264    ;;
265  rs6000*-*-* | powerpc*-*-*)
266    AC_COMPILE_IFELSE([
267#ifdef _ARCH_PPC64
268#error 64-bit
269#endif],
270[is_ppc=yes],
271    [AC_COMPILE_IFELSE([
272#if defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__)
273#error 64be
274#endif],
275[is_ppc64le=yes],[is_ppc64=yes])])
276    if test "$is_ppc" = "yes"; then
277      GOARCH=ppc
278    elif test "$is_ppc64" = "yes"; then
279      GOARCH=ppc64
280    else
281      GOARCH=ppc64le
282    fi
283    ;;
284  s390*-*-*)
285    AC_COMPILE_IFELSE([
286#if defined(__s390x__)
287#error 64-bit
288#endif],
289[is_s390=yes], [is_s390x=yes])
290    if test "$is_s390" = "yes"; then
291      GOARCH=s390
292    else
293      GOARCH=s390x
294    fi
295    ;;
296  sparc*-*-*)
297    AC_COMPILE_IFELSE([
298#if defined(__sparcv9) || defined(__arch64__)
299#error 64-bit
300#endif],
301[is_sparc=yes], [is_sparc64=yes])
302    if test "$is_sparc" = "yes"; then
303      GOARCH=sparc
304    else
305      GOARCH=sparc64
306    fi
307    ;;
308esac
309AM_CONDITIONAL(LIBGO_IS_386, test $is_386 = yes)
310AM_CONDITIONAL(LIBGO_IS_ALPHA, test $is_alpha = yes)
311AM_CONDITIONAL(LIBGO_IS_ARM, test $is_arm = yes)
312AM_CONDITIONAL(LIBGO_IS_ARM64, test $is_arm64 = yes)
313AM_CONDITIONAL(LIBGO_IS_M68K, test $is_m68k = yes)
314AM_CONDITIONAL(LIBGO_IS_MIPS, test $mips_abi != unknown)
315AM_CONDITIONAL(LIBGO_IS_MIPSO32, test $mips_abi = o32)
316AM_CONDITIONAL(LIBGO_IS_MIPSN32, test $mips_abi = n32)
317AM_CONDITIONAL(LIBGO_IS_MIPSN64, test $mips_abi = n64)
318AM_CONDITIONAL(LIBGO_IS_MIPSO64, test $mips_abi = o64)
319AM_CONDITIONAL(LIBGO_IS_PPC, test $is_ppc = yes)
320AM_CONDITIONAL(LIBGO_IS_PPC64, test $is_ppc64 = yes)
321AM_CONDITIONAL(LIBGO_IS_PPC64LE, test $is_ppc64le = yes)
322AM_CONDITIONAL(LIBGO_IS_S390, test $is_s390 = yes)
323AM_CONDITIONAL(LIBGO_IS_S390X, test $is_s390x = yes)
324AM_CONDITIONAL(LIBGO_IS_SPARC, test $is_sparc = yes)
325AM_CONDITIONAL(LIBGO_IS_SPARC64, test $is_sparc64 = yes)
326AM_CONDITIONAL(LIBGO_IS_X86_64, test $is_x86_64 = yes)
327AC_SUBST(GOARCH)
328
329dnl Some files are only present when needed for specific architectures.
330GO_LIBCALL_OS_FILE=
331GO_LIBCALL_OS_ARCH_FILE=
332GO_SYSCALL_OS_FILE=
333GO_SYSCALL_OS_ARCH_FILE=
334if test -f "${srcdir}/go/syscall/libcall_${GOOS}.go"; then
335  GO_LIBCALL_OS_FILE="go/syscall/libcall_${GOOS}.go"
336fi
337if test -f "${srcdir}/go/syscall/libcall_${GOOS}_${GOARCH}.go"; then
338  GO_LIBCALL_OS_ARCH_FILE="go/syscall/libcall_${GOOS}_${GOARCH}.go"
339fi
340if test -f "${srcdir}/go/syscall/syscall_${GOOS}.go"; then
341  GO_SYSCALL_OS_FILE="go/syscall/syscall_${GOOS}.go"
342fi
343if test -f "${srcdir}/go/syscall/syscall_${GOOS}_${GOARCH}.go"; then
344  GO_SYSCALL_OS_ARCH_FILE="go/syscall/syscall_${GOOS}_${GOARCH}.go"
345fi
346AC_SUBST(GO_LIBCALL_OS_FILE)
347AC_SUBST(GO_LIBCALL_OS_ARCH_FILE)
348AC_SUBST(GO_SYSCALL_OS_FILE)
349AC_SUBST(GO_SYSCALL_OS_ARCH_FILE)
350
351dnl Special flags used to generate sysinfo.go.
352OSCFLAGS="-D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
353case "$target" in
354    mips-sgi-irix6.5*)
355	# IRIX 6 needs _XOPEN_SOURCE=500 for the XPG5 version of struct
356	# msghdr in <sys/socket.h>.
357	OSCFLAGS="$OSCFLAGS -D_XOPEN_SOURCE=500"
358	;;
359    *-*-solaris2.1[[01]])
360	# Solaris 10+ needs this so struct msghdr gets the msg_control
361	# etc. fields in <sys/socket.h> (_XPG4_2).  _XOPEN_SOURCE=600 as
362	# above doesn't work with C99.
363	OSCFLAGS="$OSCFLAGS -std=gnu99 -D_XOPEN_SOURCE=600 -D__EXTENSIONS__"
364	;;
365esac
366AC_SUBST(OSCFLAGS)
367
368dnl Use -fsplit-stack when compiling C code if available.
369AC_CACHE_CHECK([whether -fsplit-stack is supported],
370[libgo_cv_c_split_stack_supported],
371[CFLAGS_hold=$CFLAGS
372CFLAGS="$CFLAGS -fsplit-stack"
373AC_COMPILE_IFELSE([[int i;]],
374[libgo_cv_c_split_stack_supported=yes],
375[libgo_cv_c_split_stack_supported=no])
376CFLAGS=$CFLAGS_hold])
377
378dnl Make sure the linker permits -fsplit-stack.  Old versions of gold will
379dnl reject split-stack code calling non-split-stack code on targets
380dnl they don't support.
381AC_CACHE_CHECK([whether linker supports split/non-split linked together],
382[libgo_cv_c_linker_split_non_split],
383[cat > conftest1.c << EOF
384extern void f();
385int main() { f(); return 0; }
386EOF
387cat > conftest2.c << EOF
388void f() {}
389EOF
390$CC -c -fsplit-stack $CFLAGS $CPPFLAGS conftest1.c
391$CC -c $CFLAGS $CPPFLAGS conftest2.c
392if $CC -o conftest conftest1.$ac_objext conftest2.$ac_objext; then
393  libgo_cv_c_linker_split_non_split=yes
394else
395  libgo_cv_c_linker_split_non_split=no
396fi
397rm -f conftest1.* conftest2.* conftest])
398
399if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes; then
400  SPLIT_STACK=-fsplit-stack
401  AC_DEFINE(USING_SPLIT_STACK, 1,
402		[Define if the compiler supports -fsplit-stack])
403else
404  SPLIT_STACK=
405fi
406AC_SUBST(SPLIT_STACK)
407AM_CONDITIONAL(USING_SPLIT_STACK,
408	test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes)
409
410dnl If the compiler supports split-stack but the linker does not, then
411dnl we need to explicitly disable split-stack for Go.
412if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = no; then
413  GO_SPLIT_STACK=-fno-split-stack
414else
415  GO_SPLIT_STACK=
416fi
417AC_SUBST(GO_SPLIT_STACK)
418
419dnl Check whether the linker does stack munging when calling from
420dnl split-stack into non-split-stack code.  We check this by looking
421dnl at the --help output.  FIXME: This is only half right: it's
422dnl possible for the linker to support this for some targets but not
423dnl others.
424dnl This is slightly different from the above check, which is whether
425dnl the linker permits the call at all.
426AC_CACHE_CHECK([whether linker supports split stack],
427[libgo_cv_c_linker_supports_split_stack],
428[libgo_cv_c_linker_supports_split_stack=no
429if $GOC -Wl,--help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then
430  libgo_cv_c_linker_supports_split_stack=yes
431fi])
432if test "$libgo_cv_c_linker_supports_split_stack" = yes; then
433  AC_DEFINE(LINKER_SUPPORTS_SPLIT_STACK, 1,
434	    [Define if the linker support split stack adjustments])
435fi
436
437AC_CACHE_CHECK([whether compiler is llgo],
438[libgo_cv_c_goc_is_llgo],
439[libgo_cv_c_goc_is_llgo=no
440if $GOC -dumpversion 2>/dev/null | grep llgo >/dev/null 2>&1; then
441  libgo_cv_c_goc_is_llgo=yes
442fi])
443AM_CONDITIONAL(GOC_IS_LLGO, test "$libgo_cv_c_goc_is_llgo" = yes)
444
445dnl Test for the -lm library.
446MATH_LIBS=
447AC_CHECK_LIB([m], [sqrt], MATH_LIBS=-lm)
448AC_SUBST(MATH_LIBS)
449
450dnl Test for -lsocket and -lnsl.  Copied from libjava/configure.ac.
451AC_CACHE_CHECK([for socket libraries], libgo_cv_lib_sockets,
452  [libgo_cv_lib_sockets=
453   libgo_check_both=no
454   AC_CHECK_FUNC(connect, libgo_check_socket=no, libgo_check_socket=yes)
455   if test "$libgo_check_socket" = "yes"; then
456     unset ac_cv_func_connect
457     AC_CHECK_LIB(socket, main, libgo_cv_lib_sockets="-lsocket",
458     		  libgo_check_both=yes)
459   fi
460   if test "$libgo_check_both" = "yes"; then
461     libgo_old_libs=$LIBS
462     LIBS="$LIBS -lsocket -lnsl"
463     unset ac_cv_func_accept
464     AC_CHECK_FUNC(accept,
465		   [libgo_check_nsl=no
466		    libgo_cv_lib_sockets="-lsocket -lnsl"])
467     unset ac_cv_func_accept
468     LIBS=$libgo_old_libs
469   fi
470   unset ac_cv_func_gethostbyname
471   libgo_old_libs="$LIBS"
472   AC_CHECK_FUNC(gethostbyname, ,
473		 [AC_CHECK_LIB(nsl, main,
474		 	[libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lnsl"])])
475   unset ac_cv_func_gethostbyname
476   AC_CHECK_FUNC(sendfile, ,
477		 [AC_CHECK_LIB(sendfile, main,
478		 	[libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lsendfile"])])
479   LIBS=$libgo_old_libs
480])
481NET_LIBS="$libgo_cv_lib_sockets"
482AC_SUBST(NET_LIBS)
483
484dnl Test whether the compiler supports the -pthread option.
485AC_CACHE_CHECK([whether -pthread is supported],
486[libgo_cv_lib_pthread],
487[CFLAGS_hold=$CFLAGS
488CFLAGS="$CFLAGS -pthread"
489AC_COMPILE_IFELSE([[int i;]],
490[libgo_cv_lib_pthread=yes],
491[libgo_cv_lib_pthread=no])
492CFLAGS=$CFLAGS_hold])
493PTHREAD_CFLAGS=
494if test "$libgo_cv_lib_pthread" = yes; then
495  PTHREAD_CFLAGS=-pthread
496fi
497AC_SUBST(PTHREAD_CFLAGS)
498
499dnl Test for the -lpthread library.
500PTHREAD_LIBS=
501AC_CHECK_LIB([pthread], [pthread_create], PTHREAD_LIBS=-lpthread)
502AC_SUBST(PTHREAD_LIBS)
503
504dnl Test if -lrt is required for sched_yield or nanosleep or clock_gettime.
505AC_SEARCH_LIBS([sched_yield], [rt])
506AC_SEARCH_LIBS([nanosleep], [rt])
507AC_SEARCH_LIBS([clock_gettime], [rt])
508
509AC_C_BIGENDIAN
510
511GCC_CHECK_UNWIND_GETIPINFO
512
513AC_CHECK_HEADERS(sched.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h)
514
515AC_CHECK_HEADERS([linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h], [], [],
516[#ifdef HAVE_SYS_SOCKET_H
517#include <sys/socket.h>
518#endif
519])
520
521AC_CACHE_CHECK([whether <ustat.h> can be used],
522[libgo_cv_c_ustat_h],
523[CFLAGS_hold=$CFLAGS
524CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE $OSCFLAGS"
525AC_COMPILE_IFELSE(
526[AC_LANG_SOURCE([
527#include <sys/types.h>
528#ifdef HAVE_LINUX_FILTER_H
529#include <linux/filter.h>
530#endif
531#include <ustat.h>
532])], [libgo_cv_c_ustat_h=yes], [libgo_cv_c_ustat_h=no])
533CFLAGS=$CFLAGS_hold])
534if test $libgo_cv_c_ustat_h = yes; then
535  AC_DEFINE(HAVE_USTAT_H, 1,
536    [Define to 1 if you have the <ustat.h> header file and it works.])
537fi
538
539AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes)
540
541AC_CHECK_FUNCS(strerror_r strsignal wait4 mincore setenv unsetenv dl_iterate_phdr)
542AM_CONDITIONAL(HAVE_STRERROR_R, test "$ac_cv_func_strerror_r" = yes)
543AM_CONDITIONAL(HAVE_WAIT4, test "$ac_cv_func_wait4" = yes)
544
545AC_CHECK_FUNCS(accept4 dup3 epoll_create1 faccessat fallocate fchmodat fchownat futimesat getxattr inotify_add_watch inotify_init inotify_init1 inotify_rm_watch listxattr mkdirat mknodat open64 openat pipe2 removexattr renameat setxattr sync_file_range splice tee unlinkat unshare utimensat)
546AC_TYPE_OFF_T
547AC_CHECK_TYPES([loff_t])
548
549LIBS_hold="$LIBS"
550LIBS="$LIBS -lm"
551AC_CHECK_FUNCS(cosl expl logl sinl tanl acosl asinl atanl atan2l expm1l ldexpl log10l log1pl)
552LIBS="$LIBS_hold"
553
554CFLAGS_hold="$CFLAGS"
555CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
556LIBS_hold="$LIBS"
557LIBS="$LIBS $PTHREAD_LIBS"
558AC_CHECK_FUNCS(sem_timedwait)
559CFLAGS="$CFLAGS_hold"
560LIBS="$LIBS_hold"
561
562LIBS_hold="$LIBS"
563LIBS="$LIBS $MATH_LIBS"
564AC_CHECK_FUNCS(matherr)
565LIBS="$LIBS_hold"
566
567AC_CACHE_CHECK([for __sync_bool_compare_and_swap_4],
568[libgo_cv_func___sync_bool_compare_and_swap_4],
569[AC_LINK_IFELSE([
570typedef unsigned int uint32  __attribute__ ((mode (SI)));
571uint32 i;
572int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
573],
574[libgo_cv_func___sync_bool_compare_and_swap_4=yes],
575[libgo_cv_func___sync_bool_compare_and_swap_4=no])])
576if test "$libgo_cv_func___sync_bool_compare_and_swap_4" = "yes"; then
577  AC_DEFINE(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4, 1,
578    [Define to 1 if the compiler provides the __sync_bool_compare_and_swap function for uint32])
579fi
580
581AC_CACHE_CHECK([for __sync_bool_compare_and_swap_8],
582[libgo_cv_func___sync_bool_compare_and_swap_8],
583[AC_LINK_IFELSE([
584typedef unsigned int uint64  __attribute__ ((mode (DI)));
585uint64 i;
586int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
587],
588[libgo_cv_func___sync_bool_compare_and_swap_8=yes],
589[libgo_cv_func___sync_bool_compare_and_swap_8=no])])
590if test "$libgo_cv_func___sync_bool_compare_and_swap_8" = "yes"; then
591  AC_DEFINE(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8, 1,
592    [Define to 1 if the compiler provides the __sync_bool_compare_and_swap function for uint64])
593fi
594
595AC_CACHE_CHECK([for __sync_fetch_and_add_4],
596[libgo_cv_func___sync_fetch_and_add_4],
597[AC_LINK_IFELSE([
598typedef unsigned int uint32  __attribute__ ((mode (SI)));
599uint32 i;
600int main() { return __sync_fetch_and_add (&i, 1); }
601],
602[libgo_cv_func___sync_fetch_and_add_4=yes],
603[libgo_cv_func___sync_fetch_and_add_4=no])])
604if test "$libgo_cv_func___sync_fetch_and_add_4" = "yes"; then
605  AC_DEFINE(HAVE_SYNC_FETCH_AND_ADD_4, 1,
606    [Define to 1 if the compiler provides the __sync_fetch_and_add function for uint32])
607fi
608
609AC_CACHE_CHECK([for __sync_add_and_fetch_8],
610[libgo_cv_func___sync_add_and_fetch_8],
611[AC_LINK_IFELSE([
612typedef unsigned int uint64  __attribute__ ((mode (DI)));
613uint64 i;
614int main() { return __sync_add_and_fetch (&i, 1); }
615],
616[libgo_cv_func___sync_add_and_fetch_8=yes],
617[libgo_cv_func___sync_add_and_fetch_8=no])])
618if test "$libgo_cv_func___sync_add_and_fetch_8" = "yes"; then
619  AC_DEFINE(HAVE_SYNC_ADD_AND_FETCH_8, 1,
620    [Define to 1 if the compiler provides the __sync_add_and_fetch function for uint64])
621fi
622
623dnl For x86 we want to use the -minline-all-stringops option to avoid
624dnl forcing a stack split when calling memcpy and friends.
625AC_CACHE_CHECK([whether compiler supports -minline-all-stringops],
626[libgo_cv_c_stringops],
627[CFLAGS_hold=$CFLAGS
628CFLAGS="$CFLAGS -minline-all-stringops"
629AC_COMPILE_IFELSE([int i;],
630[libgo_cv_c_stringops=yes],
631[libgo_cv_c_stringops=no])
632CFLAGS=$CFLAGS_hold])
633STRINGOPS_FLAG=
634if test "$libgo_cv_c_stringops" = yes; then
635  STRINGOPS_FLAG=-minline-all-stringops
636fi
637AC_SUBST(STRINGOPS_FLAG)
638
639dnl For x86 we want to compile the math library with -mfancy-math-387
640dnl -funsafe-math-optimizations so that we can use the builtin
641dnl instructions directly.
642AC_CACHE_CHECK([whether compiler supports -mfancy-math-387],
643[libgo_cv_c_fancymath],
644[CFLAGS_hold=$CFLAGS
645CFLAGS="$CFLAGS -mfancy-math-387"
646AC_COMPILE_IFELSE([int i;],
647[libgo_cv_c_fancymath=yes],
648[libgo_cv_c_fancymath=no])
649CFLAGS=$CFLAGS_hold])
650MATH_FLAG=
651if test "$libgo_cv_c_fancymath" = yes; then
652  MATH_FLAG="-mfancy-math-387 -funsafe-math-optimizations"
653else
654  MATH_FLAG="-ffp-contract=off"
655fi
656AC_SUBST(MATH_FLAG)
657
658CFLAGS_hold=$CFLAGS
659CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"
660AC_CHECK_TYPES([off64_t])
661CFLAGS=$CFLAGS_hold
662
663dnl Work out the size of the epoll_events struct on GNU/Linux.
664AC_CACHE_CHECK([epoll_event size],
665[libgo_cv_c_epoll_event_size],
666[AC_COMPUTE_INT(libgo_cv_c_epoll_event_size,
667[sizeof (struct epoll_event)],
668[#include <sys/epoll.h>],
669[libgo_cv_c_epoll_event_size=0])])
670SIZEOF_STRUCT_EPOLL_EVENT=${libgo_cv_c_epoll_event_size}
671AC_SUBST(SIZEOF_STRUCT_EPOLL_EVENT)
672
673dnl Work out the offset of the fd field in the epoll_events struct on
674dnl GNU/Linux.
675AC_CACHE_CHECK([epoll_event data.fd offset],
676[libgo_cv_c_epoll_event_fd_offset],
677[AC_COMPUTE_INT(libgo_cv_c_epoll_event_fd_offset,
678[offsetof (struct epoll_event, data.fd)],
679[#include <stddef.h>
680#include <sys/epoll.h>],
681[libgo_cv_c_epoll_event_fd_offset=0])])
682STRUCT_EPOLL_EVENT_FD_OFFSET=${libgo_cv_c_epoll_event_fd_offset}
683AC_SUBST(STRUCT_EPOLL_EVENT_FD_OFFSET)
684
685dnl Check if <sys/stat.h> uses timespec_t for st_?tim members.  Introduced
686dnl in Solaris 12 for XPG7 compatibility.
687AC_EGREP_HEADER([timespec_t.*st_atim], [sys/stat.h],
688		[have_stat_timespec=yes], [have_stat_timespec=no])
689AM_CONDITIONAL(HAVE_STAT_TIMESPEC, test $have_stat_timespec = yes)
690
691dnl See if struct exception is defined in <math.h>.
692AC_CHECK_TYPE([struct exception],
693[libgo_has_struct_exception=yes],
694[libgo_has_struct_exception=no],
695[#include <math.h>])
696if test "$libgo_has_struct_exception" = "yes"; then
697  AC_DEFINE(HAVE_STRUCT_EXCEPTION, 1,
698            [Define to 1 if <math.h> defines struct exception])
699fi
700
701dnl See whether setcontext changes the value of TLS variables.
702AC_CACHE_CHECK([whether setcontext clobbers TLS variables],
703[libgo_cv_lib_setcontext_clobbers_tls],
704[CFLAGS_hold="$CFLAGS"
705CFLAGS="$PTHREAD_CFLAGS"
706LIBS_hold="$LIBS"
707LIBS="$LIBS $PTHREAD_LIBS"
708AC_CHECK_SIZEOF([void *])
709AS_VAR_ARITH([ptr_type_size], [$ac_cv_sizeof_void_p \* 8])
710AC_RUN_IFELSE(
711  [AC_LANG_SOURCE([
712#include <pthread.h>
713#include <stdlib.h>
714#include <ucontext.h>
715#include <unistd.h>
716
717__thread int tls;
718
719static char stack[[10 * 1024 * 1024]];
720static ucontext_t c;
721
722/* Called via makecontext/setcontext.  */
723
724static void
725cfn (void)
726{
727  exit (tls);
728}
729
730/* Called via pthread_create.  */
731
732static void *
733tfn (void *dummy)
734{
735  /* The thread should still see this value after calling
736     setcontext.  */
737  tls = 0;
738
739  setcontext (&c);
740
741  /* The call to setcontext should not return.  */
742  abort ();
743}
744
745int
746main ()
747{
748  pthread_t tid;
749
750  /* The thread should not see this value.  */
751  tls = 1;
752
753  if (getcontext (&c) < 0)
754    abort ();
755
756  c.uc_stack.ss_sp = stack;
757#ifdef MAKECONTEXT_STACK_TOP
758  c.uc_stack.ss_sp += sizeof stack;
759#endif
760  c.uc_stack.ss_flags = 0;
761  c.uc_stack.ss_size = sizeof stack;
762  c.uc_link = NULL;
763  makecontext (&c, cfn, 0);
764
765  if (pthread_create (&tid, NULL, tfn, NULL) != 0)
766    abort ();
767
768  if (pthread_join (tid, NULL) != 0)
769    abort ();
770
771  /* The thread should have called exit.  */
772  abort ();
773}
774])],
775[libgo_cv_lib_setcontext_clobbers_tls=no],
776[libgo_cv_lib_setcontext_clobbers_tls=yes],
777[case "$target:$ptr_type_size" in
778  i?86-*-solaris2.1[[01]]:64 | x86_64*-*-solaris2.1[[01]]:64)
779    libgo_cv_lib_setcontext_clobbers_tls=yes ;;
780  *)
781    libgo_cv_lib_setcontext_clobbers_tls=no ;;
782 esac
783])
784CFLAGS="$CFLAGS_hold"
785LIBS="$LIBS_hold"
786])
787if test "$libgo_cv_lib_setcontext_clobbers_tls" = "yes"; then
788  AC_DEFINE(SETCONTEXT_CLOBBERS_TLS, 1,
789	    [Define if setcontext clobbers TLS variables])
790fi
791
792AC_CACHE_CHECK([whether .eh_frame section should be read-only],
793libgo_cv_ro_eh_frame, [
794libgo_cv_ro_eh_frame=no
795echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
796if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
797  if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
798    libgo_cv_ro_eh_frame=yes
799  elif grep '.section.*eh_frame.*#alloc' conftest.c \
800       | grep -v '#write' > /dev/null; then
801    libgo_cv_ro_eh_frame=yes
802  fi
803fi
804rm -f conftest.*
805])
806if test "x$libgo_cv_ro_eh_frame" = xyes; then
807  AC_DEFINE(EH_FRAME_FLAGS, "a",
808	    [Define to the flags needed for the .section .eh_frame directive.])
809else
810  AC_DEFINE(EH_FRAME_FLAGS, "aw",
811	    [Define to the flags needed for the .section .eh_frame directive.])
812fi
813
814AC_CACHE_CHECK([if compiler supports -Qunused-arguments],
815[libgo_cv_c_unused_arguments],
816[CFLAGS_hold=$CFLAGS
817CFLAGS="$CFLAGS -Qunused-arguments"
818AC_COMPILE_IFELSE([[int i;]],
819[libgo_cv_c_unused_arguments=yes],
820[libgo_cv_c_unused_arguments=no])
821CFLAGS=$CFLAGS_hold])
822
823AC_CACHE_CHECK([if assembler supports GNU comdat group syntax],
824libgo_cv_as_comdat_gnu, [
825echo '.section .text,"axG",@progbits,.foo,comdat' > conftest.s
826CFLAGS_hold=$CFLAGS
827if test "$libgo_cv_c_unused_arguments" = yes; then
828  CFLAGS="$CFLAGS -Qunused-arguments"
829fi
830if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then
831  libgo_cv_as_comdat_gnu=yes
832else
833  libgo_cv_as_comdat_gnu=no
834fi
835CFLAGS=$CFLAGS_hold
836])
837if test "x$libgo_cv_as_comdat_gnu" = xyes; then
838  AC_DEFINE(HAVE_AS_COMDAT_GAS, 1,
839	    [Define if your assembler supports GNU comdat group syntax.])
840fi
841
842AC_CACHE_CHECK([assembler supports pc related relocs],
843libgo_cv_as_x86_pcrel, [
844libgo_cv_as_x86_pcrel=yes
845echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
846CFLAGS_hold=$CFLAGS
847if test "$libgo_cv_c_unused_arguments" = yes; then
848  CFLAGS="$CFLAGS -Qunused-arguments"
849fi
850if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then
851    libgo_cv_as_x86_pcrel=no
852fi
853CFLAGS=$CFLAGS_hold
854])
855if test "x$libgo_cv_as_x86_pcrel" = xyes; then
856  AC_DEFINE(HAVE_AS_X86_PCREL, 1,
857	    [Define if your assembler supports PC relative relocs.])
858fi
859
860AC_CACHE_CHECK([assembler supports unwind section type],
861libgo_cv_as_x86_64_unwind_section_type, [
862libgo_cv_as_x86_64_unwind_section_type=yes
863echo '.section .eh_frame,"a",@unwind' > conftest.s
864CFLAGS_hold=$CFLAGS
865if test "$libgo_cv_c_unused_arguments" = yes; then
866  CFLAGS="$CFLAGS -Qunused-arguments"
867fi
868if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
869    libgo_cv_as_x86_64_unwind_section_type=no
870fi
871CFLAGS=$CFLAGS_hold
872])
873if test "x$libgo_cv_as_x86_64_unwind_section_type" = xyes; then
874  AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1,
875	    [Define if your assembler supports unwind section type.])
876fi
877
878AC_CACHE_SAVE
879
880if test ${multilib} = yes; then
881  multilib_arg="--enable-multilib"
882else
883  multilib_arg=
884fi
885
886AC_CONFIG_FILES(Makefile testsuite/Makefile)
887
888AC_CONFIG_COMMANDS([default],
889[if test -n "$CONFIG_FILES"; then
890   # Multilibs need MULTISUBDIR defined correctly in certain makefiles so
891   # that multilib installs will end up installed in the correct place.
892   # The testsuite needs it for multilib-aware ABI baseline files.
893   # To work around this not being passed down from config-ml.in ->
894   # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
895   # append it here.  Only modify Makefiles that have just been created.
896   #
897   # Also, get rid of this simulated-VPATH thing that automake does.
898   cat > vpsed << \_EOF
899s!`test -f '$<' || echo '$(srcdir)/'`!!
900_EOF
901   for i in $SUBDIRS; do
902    case $CONFIG_FILES in
903     *${i}/Makefile*)
904       #echo "Adding MULTISUBDIR to $i/Makefile"
905       sed -f vpsed $i/Makefile > tmp
906       grep '^MULTISUBDIR =' Makefile >> tmp
907       mv tmp $i/Makefile
908       ;;
909    esac
910   done
911   rm vpsed
912 fi
913],
914[
915# Variables needed in config.status (file generation) which aren't already
916# passed by autoconf.
917SUBDIRS="$SUBDIRS"
918])
919
920AC_OUTPUT
921