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