github.com/golang/gofrontend@v0.0.0-20240429183944-60f985a78526/libgo/configure.ac (about)

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