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=9: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_MIPS64, test $mips_abi = n64 -o $mips_abi = o64)
320AM_CONDITIONAL(LIBGO_IS_PPC, test $is_ppc = yes)
321AM_CONDITIONAL(LIBGO_IS_PPC64, test $is_ppc64 = yes)
322AM_CONDITIONAL(LIBGO_IS_PPC64LE, test $is_ppc64le = yes)
323AM_CONDITIONAL(LIBGO_IS_S390, test $is_s390 = yes)
324AM_CONDITIONAL(LIBGO_IS_S390X, test $is_s390x = yes)
325AM_CONDITIONAL(LIBGO_IS_SPARC, test $is_sparc = yes)
326AM_CONDITIONAL(LIBGO_IS_SPARC64, test $is_sparc64 = yes)
327AM_CONDITIONAL(LIBGO_IS_X86_64, test $is_x86_64 = yes)
328AC_SUBST(GOARCH)
329
330dnl Some files are only present when needed for specific architectures.
331GO_LIBCALL_OS_FILE=
332GO_LIBCALL_OS_ARCH_FILE=
333GO_SYSCALL_OS_FILE=
334GO_SYSCALL_OS_ARCH_FILE=
335if test -f "${srcdir}/go/syscall/libcall_${GOOS}.go"; then
336  GO_LIBCALL_OS_FILE="go/syscall/libcall_${GOOS}.go"
337fi
338if test -f "${srcdir}/go/syscall/libcall_${GOOS}_${GOARCH}.go"; then
339  GO_LIBCALL_OS_ARCH_FILE="go/syscall/libcall_${GOOS}_${GOARCH}.go"
340fi
341if test -f "${srcdir}/go/syscall/syscall_${GOOS}.go"; then
342  GO_SYSCALL_OS_FILE="go/syscall/syscall_${GOOS}.go"
343fi
344if test -f "${srcdir}/go/syscall/syscall_${GOOS}_${GOARCH}.go"; then
345  GO_SYSCALL_OS_ARCH_FILE="go/syscall/syscall_${GOOS}_${GOARCH}.go"
346fi
347AC_SUBST(GO_LIBCALL_OS_FILE)
348AC_SUBST(GO_LIBCALL_OS_ARCH_FILE)
349AC_SUBST(GO_SYSCALL_OS_FILE)
350AC_SUBST(GO_SYSCALL_OS_ARCH_FILE)
351
352dnl Special flags used to generate sysinfo.go.
353OSCFLAGS="-D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
354case "$target" in
355    mips-sgi-irix6.5*)
356	# IRIX 6 needs _XOPEN_SOURCE=500 for the XPG5 version of struct
357	# msghdr in <sys/socket.h>.
358	OSCFLAGS="$OSCFLAGS -D_XOPEN_SOURCE=500"
359	;;
360    *-*-solaris2.1[[01]])
361	# Solaris 10+ needs this so struct msghdr gets the msg_control
362	# etc. fields in <sys/socket.h> (_XPG4_2).  _XOPEN_SOURCE=600 as
363	# above doesn't work with C99.
364	OSCFLAGS="$OSCFLAGS -std=gnu99 -D_XOPEN_SOURCE=600 -D__EXTENSIONS__"
365	;;
366esac
367AC_SUBST(OSCFLAGS)
368
369dnl Use -fsplit-stack when compiling C code if available.
370AC_CACHE_CHECK([whether -fsplit-stack is supported],
371[libgo_cv_c_split_stack_supported],
372[CFLAGS_hold=$CFLAGS
373CFLAGS="$CFLAGS -fsplit-stack"
374AC_COMPILE_IFELSE([[int i;]],
375[libgo_cv_c_split_stack_supported=yes],
376[libgo_cv_c_split_stack_supported=no])
377CFLAGS=$CFLAGS_hold])
378
379dnl Make sure the linker permits -fsplit-stack.  Old versions of gold will
380dnl reject split-stack code calling non-split-stack code on targets
381dnl they don't support.
382AC_CACHE_CHECK([whether linker supports split/non-split linked together],
383[libgo_cv_c_linker_split_non_split],
384[cat > conftest1.c << EOF
385extern void f();
386int main() { f(); return 0; }
387EOF
388cat > conftest2.c << EOF
389void f() {}
390EOF
391$CC -c -fsplit-stack $CFLAGS $CPPFLAGS conftest1.c
392$CC -c $CFLAGS $CPPFLAGS conftest2.c
393if $CC -o conftest conftest1.$ac_objext conftest2.$ac_objext; then
394  libgo_cv_c_linker_split_non_split=yes
395else
396  libgo_cv_c_linker_split_non_split=no
397fi
398rm -f conftest1.* conftest2.* conftest])
399
400if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes; then
401  SPLIT_STACK=-fsplit-stack
402  AC_DEFINE(USING_SPLIT_STACK, 1,
403		[Define if the compiler supports -fsplit-stack])
404else
405  SPLIT_STACK=
406fi
407AC_SUBST(SPLIT_STACK)
408AM_CONDITIONAL(USING_SPLIT_STACK,
409	test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes)
410
411dnl If the compiler supports split-stack but the linker does not, then
412dnl we need to explicitly disable split-stack for Go.
413if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = no; then
414  GO_SPLIT_STACK=-fno-split-stack
415else
416  GO_SPLIT_STACK=
417fi
418AC_SUBST(GO_SPLIT_STACK)
419
420dnl Check whether the linker does stack munging when calling from
421dnl split-stack into non-split-stack code.  We check this by looking
422dnl at the --help output.  FIXME: This is only half right: it's
423dnl possible for the linker to support this for some targets but not
424dnl others.
425dnl This is slightly different from the above check, which is whether
426dnl the linker permits the call at all.
427AC_CACHE_CHECK([whether linker supports split stack],
428[libgo_cv_c_linker_supports_split_stack],
429[libgo_cv_c_linker_supports_split_stack=no
430if $GOC -Wl,--help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then
431  libgo_cv_c_linker_supports_split_stack=yes
432fi])
433if test "$libgo_cv_c_linker_supports_split_stack" = yes; then
434  AC_DEFINE(LINKER_SUPPORTS_SPLIT_STACK, 1,
435	    [Define if the linker support split stack adjustments])
436fi
437
438AC_CACHE_CHECK([whether compiler is llgo],
439[libgo_cv_c_goc_is_llgo],
440[libgo_cv_c_goc_is_llgo=no
441if $GOC -dumpversion 2>/dev/null | grep llgo >/dev/null 2>&1; then
442  libgo_cv_c_goc_is_llgo=yes
443fi])
444AM_CONDITIONAL(GOC_IS_LLGO, test "$libgo_cv_c_goc_is_llgo" = yes)
445
446dnl Test for the -lm library.
447MATH_LIBS=
448AC_CHECK_LIB([m], [sqrt], MATH_LIBS=-lm)
449AC_SUBST(MATH_LIBS)
450
451dnl Test for -lsocket and -lnsl.  Copied from libjava/configure.ac.
452AC_CACHE_CHECK([for socket libraries], libgo_cv_lib_sockets,
453  [libgo_cv_lib_sockets=
454   libgo_check_both=no
455   AC_CHECK_FUNC(connect, libgo_check_socket=no, libgo_check_socket=yes)
456   if test "$libgo_check_socket" = "yes"; then
457     unset ac_cv_func_connect
458     AC_CHECK_LIB(socket, main, libgo_cv_lib_sockets="-lsocket",
459     		  libgo_check_both=yes)
460   fi
461   if test "$libgo_check_both" = "yes"; then
462     libgo_old_libs=$LIBS
463     LIBS="$LIBS -lsocket -lnsl"
464     unset ac_cv_func_accept
465     AC_CHECK_FUNC(accept,
466		   [libgo_check_nsl=no
467		    libgo_cv_lib_sockets="-lsocket -lnsl"])
468     unset ac_cv_func_accept
469     LIBS=$libgo_old_libs
470   fi
471   unset ac_cv_func_gethostbyname
472   libgo_old_libs="$LIBS"
473   AC_CHECK_FUNC(gethostbyname, ,
474		 [AC_CHECK_LIB(nsl, main,
475		 	[libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lnsl"])])
476   unset ac_cv_func_gethostbyname
477   AC_CHECK_FUNC(sendfile, ,
478		 [AC_CHECK_LIB(sendfile, main,
479		 	[libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lsendfile"])])
480   LIBS=$libgo_old_libs
481])
482NET_LIBS="$libgo_cv_lib_sockets"
483AC_SUBST(NET_LIBS)
484
485dnl Test whether the compiler supports the -pthread option.
486AC_CACHE_CHECK([whether -pthread is supported],
487[libgo_cv_lib_pthread],
488[CFLAGS_hold=$CFLAGS
489CFLAGS="$CFLAGS -pthread"
490AC_COMPILE_IFELSE([[int i;]],
491[libgo_cv_lib_pthread=yes],
492[libgo_cv_lib_pthread=no])
493CFLAGS=$CFLAGS_hold])
494PTHREAD_CFLAGS=
495if test "$libgo_cv_lib_pthread" = yes; then
496  PTHREAD_CFLAGS=-pthread
497fi
498AC_SUBST(PTHREAD_CFLAGS)
499
500dnl Test for the -lpthread library.
501PTHREAD_LIBS=
502AC_CHECK_LIB([pthread], [pthread_create], PTHREAD_LIBS=-lpthread)
503AC_SUBST(PTHREAD_LIBS)
504
505dnl Test if -lrt is required for sched_yield or nanosleep or clock_gettime.
506AC_SEARCH_LIBS([sched_yield], [rt])
507AC_SEARCH_LIBS([nanosleep], [rt])
508AC_SEARCH_LIBS([clock_gettime], [rt])
509
510AC_C_BIGENDIAN
511
512GCC_CHECK_UNWIND_GETIPINFO
513
514AC_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)
515
516AC_CHECK_HEADERS([linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h], [], [],
517[#ifdef HAVE_SYS_SOCKET_H
518#include <sys/socket.h>
519#endif
520])
521
522AC_CACHE_CHECK([whether <ustat.h> can be used],
523[libgo_cv_c_ustat_h],
524[CFLAGS_hold=$CFLAGS
525CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE $OSCFLAGS"
526AC_COMPILE_IFELSE(
527[AC_LANG_SOURCE([
528#include <sys/types.h>
529#ifdef HAVE_LINUX_FILTER_H
530#include <linux/filter.h>
531#endif
532#include <ustat.h>
533])], [libgo_cv_c_ustat_h=yes], [libgo_cv_c_ustat_h=no])
534CFLAGS=$CFLAGS_hold])
535if test $libgo_cv_c_ustat_h = yes; then
536  AC_DEFINE(HAVE_USTAT_H, 1,
537    [Define to 1 if you have the <ustat.h> header file and it works.])
538fi
539
540AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes)
541
542AC_CHECK_FUNCS(strerror_r strsignal wait4 mincore setenv unsetenv dl_iterate_phdr)
543AM_CONDITIONAL(HAVE_STRERROR_R, test "$ac_cv_func_strerror_r" = yes)
544AM_CONDITIONAL(HAVE_WAIT4, test "$ac_cv_func_wait4" = yes)
545
546AC_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)
547AC_TYPE_OFF_T
548AC_CHECK_TYPES([loff_t])
549
550LIBS_hold="$LIBS"
551LIBS="$LIBS -lm"
552AC_CHECK_FUNCS(cosl expl logl sinl tanl acosl asinl atanl atan2l expm1l ldexpl log10l log1pl)
553LIBS="$LIBS_hold"
554
555CFLAGS_hold="$CFLAGS"
556CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
557LIBS_hold="$LIBS"
558LIBS="$LIBS $PTHREAD_LIBS"
559AC_CHECK_FUNCS(sem_timedwait)
560CFLAGS="$CFLAGS_hold"
561LIBS="$LIBS_hold"
562
563LIBS_hold="$LIBS"
564LIBS="$LIBS $MATH_LIBS"
565AC_CHECK_FUNCS(matherr)
566LIBS="$LIBS_hold"
567
568AC_CACHE_CHECK([for __sync_bool_compare_and_swap_4],
569[libgo_cv_func___sync_bool_compare_and_swap_4],
570[AC_LINK_IFELSE([
571typedef unsigned int uint32  __attribute__ ((mode (SI)));
572uint32 i;
573int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
574],
575[libgo_cv_func___sync_bool_compare_and_swap_4=yes],
576[libgo_cv_func___sync_bool_compare_and_swap_4=no])])
577if test "$libgo_cv_func___sync_bool_compare_and_swap_4" = "yes"; then
578  AC_DEFINE(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4, 1,
579    [Define to 1 if the compiler provides the __sync_bool_compare_and_swap function for uint32])
580fi
581
582AC_CACHE_CHECK([for __sync_bool_compare_and_swap_8],
583[libgo_cv_func___sync_bool_compare_and_swap_8],
584[AC_LINK_IFELSE([
585typedef unsigned int uint64  __attribute__ ((mode (DI)));
586uint64 i;
587int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
588],
589[libgo_cv_func___sync_bool_compare_and_swap_8=yes],
590[libgo_cv_func___sync_bool_compare_and_swap_8=no])])
591if test "$libgo_cv_func___sync_bool_compare_and_swap_8" = "yes"; then
592  AC_DEFINE(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8, 1,
593    [Define to 1 if the compiler provides the __sync_bool_compare_and_swap function for uint64])
594fi
595
596AC_CACHE_CHECK([for __sync_fetch_and_add_4],
597[libgo_cv_func___sync_fetch_and_add_4],
598[AC_LINK_IFELSE([
599typedef unsigned int uint32  __attribute__ ((mode (SI)));
600uint32 i;
601int main() { return __sync_fetch_and_add (&i, 1); }
602],
603[libgo_cv_func___sync_fetch_and_add_4=yes],
604[libgo_cv_func___sync_fetch_and_add_4=no])])
605if test "$libgo_cv_func___sync_fetch_and_add_4" = "yes"; then
606  AC_DEFINE(HAVE_SYNC_FETCH_AND_ADD_4, 1,
607    [Define to 1 if the compiler provides the __sync_fetch_and_add function for uint32])
608fi
609
610AC_CACHE_CHECK([for __sync_add_and_fetch_8],
611[libgo_cv_func___sync_add_and_fetch_8],
612[AC_LINK_IFELSE([
613typedef unsigned int uint64  __attribute__ ((mode (DI)));
614uint64 i;
615int main() { return __sync_add_and_fetch (&i, 1); }
616],
617[libgo_cv_func___sync_add_and_fetch_8=yes],
618[libgo_cv_func___sync_add_and_fetch_8=no])])
619if test "$libgo_cv_func___sync_add_and_fetch_8" = "yes"; then
620  AC_DEFINE(HAVE_SYNC_ADD_AND_FETCH_8, 1,
621    [Define to 1 if the compiler provides the __sync_add_and_fetch function for uint64])
622fi
623
624dnl For x86 we want to use the -minline-all-stringops option to avoid
625dnl forcing a stack split when calling memcpy and friends.
626AC_CACHE_CHECK([whether compiler supports -minline-all-stringops],
627[libgo_cv_c_stringops],
628[CFLAGS_hold=$CFLAGS
629CFLAGS="$CFLAGS -minline-all-stringops"
630AC_COMPILE_IFELSE([int i;],
631[libgo_cv_c_stringops=yes],
632[libgo_cv_c_stringops=no])
633CFLAGS=$CFLAGS_hold])
634STRINGOPS_FLAG=
635if test "$libgo_cv_c_stringops" = yes; then
636  STRINGOPS_FLAG=-minline-all-stringops
637fi
638AC_SUBST(STRINGOPS_FLAG)
639
640dnl For x86 we want to compile the math library with -mfancy-math-387
641dnl -funsafe-math-optimizations so that we can use the builtin
642dnl instructions directly.
643AC_CACHE_CHECK([whether compiler supports -mfancy-math-387],
644[libgo_cv_c_fancymath],
645[CFLAGS_hold=$CFLAGS
646CFLAGS="$CFLAGS -mfancy-math-387"
647AC_COMPILE_IFELSE([int i;],
648[libgo_cv_c_fancymath=yes],
649[libgo_cv_c_fancymath=no])
650CFLAGS=$CFLAGS_hold])
651MATH_FLAG=
652if test "$libgo_cv_c_fancymath" = yes; then
653  MATH_FLAG="-mfancy-math-387 -funsafe-math-optimizations"
654else
655  MATH_FLAG="-ffp-contract=off"
656fi
657AC_SUBST(MATH_FLAG)
658
659CFLAGS_hold=$CFLAGS
660CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"
661AC_CHECK_TYPES([off64_t])
662CFLAGS=$CFLAGS_hold
663
664dnl Work out the size of the epoll_events struct on GNU/Linux.
665AC_CACHE_CHECK([epoll_event size],
666[libgo_cv_c_epoll_event_size],
667[AC_COMPUTE_INT(libgo_cv_c_epoll_event_size,
668[sizeof (struct epoll_event)],
669[#include <sys/epoll.h>],
670[libgo_cv_c_epoll_event_size=0])])
671SIZEOF_STRUCT_EPOLL_EVENT=${libgo_cv_c_epoll_event_size}
672AC_SUBST(SIZEOF_STRUCT_EPOLL_EVENT)
673
674dnl Work out the offset of the fd field in the epoll_events struct on
675dnl GNU/Linux.
676AC_CACHE_CHECK([epoll_event data.fd offset],
677[libgo_cv_c_epoll_event_fd_offset],
678[AC_COMPUTE_INT(libgo_cv_c_epoll_event_fd_offset,
679[offsetof (struct epoll_event, data.fd)],
680[#include <stddef.h>
681#include <sys/epoll.h>],
682[libgo_cv_c_epoll_event_fd_offset=0])])
683STRUCT_EPOLL_EVENT_FD_OFFSET=${libgo_cv_c_epoll_event_fd_offset}
684AC_SUBST(STRUCT_EPOLL_EVENT_FD_OFFSET)
685
686dnl Check if <sys/stat.h> uses timespec_t for st_?tim members.  Introduced
687dnl in Solaris 11.4 for XPG7 compatibility.
688AC_EGREP_HEADER([timespec_t.*st_atim], [sys/stat.h],
689		[have_stat_timespec=yes], [have_stat_timespec=no])
690AM_CONDITIONAL(HAVE_STAT_TIMESPEC, test $have_stat_timespec = yes)
691
692dnl See if struct exception is defined in <math.h>.
693AC_CHECK_TYPE([struct exception],
694[libgo_has_struct_exception=yes],
695[libgo_has_struct_exception=no],
696[#include <math.h>])
697if test "$libgo_has_struct_exception" = "yes"; then
698  AC_DEFINE(HAVE_STRUCT_EXCEPTION, 1,
699            [Define to 1 if <math.h> defines struct exception])
700fi
701
702dnl See whether setcontext changes the value of TLS variables.
703AC_CACHE_CHECK([whether setcontext clobbers TLS variables],
704[libgo_cv_lib_setcontext_clobbers_tls],
705[CFLAGS_hold="$CFLAGS"
706CFLAGS="$PTHREAD_CFLAGS"
707LIBS_hold="$LIBS"
708LIBS="$LIBS $PTHREAD_LIBS"
709AC_CHECK_SIZEOF([void *])
710AS_VAR_ARITH([ptr_type_size], [$ac_cv_sizeof_void_p \* 8])
711AC_RUN_IFELSE(
712  [AC_LANG_SOURCE([
713#include <pthread.h>
714#include <stdlib.h>
715#include <ucontext.h>
716#include <unistd.h>
717
718__thread int tls;
719
720static char stack[[10 * 1024 * 1024]];
721static ucontext_t c;
722
723/* Called via makecontext/setcontext.  */
724
725static void
726cfn (void)
727{
728  exit (tls);
729}
730
731/* Called via pthread_create.  */
732
733static void *
734tfn (void *dummy)
735{
736  /* The thread should still see this value after calling
737     setcontext.  */
738  tls = 0;
739
740  setcontext (&c);
741
742  /* The call to setcontext should not return.  */
743  abort ();
744}
745
746int
747main ()
748{
749  pthread_t tid;
750
751  /* The thread should not see this value.  */
752  tls = 1;
753
754  if (getcontext (&c) < 0)
755    abort ();
756
757  c.uc_stack.ss_sp = stack;
758#ifdef MAKECONTEXT_STACK_TOP
759  c.uc_stack.ss_sp += sizeof stack;
760#endif
761  c.uc_stack.ss_flags = 0;
762  c.uc_stack.ss_size = sizeof stack;
763  c.uc_link = NULL;
764  makecontext (&c, cfn, 0);
765
766  if (pthread_create (&tid, NULL, tfn, NULL) != 0)
767    abort ();
768
769  if (pthread_join (tid, NULL) != 0)
770    abort ();
771
772  /* The thread should have called exit.  */
773  abort ();
774}
775])],
776[libgo_cv_lib_setcontext_clobbers_tls=no],
777[libgo_cv_lib_setcontext_clobbers_tls=yes],
778[case "$target:$ptr_type_size" in
779  i?86-*-solaris2.1[[01]]:64 | x86_64*-*-solaris2.1[[01]]:64)
780    libgo_cv_lib_setcontext_clobbers_tls=yes ;;
781  *)
782    libgo_cv_lib_setcontext_clobbers_tls=no ;;
783 esac
784])
785CFLAGS="$CFLAGS_hold"
786LIBS="$LIBS_hold"
787])
788if test "$libgo_cv_lib_setcontext_clobbers_tls" = "yes"; then
789  AC_DEFINE(SETCONTEXT_CLOBBERS_TLS, 1,
790	    [Define if setcontext clobbers TLS variables])
791fi
792
793AC_CACHE_CHECK([whether .eh_frame section should be read-only],
794libgo_cv_ro_eh_frame, [
795libgo_cv_ro_eh_frame=no
796echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
797if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
798  if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
799    libgo_cv_ro_eh_frame=yes
800  elif grep '.section.*eh_frame.*#alloc' conftest.c \
801       | grep -v '#write' > /dev/null; then
802    libgo_cv_ro_eh_frame=yes
803  fi
804fi
805rm -f conftest.*
806])
807if test "x$libgo_cv_ro_eh_frame" = xyes; then
808  AC_DEFINE(EH_FRAME_FLAGS, "a",
809	    [Define to the flags needed for the .section .eh_frame directive.])
810else
811  AC_DEFINE(EH_FRAME_FLAGS, "aw",
812	    [Define to the flags needed for the .section .eh_frame directive.])
813fi
814
815AC_CACHE_CHECK([if compiler supports -Qunused-arguments],
816[libgo_cv_c_unused_arguments],
817[CFLAGS_hold=$CFLAGS
818CFLAGS="$CFLAGS -Qunused-arguments"
819AC_COMPILE_IFELSE([[int i;]],
820[libgo_cv_c_unused_arguments=yes],
821[libgo_cv_c_unused_arguments=no])
822CFLAGS=$CFLAGS_hold])
823
824AC_CACHE_CHECK([if assembler supports GNU comdat group syntax],
825libgo_cv_as_comdat_gnu, [
826echo '.section .text,"axG",@progbits,.foo,comdat' > conftest.s
827CFLAGS_hold=$CFLAGS
828if test "$libgo_cv_c_unused_arguments" = yes; then
829  CFLAGS="$CFLAGS -Qunused-arguments"
830fi
831if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then
832  libgo_cv_as_comdat_gnu=yes
833else
834  libgo_cv_as_comdat_gnu=no
835fi
836CFLAGS=$CFLAGS_hold
837])
838if test "x$libgo_cv_as_comdat_gnu" = xyes; then
839  AC_DEFINE(HAVE_AS_COMDAT_GAS, 1,
840	    [Define if your assembler supports GNU comdat group syntax.])
841fi
842
843AC_CACHE_CHECK([assembler supports pc related relocs],
844libgo_cv_as_x86_pcrel, [
845libgo_cv_as_x86_pcrel=yes
846echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
847CFLAGS_hold=$CFLAGS
848if test "$libgo_cv_c_unused_arguments" = yes; then
849  CFLAGS="$CFLAGS -Qunused-arguments"
850fi
851if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then
852    libgo_cv_as_x86_pcrel=no
853fi
854CFLAGS=$CFLAGS_hold
855])
856if test "x$libgo_cv_as_x86_pcrel" = xyes; then
857  AC_DEFINE(HAVE_AS_X86_PCREL, 1,
858	    [Define if your assembler supports PC relative relocs.])
859fi
860
861AC_CACHE_CHECK([assembler supports unwind section type],
862libgo_cv_as_x86_64_unwind_section_type, [
863libgo_cv_as_x86_64_unwind_section_type=yes
864echo '.section .eh_frame,"a",@unwind' > conftest.s
865CFLAGS_hold=$CFLAGS
866if test "$libgo_cv_c_unused_arguments" = yes; then
867  CFLAGS="$CFLAGS -Qunused-arguments"
868fi
869if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
870    libgo_cv_as_x86_64_unwind_section_type=no
871fi
872CFLAGS=$CFLAGS_hold
873])
874if test "x$libgo_cv_as_x86_64_unwind_section_type" = xyes; then
875  AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1,
876	    [Define if your assembler supports unwind section type.])
877fi
878
879AC_CACHE_SAVE
880
881if test ${multilib} = yes; then
882  multilib_arg="--enable-multilib"
883else
884  multilib_arg=
885fi
886
887AC_CONFIG_FILES(Makefile testsuite/Makefile)
888
889AC_CONFIG_COMMANDS([default],
890[if test -n "$CONFIG_FILES"; then
891   # Multilibs need MULTISUBDIR defined correctly in certain makefiles so
892   # that multilib installs will end up installed in the correct place.
893   # The testsuite needs it for multilib-aware ABI baseline files.
894   # To work around this not being passed down from config-ml.in ->
895   # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
896   # append it here.  Only modify Makefiles that have just been created.
897   #
898   # Also, get rid of this simulated-VPATH thing that automake does.
899   cat > vpsed << \_EOF
900s!`test -f '$<' || echo '$(srcdir)/'`!!
901_EOF
902   for i in $SUBDIRS; do
903    case $CONFIG_FILES in
904     *${i}/Makefile*)
905       #echo "Adding MULTISUBDIR to $i/Makefile"
906       sed -f vpsed $i/Makefile > tmp
907       grep '^MULTISUBDIR =' Makefile >> tmp
908       mv tmp $i/Makefile
909       ;;
910    esac
911   done
912   rm vpsed
913 fi
914],
915[
916# Variables needed in config.status (file generation) which aren't already
917# passed by autoconf.
918SUBDIRS="$SUBDIRS"
919])
920
921AC_OUTPUT
922