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=20: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 # Check default architecture for FAT library creation 37 if test -z "`$CC -x c -E /dev/null -g3 -o - | grep 64BIT`" ; then 38 AIX_EXTRA_ARCH='64' 39 else 40 AIX_EXTRA_ARCH='32' 41 fi 42 AC_SUBST(AIX_EXTRA_ARCH) 43 ;; 44esac 45 46AM_MAINTAINER_MODE 47 48AC_PROG_LD 49AC_PROG_RANLIB 50AC_CHECK_TOOL(OBJCOPY, objcopy, missing-objcopy) 51 52AC_LIBTOOL_DLOPEN 53AM_PROG_LIBTOOL 54AC_SUBST(enable_shared) 55AC_SUBST(enable_static) 56 57CC_FOR_BUILD=${CC_FOR_BUILD:-gcc} 58AC_SUBST(CC_FOR_BUILD) 59 60AC_PROG_AWK 61 62WARN_FLAGS='-Wall -Wextra -Wwrite-strings -Wcast-qual' 63AC_SUBST(WARN_FLAGS) 64 65AC_ARG_ENABLE(werror, [AS_HELP_STRING([--enable-werror], 66 [turns on -Werror @<:@default=yes@:>@])]) 67if test "x$enable_werror" != "xno"; then 68 WERROR="-Werror" 69fi 70AC_SUBST(WERROR) 71 72glibgo_toolexecdir=no 73glibgo_toolexeclibdir=no 74 75AC_MSG_CHECKING([for --enable-version-specific-runtime-libs]) 76AC_ARG_ENABLE([version-specific-runtime-libs], 77 AC_HELP_STRING([--enable-version-specific-runtime-libs], 78 [Specify that runtime libraries should be installed in a compiler-specific directory]), 79 [case "$enableval" in 80 yes) version_specific_libs=yes ;; 81 no) version_specific_libs=no ;; 82 *) AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);; 83 esac], 84 [version_specific_libs=no]) 85AC_MSG_RESULT($version_specific_libs) 86 87GCC_WITH_TOOLEXECLIBDIR 88 89# Version-specific runtime libs processing. 90if test $version_specific_libs = yes; then 91 glibgo_toolexecdir='${libdir}/gcc/${host_alias}' 92 glibgo_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)' 93fi 94 95# Calculate glibgo_toolexecdir, glibgo_toolexeclibdir 96# Install a library built with a cross compiler in tooldir, not libdir. 97if test -n "$with_cross_host" && 98 test x"$with_cross_host" != x"no"; then 99 nover_glibgo_toolexecdir='${exec_prefix}/${host_alias}' 100 case ${with_toolexeclibdir} in 101 no) 102 nover_glibgo_toolexeclibdir='${toolexecdir}/lib' 103 ;; 104 *) 105 nover_glibgo_toolexeclibdir=${with_toolexeclibdir} 106 ;; 107 esac 108else 109 nover_glibgo_toolexecdir='${libdir}/gcc/${host_alias}' 110 nover_glibgo_toolexeclibdir='${libdir}' 111fi 112multi_os_directory=`$GOC -print-multi-os-directory` 113case $multi_os_directory in 114 .) ;; # Avoid trailing /. 115 *) nover_glibgo_toolexeclibdir=${nover_glibgo_toolexeclibdir}/${multi_os_directory} ;; 116esac 117 118if test x"$glibgo_toolexecdir" = x"no"; then 119 glibgo_toolexecdir="${nover_glibgo_toolexecdir}" 120 glibgo_toolexeclibdir="${nover_glibgo_toolexeclibdir}" 121fi 122 123AC_SUBST(glibgo_toolexecdir) 124AC_SUBST(glibgo_toolexeclibdir) 125AC_SUBST(nover_glibgo_toolexeclibdir) 126 127# See if the user wants to configure without libffi. Some 128# architectures don't support it. FIXME: We should set a default 129# based on the host. 130AC_ARG_WITH(libffi, 131 AS_HELP_STRING([--without-libffi], 132 [don't use libffi]), 133 [:], 134 [with_libffi=${with_libffi_default-yes}]) 135 136LIBFFI= 137LIBFFIINCS= 138if test "$with_libffi" != no; then 139 AC_DEFINE(USE_LIBFFI, 1, [Define if we're to use libffi.]) 140 LIBFFI=../libffi/libffi_convenience.la 141 LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I../libffi/include' 142fi 143AC_SUBST(LIBFFI) 144AC_SUBST(LIBFFIINCS) 145AM_CONDITIONAL(USE_LIBFFI, test "$with_libffi" != "no") 146 147# See if the user wants to configure without libatomic. This is useful if we are 148# on an architecture for which libgo does not need an atomic support library and 149# libatomic does not support our C compiler. 150AC_ARG_WITH(libatomic, 151 AS_HELP_STRING([--without-libatomic], 152 [don't use libatomic]), 153 [:], 154 [with_libatomic=${with_libatomic_default-yes}]) 155 156LIBATOMIC= 157if test "$with_libatomic" != no; then 158 LIBATOMIC=../libatomic/libatomic_convenience.la 159fi 160AC_SUBST(LIBATOMIC) 161 162# Used to tell GNU make to include a file without telling automake to 163# include it. 164go_include="-include" 165AC_SUBST(go_include) 166 167# All known GOOS values. This is the union of all operating systems 168# supported by the gofrontend and all operating systems supported by 169# the gc toolchain. 170ALLGOOS="aix android darwin dragonfly freebsd hurd illumos ios irix js linux netbsd openbsd plan9 rtems solaris windows zos" 171 172is_darwin=no 173is_freebsd=no 174is_irix=no 175is_linux=no 176is_netbsd=no 177is_openbsd=no 178is_dragonfly=no 179is_rtems=no 180is_solaris=no 181is_aix=no 182is_hurd=no 183GOOS=unknown 184case ${host} in 185 *-*-darwin*) is_darwin=yes; GOOS=darwin ;; 186 *-*-freebsd*) is_freebsd=yes; GOOS=freebsd ;; 187 *-*-irix6*) is_irix=yes; GOOS=irix ;; 188 *-*-linux*) is_linux=yes; GOOS=linux ;; 189 *-*-netbsd*) is_netbsd=yes; GOOS=netbsd ;; 190 *-*-openbsd*) is_openbsd=yes; GOOS=openbsd ;; 191 *-*-dragonfly*) is_dragonfly=yes; GOOS=dragonfly ;; 192 *-*-rtems*) is_rtems=yes; GOOS=rtems ;; 193 *-*-solaris2*) is_solaris=yes; GOOS=solaris ;; 194 *-*-aix*) is_aix=yes; GOOS=aix ;; 195 *-*-gnu*) is_hurd=yes; GOOS=hurd ;; 196esac 197AM_CONDITIONAL(LIBGO_IS_DARWIN, test $is_darwin = yes) 198AM_CONDITIONAL(LIBGO_IS_FREEBSD, test $is_freebsd = yes) 199AM_CONDITIONAL(LIBGO_IS_IRIX, test $is_irix = yes) 200AM_CONDITIONAL(LIBGO_IS_LINUX, test $is_linux = yes) 201AM_CONDITIONAL(LIBGO_IS_NETBSD, test $is_netbsd = yes) 202AM_CONDITIONAL(LIBGO_IS_OPENBSD, test $is_openbsd = yes) 203AM_CONDITIONAL(LIBGO_IS_DRAGONFLY, test $is_dragonfly = yes) 204AM_CONDITIONAL(LIBGO_IS_RTEMS, test $is_rtems = yes) 205AM_CONDITIONAL(LIBGO_IS_SOLARIS, test $is_solaris = yes) 206AM_CONDITIONAL(LIBGO_IS_AIX, test $is_aix = yes) 207AM_CONDITIONAL(LIBGO_IS_HURD, test $is_hurd = yes) 208AM_CONDITIONAL(LIBGO_IS_BSD, test $is_darwin = yes -o $is_dragonfly = yes -o $is_freebsd = yes -o $is_netbsd = yes -o $is_openbsd = yes) 209AC_SUBST(GOOS) 210AC_SUBST(ALLGOOS) 211 212dnl Test whether we need to use DejaGNU or whether we can use the 213dnl simpler gotest approach. We can only use gotest for a native 214dnl build. 215USE_DEJAGNU=no 216case ${host} in 217 *-*-rtems*) USE_DEJAGNU=yes ;; 218 ${build}) ;; 219 *) USE_DEJAGNU=yes ;; 220esac 221AC_SUBST(USE_DEJAGNU) 222 223# All known GOARCH values. This is the union of all architectures 224# supported by the gofrontend and all architectures supported by the 225# gc toolchain. 226# To add a new architecture: 227# - add it to this list 228# - if appropriate, add an entry to ALLGOARCHFAMILY below 229# - add an entry to the case on ${host} below to set GOARCH 230# - update goarchList in libgo/go/go/build/syslist.go 231# - update goarch.sh to report the values for this architecture 232# - update go-set-goarch in gcc/testsuite/go.test/go-test.exp 233# - update ptrSizeMap and intSizeMap in libgo/go/cmd/cgo/main.go 234# - update arch lists in libgo/match.sh 235# - update arch lists in libgo/testsuite/gotest 236# - update +build lines in several places 237# - libgo/go/runtime/lfstack_NNbit.go 238# - libgo/go/runtime/hashNN.go 239# - libgo/go/runtime/unalignedN.go 240# - libgo/go/syscall/endian_XX.go 241# - possibly others 242# - possibly update files in libgo/go/internal/syscall/unix 243ALLGOARCH="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" 244 245# All known GOARCH family values. 246ALLGOARCHFAMILY="I386 ALPHA AMD64 ARM ARM64 IA64 M68K MIPS MIPS64 NIOS2 PPC PPC64 RISCV RISCV64 S390 S390X SH SPARC SPARC64 WASM" 247 248GOARCH=unknown 249case ${host} in 250 alpha*-*-*) 251 GOARCH=alpha 252 ;; 253 aarch64-*-*) 254 GOARCH=arm64 255 ;; 256 aarch64_be-*-*) 257 GOARCH=arm64be 258 ;; 259 arm*-*-* | strongarm*-*-* | ep9312*-*-* | xscale-*-*) 260 GOARCH=arm 261 case ${host} in 262 arm*b*-*-*) 263 GOARCH=armbe 264 ;; 265 esac 266 ;; 267changequote(,)dnl 268 i[34567]86-*-* | x86_64-*-*) 269changequote([,])dnl 270 AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 271#ifdef __x86_64__ 272#error 64-bit 273#endif 274])], 275 [GOARCH=386], 276 AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 277#ifdef __ILP32__ 278#error x32 279#endif 280])], 281 [GOARCH=amd64], 282 [GOARCH=amd64p32])) 283 ;; 284 ia64-*-*) 285 GOARCH=ia64 286 ;; 287 m68k*-*-*) 288 GOARCH=m68k 289 ;; 290 mips*-*-*) 291 AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 292#if _MIPS_SIM != _ABIO32 293#error not o32 294#endif 295])], 296[mips_abi="o32"], 297 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 298#if _MIPS_SIM != _ABIN32 299#error not n32 300#endif 301])], 302[mips_abi="n32"], 303 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 304#if _MIPS_SIM != _ABI64 305#error not n64 306#endif 307])], 308[mips_abi="n64"], 309 [AC_MSG_ERROR([unknown MIPS ABI]) 310[mips_abi="n32"]])])]) 311 case "$mips_abi" in 312 "o32") GOARCH=mips ;; 313 "n32") GOARCH=mips64p32 ;; 314 "n64") GOARCH=mips64 ;; 315 esac 316 case "${host}" in 317 mips*el-*-*) 318 GOARCH="${GOARCH}le" 319 ;; 320 esac 321 ;; 322 nios2-*-*) 323 GOARCH=nios2 324 ;; 325 rs6000*-*-* | powerpc*-*-*) 326 AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 327#ifdef _ARCH_PPC64 328#error 64-bit 329#endif 330])], 331[GOARCH=ppc], 332 [ 333AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 334#if defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__) 335#error 64be 336#endif 337])], 338[GOARCH=ppc64le], 339[GOARCH=ppc64])]) 340 ;; 341 riscv*-*-*) 342 AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 343#if __riscv_xlen == 64 344#error 64-bit 345#endif 346])], 347[GOARCH=riscv], 348[GOARCH=riscv64]) 349 ;; 350 s390*-*-*) 351 AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 352#if defined(__s390x__) 353#error 64-bit 354#endif 355])], 356[GOARCH=s390], 357[GOARCH=s390x]) 358 ;; 359 sh3eb*-*-* | sh4eb*-*-*) 360 GOARCH=shbe 361 ;; 362 sh3*-*-* | sh4*-*-*) 363 GOARCH=sh 364 ;; 365 sparc*-*-*) 366 AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 367#if defined(__sparcv9) || defined(__arch64__) 368#error 64-bit 369#endif 370])], 371[GOARCH=sparc], 372[GOARCH=sparc64]) 373 ;; 374esac 375AC_SUBST(GOARCH) 376AC_SUBST(ALLGOARCH) 377AC_SUBST(ALLGOARCHFAMILY) 378 379AM_CONDITIONAL(LIBGO_IS_X86, test "$GOARCH" = "386" -o "$GOARCH" = "amd64" -o "$GOARCH" = "amd64p32") 380 381FUNCTION_DESCRIPTORS=false 382case ${host} in 383 rs6000*-*-* | powerpc*-*-*) 384 AC_COMPILE_IFELSE([AC_LANG_SOURCE([ 385#if _CALL_ELF == 1 386#error descriptors 387#endif 388])], 389 [FUNCTION_DESCRIPTORS=false], 390 [FUNCTION_DESCRIPTORS=true]) 391 ;; 392esac 393AC_SUBST(FUNCTION_DESCRIPTORS) 394 395dnl Some files are only present when needed for specific architectures. 396GO_LIBCALL_OS_FILE= 397GO_LIBCALL_OS_ARCH_FILE= 398GO_SYSCALL_OS_FILE= 399GO_SYSCALL_OS_ARCH_FILE= 400if test -f "${srcdir}/go/syscall/libcall_${GOOS}.go"; then 401 GO_LIBCALL_OS_FILE="go/syscall/libcall_${GOOS}.go" 402fi 403if test -f "${srcdir}/go/syscall/libcall_${GOOS}_${GOARCH}.go"; then 404 GO_LIBCALL_OS_ARCH_FILE="go/syscall/libcall_${GOOS}_${GOARCH}.go" 405fi 406if test -f "${srcdir}/go/syscall/syscall_${GOOS}.go"; then 407 GO_SYSCALL_OS_FILE="go/syscall/syscall_${GOOS}.go" 408fi 409if test -f "${srcdir}/go/syscall/syscall_${GOOS}_${GOARCH}.go"; then 410 GO_SYSCALL_OS_ARCH_FILE="go/syscall/syscall_${GOOS}_${GOARCH}.go" 411fi 412AC_SUBST(GO_LIBCALL_OS_FILE) 413AC_SUBST(GO_LIBCALL_OS_ARCH_FILE) 414AC_SUBST(GO_SYSCALL_OS_FILE) 415AC_SUBST(GO_SYSCALL_OS_ARCH_FILE) 416 417dnl Special flags used to generate sysinfo.go. 418OSCFLAGS="-D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" 419case "$target" in 420 mips-sgi-irix6.5*) 421 # IRIX 6 needs _XOPEN_SOURCE=500 for the XPG5 version of struct 422 # msghdr in <sys/socket.h>. 423 OSCFLAGS="$OSCFLAGS -D_XOPEN_SOURCE=500" 424 ;; 425 *-*-solaris2.*) 426 # Solaris 10+ needs this so struct msghdr gets the msg_control 427 # etc. fields in <sys/socket.h> (_XPG4_2). _XOPEN_SOURCE=600 as 428 # above doesn't work with C99. 429 OSCFLAGS="$OSCFLAGS -std=gnu99 -D_XOPEN_SOURCE=600 -D__EXTENSIONS__" 430 ;; 431esac 432AC_SUBST(OSCFLAGS) 433 434dnl Check if assembler supports disabling hardware capability support. 435GCC_CHECK_ASSEMBLER_HWCAP 436 437dnl Use -fsplit-stack when compiling C code if available. 438AC_CACHE_CHECK([whether -fsplit-stack is supported], 439[libgo_cv_c_split_stack_supported], 440[CFLAGS_hold=$CFLAGS 441CFLAGS="$CFLAGS -fsplit-stack" 442AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], 443[libgo_cv_c_split_stack_supported=yes], 444[libgo_cv_c_split_stack_supported=no]) 445CFLAGS=$CFLAGS_hold]) 446 447dnl Make sure the linker permits -fsplit-stack. Old versions of gold will 448dnl reject split-stack code calling non-split-stack code on targets 449dnl they don't support. 450AC_CACHE_CHECK([whether linker supports split/non-split linked together], 451[libgo_cv_c_linker_split_non_split], 452[cat > conftest1.c << EOF 453extern void f(); 454int main() { f(); return 0; } 455EOF 456cat > conftest2.c << EOF 457void f() {} 458EOF 459$CC -c -fsplit-stack $CFLAGS $CPPFLAGS conftest1.c >/dev/null 2>&1 460$CC -c $CFLAGS $CPPFLAGS conftest2.c > /dev/null 2>&1 461if $CC -o conftest conftest1.$ac_objext conftest2.$ac_objext > /dev/null 2>&1; then 462 libgo_cv_c_linker_split_non_split=yes 463else 464 libgo_cv_c_linker_split_non_split=no 465fi 466rm -f conftest1.* conftest2.* conftest]) 467 468if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes; then 469 SPLIT_STACK=-fsplit-stack 470 AC_DEFINE(USING_SPLIT_STACK, 1, 471 [Define if the compiler supports -fsplit-stack]) 472else 473 SPLIT_STACK= 474fi 475AC_SUBST(SPLIT_STACK) 476AM_CONDITIONAL(USING_SPLIT_STACK, 477 test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes) 478 479dnl If the compiler supports split-stack but the linker does not, then 480dnl we need to explicitly disable split-stack for Go. 481if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = no; then 482 GO_SPLIT_STACK=-fno-split-stack 483else 484 GO_SPLIT_STACK= 485fi 486AC_SUBST(GO_SPLIT_STACK) 487 488dnl Check whether the linker does stack munging when calling from 489dnl split-stack into non-split-stack code. We check this by looking 490dnl at the --help output. FIXME: This is only half right: it's 491dnl possible for the linker to support this for some targets but not 492dnl others. 493dnl This is slightly different from the above check, which is whether 494dnl the linker permits the call at all. 495AC_CACHE_CHECK([whether linker supports split stack], 496[libgo_cv_c_linker_supports_split_stack], 497[libgo_cv_c_linker_supports_split_stack=no 498if $GOC -Wl,--help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then 499 libgo_cv_c_linker_supports_split_stack=yes 500fi]) 501if test "$libgo_cv_c_linker_supports_split_stack" = yes; then 502 AC_DEFINE(LINKER_SUPPORTS_SPLIT_STACK, 1, 503 [Define if the linker support split stack adjustments]) 504fi 505 506AC_CACHE_CHECK([whether compiler is llgo], 507[libgo_cv_c_goc_is_llgo], 508[libgo_cv_c_goc_is_llgo=no 509if $GOC -dumpversion 2>/dev/null | grep llgo >/dev/null 2>&1; then 510 libgo_cv_c_goc_is_llgo=yes 511fi]) 512AM_CONDITIONAL(GOC_IS_LLGO, test "$libgo_cv_c_goc_is_llgo" = yes) 513 514dnl Test for the -lm library. 515MATH_LIBS= 516AC_CHECK_LIB([m], [sqrt], MATH_LIBS=-lm) 517AC_SUBST(MATH_LIBS) 518 519dnl Test for -lsocket and -lnsl. Copied from libjava/configure.ac. 520AC_CACHE_CHECK([for socket libraries], libgo_cv_lib_sockets, 521 [libgo_cv_lib_sockets= 522 libgo_check_both=no 523 AC_CHECK_FUNC(connect, libgo_check_socket=no, libgo_check_socket=yes) 524 if test "$libgo_check_socket" = "yes"; then 525 unset ac_cv_func_connect 526 AC_CHECK_LIB(socket, main, libgo_cv_lib_sockets="-lsocket", 527 libgo_check_both=yes) 528 fi 529 if test "$libgo_check_both" = "yes"; then 530 libgo_old_libs=$LIBS 531 LIBS="$LIBS -lsocket -lnsl" 532 unset ac_cv_func_accept 533 AC_CHECK_FUNC(accept, 534 [libgo_check_nsl=no 535 libgo_cv_lib_sockets="-lsocket -lnsl"]) 536 unset ac_cv_func_accept 537 LIBS=$libgo_old_libs 538 fi 539 unset ac_cv_func_gethostbyname 540 libgo_old_libs="$LIBS" 541 AC_CHECK_FUNC(gethostbyname, , 542 [AC_CHECK_LIB(nsl, main, 543 [libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lnsl"])]) 544 unset ac_cv_func_gethostbyname 545 AC_CHECK_FUNC(sendfile, , 546 [AC_CHECK_LIB(sendfile, main, 547 [libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lsendfile"])]) 548 LIBS=$libgo_old_libs 549]) 550NET_LIBS="$libgo_cv_lib_sockets" 551AC_SUBST(NET_LIBS) 552 553dnl Test whether the compiler supports the -pthread option. 554AC_CACHE_CHECK([whether -pthread is supported], 555[libgo_cv_lib_pthread], 556[CFLAGS_hold=$CFLAGS 557CFLAGS="$CFLAGS -pthread -L../libatomic/.libs" 558AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], 559[libgo_cv_lib_pthread=yes], 560[libgo_cv_lib_pthread=no]) 561CFLAGS=$CFLAGS_hold]) 562PTHREAD_CFLAGS= 563if test "$libgo_cv_lib_pthread" = yes; then 564 # RISC-V apparently adds -latomic when using -pthread. 565 PTHREAD_CFLAGS="-pthread -L../libatomic/.libs" 566fi 567AC_SUBST(PTHREAD_CFLAGS) 568 569dnl Test for the -lpthread library. 570PTHREAD_LIBS= 571AC_CHECK_LIB([pthread], [pthread_create], PTHREAD_LIBS=-lpthread) 572AC_SUBST(PTHREAD_LIBS) 573 574dnl Test if -lrt is required for sched_yield or nanosleep or clock_gettime. 575AC_SEARCH_LIBS([sched_yield], [rt]) 576AC_SEARCH_LIBS([nanosleep], [rt]) 577AC_SEARCH_LIBS([clock_gettime], [rt]) 578 579AC_C_BIGENDIAN 580 581GCC_CHECK_UNWIND_GETIPINFO 582 583AC_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/sysctl.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/bpf.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 lwp.h) 584 585AC_CHECK_HEADERS([netinet/icmp6.h], [], [], 586[#include <netinet/in.h> 587]) 588 589AC_CHECK_HEADERS([linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h], [], [], 590[#ifdef HAVE_SYS_SOCKET_H 591#include <sys/socket.h> 592#endif 593]) 594 595AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes) 596 597AC_CHECK_FUNCS(strerror_r strsignal wait4 mincore setenv unsetenv dl_iterate_phdr memmem) 598AM_CONDITIONAL(HAVE_STRERROR_R, test "$ac_cv_func_strerror_r" = yes) 599AM_CONDITIONAL(HAVE_WAIT4, test "$ac_cv_func_wait4" = yes) 600 601AC_STRUCT_DIRENT_D_TYPE 602 603AC_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) 604AC_TYPE_OFF_T 605AC_CHECK_TYPES([loff_t]) 606 607LIBS_hold="$LIBS" 608LIBS="$LIBS -lm" 609AC_CHECK_FUNCS(cosl expl logl sinl tanl acosl asinl atanl atan2l expm1l ldexpl log10l log1pl) 610LIBS="$LIBS_hold" 611 612CFLAGS_hold="$CFLAGS" 613CFLAGS="$CFLAGS $PTHREAD_CFLAGS" 614LIBS_hold="$LIBS" 615LIBS="$LIBS $PTHREAD_LIBS" 616AC_CHECK_FUNCS(sem_timedwait) 617CFLAGS="$CFLAGS_hold" 618LIBS="$LIBS_hold" 619 620LIBS_hold="$LIBS" 621LIBS="$LIBS $MATH_LIBS" 622AC_CHECK_FUNCS(matherr) 623LIBS="$LIBS_hold" 624 625dnl For x86 we want to use the -minline-all-stringops option to avoid 626dnl forcing a stack split when calling memcpy and friends. 627AC_CACHE_CHECK([whether compiler supports -minline-all-stringops], 628[libgo_cv_c_stringops], 629[CFLAGS_hold=$CFLAGS 630CFLAGS="$CFLAGS -minline-all-stringops" 631AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], 632[libgo_cv_c_stringops=yes], 633[libgo_cv_c_stringops=no]) 634CFLAGS=$CFLAGS_hold]) 635STRINGOPS_FLAG= 636if test "$libgo_cv_c_stringops" = yes; then 637 STRINGOPS_FLAG=-minline-all-stringops 638fi 639AC_SUBST(STRINGOPS_FLAG) 640 641dnl For x86 we want to compile the math library with -mfancy-math-387 642dnl so that we can use the builtin 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([AC_LANG_SOURCE([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" 654fi 655MATH_FLAG="${MATH_FLAG} -ffp-contract=off -fno-math-errno -fno-trapping-math" 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 11.4 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([AC_LANG_SOURCE([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_CHECK([assembler supports AES instructions], 879libgo_cv_as_x86_aes, [ 880libgo_cv_as_x86_aes=yes 881echo 'aesenc %xmm0, %xmm1' > conftest.s 882CFLAGS_hold=$CFLAGS 883if test "$libgo_cv_c_unused_arguments" = yes; then 884 CFLAGS="$CFLAGS -Qunused-arguments" 885fi 886if $CC $CFLAGS -c conftest.s 2>&1 | grep -i error > /dev/null; then 887 libgo_cv_as_x86_aes=no 888fi 889CFLAGS=$CFLAGS_hold 890]) 891if test "x$libgo_cv_as_x86_aes" = xyes; then 892 AC_DEFINE(HAVE_AS_X86_AES, 1, 893 [Define if your assembler supports AES instructions.]) 894fi 895 896dnl Test whether the linker supports the -static option. 897AC_CACHE_CHECK([whether -static is supported], 898[libgo_cv_ld_static], 899[LDFLAGS_hold=$LDFLAGS 900LDFLAGS="$LDFLAGS -static" 901AC_LINK_IFELSE([AC_LANG_PROGRAM(,)], 902[libgo_cv_ld_static=yes], 903[libgo_cv_ld_static=no]) 904LDFLAGS=$LDFLAGS_hold]) 905AM_CONDITIONAL(HAVE_STATIC_LINK, test "$libgo_cv_ld_static" = yes) 906 907AC_CACHE_SAVE 908 909if test ${multilib} = yes; then 910 multilib_arg="--enable-multilib" 911else 912 multilib_arg= 913fi 914 915AC_CONFIG_FILES(Makefile testsuite/Makefile testsuite/libgo-test-support.exp) 916 917AC_CONFIG_COMMANDS([default], 918[if test -n "$CONFIG_FILES"; then 919 # Multilibs need MULTISUBDIR defined correctly in certain makefiles so 920 # that multilib installs will end up installed in the correct place. 921 # The testsuite needs it for multilib-aware ABI baseline files. 922 # To work around this not being passed down from config-ml.in -> 923 # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually 924 # append it here. Only modify Makefiles that have just been created. 925 # 926 # Also, get rid of this simulated-VPATH thing that automake does. 927 cat > vpsed << \_EOF 928s!`test -f '$<' || echo '$(srcdir)/'`!! 929_EOF 930 for i in $SUBDIRS; do 931 case $CONFIG_FILES in 932 *${i}/Makefile*) 933 #echo "Adding MULTISUBDIR to $i/Makefile" 934 sed -f vpsed $i/Makefile > tmp 935 grep '^MULTISUBDIR =' Makefile >> tmp 936 mv tmp $i/Makefile 937 ;; 938 esac 939 done 940 rm vpsed 941 fi 942], 943[ 944# Variables needed in config.status (file generation) which aren't already 945# passed by autoconf. 946SUBDIRS="$SUBDIRS" 947]) 948 949AC_OUTPUT 950