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