#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.72 for python 3.16.
#
# Report bugs to <https://github.com/python/cpython/issues/>.
#
#
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
# Inc.
#
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else case e in #(
  e) case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac ;;
esac
fi



# Reset variables that may have inherited troublesome values from
# the environment.

# IFS needs to be set, to space, tab, and newline, in precisely that order.
# (If _AS_PATH_WALK were called with IFS unset, it would have the
# side effect of setting IFS to empty, thus disabling word splitting.)
# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
IFS=" ""	$as_nl"

PS1='$ '
PS2='> '
PS4='+ '

# Ensure predictable behavior from utilities with locale-dependent output.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# We cannot yet rely on "unset" to work, but we need these variables
# to be unset--not just set to an empty or harmless value--now, to
# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct
# also avoids known problems related to "unset" and subshell syntax
# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
do eval test \${$as_var+y} \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done

# Ensure that fds 0, 1, and 2 are open.
if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
if (exec 3>&2)            ; then :; else exec 2>/dev/null; fi

# The user is always right.
if ${PATH_SEPARATOR+false} :; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# Find who we are.  Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    test -r "$as_dir$0" && as_myself=$as_dir$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as 'sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi


# Use a proper internal environment variable to ensure we don't fall
  # into an infinite loop, continuously re-executing ourselves.
  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
    _as_can_reexec=no; export _as_can_reexec;
    # We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
  *v*x* | *x*v* ) as_opts=-vx ;;
  *v* ) as_opts=-v ;;
  *x* ) as_opts=-x ;;
  * ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed 'exec'.
printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
  fi
  # We don't want this to propagate to other subprocesses.
          { _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
  as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '\${1+\"\$@\"}'='\"\$@\"'
  setopt NO_GLOB_SUBST
else case e in #(
  e) case \`(set -o) 2>/dev/null\` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac ;;
esac
fi
"
  as_required="as_fn_return () { (exit \$1); }
as_fn_success () { as_fn_return 0; }
as_fn_failure () { as_fn_return 1; }
as_fn_ret_success () { return 0; }
as_fn_ret_failure () { return 1; }

exitcode=0
as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
if ( set x; as_fn_ret_success y && test x = \"\$1\" )
then :

else case e in #(
  e) exitcode=1; echo positional parameters were not saved. ;;
esac
fi
test x\$exitcode = x0 || exit 1
blah=\$(echo \$(echo blah))
test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
  if (eval "$as_required") 2>/dev/null
then :
  as_have_required=yes
else case e in #(
  e) as_have_required=no ;;
esac
fi
  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
then :

else case e in #(
  e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
  as_found=:
  case $as_dir in #(
	 /*)
	   for as_base in sh bash ksh sh5; do
	     # Try only shells that exist, to save several forks.
	     as_shell=$as_dir$as_base
	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
		    as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
then :
  CONFIG_SHELL=$as_shell as_have_required=yes
		   if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
then :
  break 2
fi
fi
	   done;;
       esac
  as_found=false
done
IFS=$as_save_IFS
if $as_found
then :

else case e in #(
  e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
	      as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
then :
  CONFIG_SHELL=$SHELL as_have_required=yes
fi ;;
esac
fi


      if test "x$CONFIG_SHELL" != x
then :
  export CONFIG_SHELL
             # We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
  *v*x* | *x*v* ) as_opts=-vx ;;
  *v* ) as_opts=-v ;;
  *x* ) as_opts=-x ;;
  * ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed 'exec'.
printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi

    if test x$as_have_required = xno
then :
  printf "%s\n" "$0: This script requires a shell more modern than all"
  printf "%s\n" "$0: the shells that I found on your system."
  if test ${ZSH_VERSION+y} ; then
    printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
    printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
  else
    printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
$0: https://github.com/python/cpython/issues/ about your
$0: system, including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
  fi
  exit 1
fi ;;
esac
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
export SHELL
# Unset more variables known to interfere with behavior of common tools.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS

## --------------------- ##
## M4sh Shell Functions. ##
## --------------------- ##
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset


# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
printf "%s\n" X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"


} # as_fn_mkdir_p

# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
  test -f "$1" && test -x "$1"
} # as_fn_executable_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else case e in #(
  e) as_fn_append ()
  {
    eval $1=\$$1\$2
  } ;;
esac
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else case e in #(
  e) as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  } ;;
esac
fi # as_fn_arith


# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
  as_status=$1; test $as_status -eq 0 && as_status=1
  if test "$4"; then
    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
  fi
  printf "%s\n" "$as_me: error: $2" >&2
  as_fn_exit $as_status
} # as_fn_error

if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
printf "%s\n" X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits


  as_lineno_1=$LINENO as_lineno_1a=$LINENO
  as_lineno_2=$LINENO as_lineno_2a=$LINENO
  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
  sed -n '
    p
    /[$]LINENO/=
  ' <$as_myself |
    sed '
      t clear
      :clear
      s/[$]LINENO.*/&-/
      t lineno
      b
      :lineno
      N
      :loop
      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
      t loop
      s/-\n.*//
    ' >$as_me.lineno &&
  chmod +x "$as_me.lineno" ||
    { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }

  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
  # already done that, so ensure we don't try to do so again and fall
  # in an infinite loop.  This has already happened in practice.
  _as_can_reexec=no; export _as_can_reexec
  # Don't try to exec as it changes $[0], causing all sort of problems
  # (the dirname of $[0] is not the place where we might find the
  # original and so on.  Autoconf is especially sensitive to this).
  . "./$as_me.lineno"
  # Exit status is that of the last command.
  exit
}


# Determine whether it's possible to make 'echo' print without a newline.
# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

# For backward compatibility with old third-party macros, we provide
# the shell variables $as_echo and $as_echo_n.  New code should use
# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
as_echo='printf %s\n'
as_echo_n='printf %s'

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable.
    # In both cases, we have to default to 'cp -pR'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -pR'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -pR'
  fi
else
  as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null

if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi

as_test_x='test -x'
as_executable_p=as_fn_executable_p

# Sed expression to map a string onto a valid CPP name.
as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated

# Sed expression to map a string onto a valid variable name.
as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
as_tr_sh="eval sed '$as_sed_sh'" # deprecated


test -n "$DJDIR" || exec 7<&0 </dev/null
exec 6>&1

# Name of the host.
# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`

#
# Initializations.
#
ac_default_prefix=/usr/local
ac_clean_files=
ac_config_libobj_dir=.
LIBOBJS=
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=

# Identity of this package.
PACKAGE_NAME='python'
PACKAGE_TARNAME='python'
PACKAGE_VERSION='3.16'
PACKAGE_STRING='python 3.16'
PACKAGE_BUGREPORT='https://github.com/python/cpython/issues/'
PACKAGE_URL=''

ac_unique_file="Include/object.h"
# Factoring default headers for most tests.
ac_includes_default="\
#include <stddef.h>
#ifdef HAVE_STDIO_H
# include <stdio.h>
#endif
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
# include <string.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"

ac_header_c_list=
ac_func_c_list=
ac_subst_vars='LTLIBOBJS
MODULE_BLOCK
JIT_SHIM_BUILD_O
JIT_SHIM_O
JIT_STENCILS_H
MODULE_XXLIMITED_3_13_FALSE
MODULE_XXLIMITED_3_13_TRUE
MODULE_XXLIMITED_35_FALSE
MODULE_XXLIMITED_35_TRUE
MODULE_XXLIMITED_FALSE
MODULE_XXLIMITED_TRUE
MODULE__CTYPES_TEST_FALSE
MODULE__CTYPES_TEST_TRUE
MODULE__XXTESTFUZZ_FALSE
MODULE__XXTESTFUZZ_TRUE
MODULE_XXSUBTYPE_FALSE
MODULE_XXSUBTYPE_TRUE
MODULE__TESTSINGLEPHASE_FALSE
MODULE__TESTSINGLEPHASE_TRUE
MODULE__TESTMULTIPHASE_FALSE
MODULE__TESTMULTIPHASE_TRUE
MODULE__TESTIMPORTMULTIPLE_FALSE
MODULE__TESTIMPORTMULTIPLE_TRUE
MODULE__TESTBUFFER_FALSE
MODULE__TESTBUFFER_TRUE
MODULE__TESTINTERNALCAPI_FALSE
MODULE__TESTINTERNALCAPI_TRUE
MODULE__TESTLIMITEDCAPI_FALSE
MODULE__TESTLIMITEDCAPI_TRUE
MODULE__TESTCLINIC_LIMITED_FALSE
MODULE__TESTCLINIC_LIMITED_TRUE
MODULE__TESTCLINIC_FALSE
MODULE__TESTCLINIC_TRUE
MODULE__TESTCAPI_FALSE
MODULE__TESTCAPI_TRUE
MODULE__HASHLIB_FALSE
MODULE__HASHLIB_TRUE
MODULE__SSL_FALSE
MODULE__SSL_TRUE
MODULE__ZSTD_FALSE
MODULE__ZSTD_TRUE
MODULE__LZMA_FALSE
MODULE__LZMA_TRUE
MODULE__BZ2_FALSE
MODULE__BZ2_TRUE
MODULE_BINASCII_FALSE
MODULE_BINASCII_TRUE
MODULE_ZLIB_FALSE
MODULE_ZLIB_TRUE
MODULE__UUID_FALSE
MODULE__UUID_TRUE
MODULE__TKINTER_FALSE
MODULE__TKINTER_TRUE
MODULE__SQLITE3_FALSE
MODULE__SQLITE3_TRUE
MODULE_READLINE_FALSE
MODULE_READLINE_TRUE
MODULE__GDBM_FALSE
MODULE__GDBM_TRUE
MODULE__DBM_FALSE
MODULE__DBM_TRUE
MODULE__DECIMAL_FALSE
MODULE__DECIMAL_TRUE
MODULE__CURSES_PANEL_FALSE
MODULE__CURSES_PANEL_TRUE
MODULE__CURSES_FALSE
MODULE__CURSES_TRUE
MODULE__CTYPES_FALSE
MODULE__CTYPES_TRUE
MODULE__HMAC_FALSE
MODULE__HMAC_TRUE
MODULE__BLAKE2_FALSE
MODULE__BLAKE2_TRUE
MODULE__SHA3_FALSE
MODULE__SHA3_TRUE
MODULE__SHA2_FALSE
MODULE__SHA2_TRUE
MODULE__SHA1_FALSE
MODULE__SHA1_TRUE
MODULE__MD5_FALSE
MODULE__MD5_TRUE
LIBHACL_LDEPS_LIBTYPE
LIBHACL_BLAKE2_SIMD256_OBJS
LIBHACL_SIMD256_FLAGS
LIBHACL_BLAKE2_SIMD128_OBJS
LIBHACL_SIMD128_FLAGS
LIBHACL_LDFLAGS
LIBHACL_CFLAGS
MODULE_UNICODEDATA_FALSE
MODULE_UNICODEDATA_TRUE
MODULE__MULTIBYTECODEC_FALSE
MODULE__MULTIBYTECODEC_TRUE
MODULE__CODECS_TW_FALSE
MODULE__CODECS_TW_TRUE
MODULE__CODECS_KR_FALSE
MODULE__CODECS_KR_TRUE
MODULE__CODECS_JP_FALSE
MODULE__CODECS_JP_TRUE
MODULE__CODECS_ISO2022_FALSE
MODULE__CODECS_ISO2022_TRUE
MODULE__CODECS_HK_FALSE
MODULE__CODECS_HK_TRUE
MODULE__CODECS_CN_FALSE
MODULE__CODECS_CN_TRUE
MODULE__ELEMENTTREE_FALSE
MODULE__ELEMENTTREE_TRUE
MODULE_PYEXPAT_FALSE
MODULE_PYEXPAT_TRUE
MODULE_TERMIOS_FALSE
MODULE_TERMIOS_TRUE
MODULE_SYSLOG_FALSE
MODULE_SYSLOG_TRUE
MODULE__SCPROXY_FALSE
MODULE__SCPROXY_TRUE
MODULE_RESOURCE_FALSE
MODULE_RESOURCE_TRUE
MODULE_PWD_FALSE
MODULE_PWD_TRUE
MODULE_GRP_FALSE
MODULE_GRP_TRUE
MODULE__SOCKET_FALSE
MODULE__SOCKET_TRUE
MODULE_MMAP_FALSE
MODULE_MMAP_TRUE
MODULE_FCNTL_FALSE
MODULE_FCNTL_TRUE
MODULE__DATETIME_FALSE
MODULE__DATETIME_TRUE
MODULE_MATH_FALSE
MODULE_MATH_TRUE
MODULE_CMATH_FALSE
MODULE_CMATH_TRUE
MODULE__STATISTICS_FALSE
MODULE__STATISTICS_TRUE
MODULE__POSIXSHMEM_FALSE
MODULE__POSIXSHMEM_TRUE
MODULE__MULTIPROCESSING_FALSE
MODULE__MULTIPROCESSING_TRUE
MODULE__ZONEINFO_FALSE
MODULE__ZONEINFO_TRUE
MODULE__INTERPQUEUES_FALSE
MODULE__INTERPQUEUES_TRUE
MODULE__INTERPCHANNELS_FALSE
MODULE__INTERPCHANNELS_TRUE
MODULE__INTERPRETERS_FALSE
MODULE__INTERPRETERS_TRUE
MODULE__TYPING_FALSE
MODULE__TYPING_TRUE
MODULE__TYPES_FALSE
MODULE__TYPES_TRUE
MODULE__STRUCT_FALSE
MODULE__STRUCT_TRUE
MODULE_SELECT_FALSE
MODULE_SELECT_TRUE
MODULE__REMOTE_DEBUGGING_FALSE
MODULE__REMOTE_DEBUGGING_TRUE
MODULE__RANDOM_FALSE
MODULE__RANDOM_TRUE
MODULE__QUEUE_FALSE
MODULE__QUEUE_TRUE
MODULE__POSIXSUBPROCESS_FALSE
MODULE__POSIXSUBPROCESS_TRUE
MODULE__PICKLE_FALSE
MODULE__PICKLE_TRUE
MODULE__LSPROF_FALSE
MODULE__LSPROF_TRUE
MODULE__JSON_FALSE
MODULE__JSON_TRUE
MODULE__HEAPQ_FALSE
MODULE__HEAPQ_TRUE
MODULE__CSV_FALSE
MODULE__CSV_TRUE
MODULE__BISECT_FALSE
MODULE__BISECT_TRUE
MODULE__ASYNCIO_FALSE
MODULE__ASYNCIO_TRUE
MODULE__MATH_INTEGER_FALSE
MODULE__MATH_INTEGER_TRUE
MODULE_ARRAY_FALSE
MODULE_ARRAY_TRUE
MODULE_TIME_FALSE
MODULE_TIME_TRUE
MODULE__IO_FALSE
MODULE__IO_TRUE
MODULE_BUILDTYPE
_PYTHREAD_NAME_MAXLEN
BUILD_DETAILS
TEST_MODULES
OPENSSL_LDFLAGS
OPENSSL_LIBS
OPENSSL_INCLUDES
ENSUREPIP
CFLAGS_CEVAL
SRCDIRS
THREADHEADERS
PANEL_LIBS
PANEL_CFLAGS
CURSES_LIBS
CURSES_CFLAGS
LIBEDIT_LIBS
LIBEDIT_CFLAGS
LIBREADLINE_LIBS
LIBREADLINE_CFLAGS
WHEEL_PKG_DIR
LIBPL
PY_ENABLE_SHARED
BINLIBDEST
LIBDEST
PLATLIBDIR
LIBPYTHON
MODULE_DEPS_SHARED
EXT_SUFFIX
ALT_SOABI
SOABI
LIBC
LIBM
HAVE_GETHOSTBYNAME
HAVE_GETHOSTBYNAME_R
HAVE_GETHOSTBYNAME_R_3_ARG
HAVE_GETHOSTBYNAME_R_5_ARG
HAVE_GETHOSTBYNAME_R_6_ARG
LIBOBJS
REMOTE_DEBUGGING_LIBS
REMOTE_DEBUGGING_CFLAGS
LIBZSTD_LIBS
LIBZSTD_CFLAGS
LIBLZMA_LIBS
LIBLZMA_CFLAGS
BZIP2_LIBS
BZIP2_CFLAGS
ZLIB_LIBS
ZLIB_CFLAGS
TRUE
MACHDEP_OBJS
DYNLOADFILE
DLINCLDIR
PLATFORM_OBJS
PLATFORM_HEADERS
DTRACE_OBJS
DTRACE_HEADERS
DFLAGS
DTRACE
INSTALL_MIMALLOC
MIMALLOC_HEADERS
GDBM_LIBS
GDBM_CFLAGS
X11_LIBS
X11_CFLAGS
TCLTK_LIBS
TCLTK_CFLAGS
LIBSQLITE3_LIBS
LIBSQLITE3_CFLAGS
LIBMPDEC_LIBS
LIBMPDEC_CFLAGS
MODULE__CTYPES_MALLOC_CLOSURE
LIBFFI_LIBS
LIBFFI_CFLAGS
LIBEXPAT_INTERNAL
LIBEXPAT_CFLAGS
TZPATH
LIBUUID_LIBS
LIBUUID_CFLAGS
PERF_TRAMPOLINE_OBJ
SHLIBS
CFLAGSFORSHARED
LINKFORSHARED
CCSHARED
BLDSHARED
LDCXXSHARED
LDSHARED
SHLIB_SUFFIX
DSYMUTIL_PATH
DSYMUTIL
REGEN_JIT_COMMAND
UNIVERSAL_ARCH_FLAGS
WASM_STDLIB
WASM_ASSETS_DIR
LDFLAGS_NOLTO
EXE_LDFLAGS
LDFLAGS_NODIST
CFLAGS_NODIST
BASECFLAGS
CFLAGS_ALIASING
OPT
BOLT_APPLY_FLAGS
BOLT_INSTRUMENT_FLAGS
BOLT_COMMON_FLAGS
BOLT_BINARIES
MERGE_FDATA
LLVM_BOLT
PREBOLT_RULE
LLVM_PROF_FOUND
LLVM_PROFDATA
LLVM_PROF_ERR
LLVM_PROF_FILE
LLVM_PROF_MERGER
PGO_PROF_USE_FLAG
PGO_PROF_GEN_FLAG
LLVM_AR_FOUND
LLVM_AR
PROFILE_TASK
DEF_MAKE_RULE
DEF_MAKE_ALL_RULE
ABI_THREAD
ABIFLAGS
LN
MKDIR_P
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
ARFLAGS
ac_ct_AR
AR
LINK_PYTHON_OBJS
LINK_PYTHON_DEPS
LIBRARY_DEPS
HOSTRUNNER
NODE
STATIC_LIBPYTHON
GNULD
EXPORTSFROM
EXPORTSYMS
LINKCC
LDVERSION
RUNSHARED
INSTSONAME
LDLIBRARYDIR
PY3LIBRARY
BLDLIBRARY
DLLLIBRARY
LDLIBRARY
LIBRARY
BUILDEXEEXT
NO_AS_NEEDED
_Py_STACK_GROWS_DOWN
MULTIARCH_CPPFLAGS
PLATFORM_TRIPLET
MULTIARCH
ac_ct_CXX
CXX
EGREP
SED
GREP
CPP
OBJEXT
EXEEXT
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
HAS_XCRUN
IPHONEOS_DEPLOYMENT_TARGET
EXPORT_MACOSX_DEPLOYMENT_TARGET
CONFIGURE_MACOSX_DEPLOYMENT_TARGET
_PYTHON_HOST_PLATFORM
APP_STORE_COMPLIANCE_PATCH
INSTALLTARGETS
FRAMEWORKINSTALLAPPSPREFIX
FRAMEWORKUNIXTOOLSPREFIX
FRAMEWORKPYTHONW
FRAMEWORKALTINSTALLLAST
FRAMEWORKALTINSTALLFIRST
FRAMEWORKINSTALLLAST
FRAMEWORKINSTALLFIRST
RESSRCDIR
PYTHONFRAMEWORKINSTALLNAMEPREFIX
PYTHONFRAMEWORKINSTALLDIR
PYTHONFRAMEWORKPREFIX
PYTHONFRAMEWORKDIR
PYTHONFRAMEWORKIDENTIFIER
PYTHONFRAMEWORK
LIPO_INTEL64_FLAGS
LIPO_32BIT_FLAGS
ARCH_RUN_32BIT
UNIVERSALSDK
host_exec_prefix
host_prefix
MACHDEP
MISSING_STDLIB_CONFIG
PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH
PKG_CONFIG
CONFIG_ARGS
SOVERSION
VERSION
PYTHON_FOR_REGEN
PYTHON_FOR_BUILD_DEPS
FREEZE_MODULE_DEPS
FREEZE_MODULE
FREEZE_MODULE_BOOTSTRAP_DEPS
FREEZE_MODULE_BOOTSTRAP
PYTHON_FOR_FREEZE
PYTHON_FOR_BUILD
host_os
host_vendor
host_cpu
host
build_os
build_vendor
build_cpu
build
HAS_GIT
GITBRANCH
GITTAG
GITVERSION
BASECPPFLAGS
target_alias
host_alias
build_alias
LIBS
ECHO_T
ECHO_N
ECHO_C
DEFS
mandir
localedir
libdir
psdir
pdfdir
dvidir
htmldir
infodir
docdir
oldincludedir
includedir
runstatedir
localstatedir
sharedstatedir
sysconfdir
datadir
datarootdir
libexecdir
sbindir
bindir
program_transform_name
prefix
exec_prefix
PACKAGE_URL
PACKAGE_BUGREPORT
PACKAGE_STRING
PACKAGE_VERSION
PACKAGE_TARNAME
PACKAGE_NAME
PATH_SEPARATOR
SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
with_build_python
with_pkg_config
with_missing_stdlib_config
enable_universalsdk
with_universal_archs
with_framework_name
enable_framework
with_app_store_compliance
enable_wasm_dynamic_linking
enable_wasm_pthreads
enable_emscripten_syscalls
with_suffix
enable_shared
with_static_libpython
enable_static_libpython_for_interpreter
enable_profiling
enable_gil
with_pydebug
with_trace_refs
enable_pystats
with_assertions
enable_optimizations
with_lto
enable_bolt
with_strict_overflow
enable_safety
enable_slower_safety
with_frame_pointers
enable_experimental_jit
with_dsymutil
with_address_sanitizer
with_memory_sanitizer
with_undefined_behavior_sanitizer
with_thread_sanitizer
with_hash_algorithm
with_tzpath
with_libs
with_system_expat
with_decimal_contextvar
enable_loadable_sqlite_extensions
with_dbmliborder
enable_ipv6
with_doc_strings
with_mimalloc
with_pymalloc
with_pymalloc_hugepages
with_c_locale_coercion
with_valgrind
with_dtrace
enable_epoll
with_zlib
with_bzip2
with_libm
with_libc
enable_big_digits
with_platlibdir
with_wheel_pkg_dir
with_readline
with_curses
with_computed_gotos
with_tail_call_interp
with_remote_debug
with_ensurepip
with_openssl
with_openssl_rpath
with_ssl_default_suites
with_builtin_hashlib_hashes
enable_test_modules
with_build_details_suffix
'
      ac_precious_vars='build_alias
host_alias
target_alias
PKG_CONFIG
PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
MACHDEP
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
CPP
PROFILE_TASK
BOLT_COMMON_FLAGS
BOLT_INSTRUMENT_FLAGS
BOLT_APPLY_FLAGS
LIBUUID_CFLAGS
LIBUUID_LIBS
LIBFFI_CFLAGS
LIBFFI_LIBS
LIBMPDEC_CFLAGS
LIBMPDEC_LIBS
LIBSQLITE3_CFLAGS
LIBSQLITE3_LIBS
TCLTK_CFLAGS
TCLTK_LIBS
X11_CFLAGS
X11_LIBS
GDBM_CFLAGS
GDBM_LIBS
ZLIB_CFLAGS
ZLIB_LIBS
BZIP2_CFLAGS
BZIP2_LIBS
LIBLZMA_CFLAGS
LIBLZMA_LIBS
LIBZSTD_CFLAGS
LIBZSTD_LIBS
LIBREADLINE_CFLAGS
LIBREADLINE_LIBS
LIBEDIT_CFLAGS
LIBEDIT_LIBS
CURSES_CFLAGS
CURSES_LIBS
PANEL_CFLAGS
PANEL_LIBS'


# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
ac_unrecognized_opts=
ac_unrecognized_sep=
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE

# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
# (The list follows the same order as the GNU Coding Standards.)
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datarootdir='${prefix}/share'
datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
runstatedir='${localstatedir}/run'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
pdfdir='${docdir}'
psdir='${docdir}'
libdir='${exec_prefix}/lib'
localedir='${datarootdir}/locale'
mandir='${datarootdir}/man'

ac_prev=
ac_dashdash=
for ac_option
do
  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval $ac_prev=\$ac_option
    ac_prev=
    continue
  fi

  case $ac_option in
  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
  *=)   ac_optarg= ;;
  *)    ac_optarg=yes ;;
  esac

  case $ac_dashdash$ac_option in
  --)
    ac_dashdash=yes ;;

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir=$ac_optarg ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build_alias ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build_alias=$ac_optarg ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file=$ac_optarg ;;

  --config-cache | -C)
    cache_file=config.cache ;;

  -datadir | --datadir | --datadi | --datad)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=*)
    datadir=$ac_optarg ;;

  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
  | --dataroo | --dataro | --datar)
    ac_prev=datarootdir ;;
  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
    datarootdir=$ac_optarg ;;

  -disable-* | --disable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid feature name: '$ac_useropt'"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=no ;;

  -docdir | --docdir | --docdi | --doc | --do)
    ac_prev=docdir ;;
  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
    docdir=$ac_optarg ;;

  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
    ac_prev=dvidir ;;
  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
    dvidir=$ac_optarg ;;

  -enable-* | --enable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid feature name: '$ac_useropt'"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=\$ac_optarg ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix=$ac_optarg ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he | -h)
    ac_init_help=long ;;
  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
    ac_init_help=recursive ;;
  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
    ac_init_help=short ;;

  -host | --host | --hos | --ho)
    ac_prev=host_alias ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host_alias=$ac_optarg ;;

  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
    ac_prev=htmldir ;;
  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
  | --ht=*)
    htmldir=$ac_optarg ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir=$ac_optarg ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir=$ac_optarg ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir=$ac_optarg ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir=$ac_optarg ;;

  -localedir | --localedir | --localedi | --localed | --locale)
    ac_prev=localedir ;;
  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
    localedir=$ac_optarg ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst | --locals)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
    localstatedir=$ac_optarg ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir=$ac_optarg ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c | -n)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir=$ac_optarg ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix=$ac_optarg ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix=$ac_optarg ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix=$ac_optarg ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name=$ac_optarg ;;

  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
    ac_prev=pdfdir ;;
  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
    pdfdir=$ac_optarg ;;

  -psdir | --psdir | --psdi | --psd | --ps)
    ac_prev=psdir ;;
  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
    psdir=$ac_optarg ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -runstatedir | --runstatedir | --runstatedi | --runstated \
  | --runstate | --runstat | --runsta | --runst | --runs \
  | --run | --ru | --r)
    ac_prev=runstatedir ;;
  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
  | --run=* | --ru=* | --r=*)
    runstatedir=$ac_optarg ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir=$ac_optarg ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir=$ac_optarg ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site=$ac_optarg ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir=$ac_optarg ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir=$ac_optarg ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target_alias ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target_alias=$ac_optarg ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers | -V)
    ac_init_version=: ;;

  -with-* | --with-*)
    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid package name: '$ac_useropt'"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=\$ac_optarg ;;

  -without-* | --without-*)
    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid package name: '$ac_useropt'"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=no ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes=$ac_optarg ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries=$ac_optarg ;;

  -*) as_fn_error $? "unrecognized option: '$ac_option'
Try '$0 --help' for more information"
    ;;

  *=*)
    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
    # Reject names that are not valid shell variable names.
    case $ac_envvar in #(
      '' | [0-9]* | *[!_$as_cr_alnum]* )
      as_fn_error $? "invalid variable name: '$ac_envvar'" ;;
    esac
    eval $ac_envvar=\$ac_optarg
    export $ac_envvar ;;

  *)
    # FIXME: should be removed in autoconf 3.0.
    printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
      printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
    ;;

  esac
done

if test -n "$ac_prev"; then
  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
  as_fn_error $? "missing argument to $ac_option"
fi

if test -n "$ac_unrecognized_opts"; then
  case $enable_option_checking in
    no) ;;
    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
    *)     printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
  esac
fi

# Check all directory arguments for consistency.
for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
		datadir sysconfdir sharedstatedir localstatedir includedir \
		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
		libdir localedir mandir runstatedir
do
  eval ac_val=\$$ac_var
  # Remove trailing slashes.
  case $ac_val in
    */ )
      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
      eval $ac_var=\$ac_val;;
  esac
  # Be sure to have absolute directory names.
  case $ac_val in
    [\\/$]* | ?:[\\/]* )  continue;;
    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
  esac
  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done

# There might be people who depend on the old broken behavior: '$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias

# FIXME: To remove some day.
if test "x$host_alias" != x; then
  if test "x$build_alias" = x; then
    cross_compiling=maybe
  elif test "x$build_alias" != "x$host_alias"; then
    cross_compiling=yes
  fi
fi

ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-

test "$silent" = yes && exec 6>/dev/null


ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
  as_fn_error $? "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
  as_fn_error $? "pwd does not report name of working directory"


# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then the parent directory.
  ac_confdir=`$as_dirname -- "$as_myself" ||
$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_myself" : 'X\(//\)[^/]' \| \
	 X"$as_myself" : 'X\(//\)$' \| \
	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
printf "%s\n" X"$as_myself" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  srcdir=$ac_confdir
  if test ! -r "$srcdir/$ac_unique_file"; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r "$srcdir/$ac_unique_file"; then
  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work"
ac_abs_confdir=`(
	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
	pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
  srcdir=.
fi
# Remove unnecessary trailing slashes from srcdir.
# Double slashes in file names in object file debugging info
# mess up M-x gdb in Emacs.
case $srcdir in
*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
esac
for ac_var in $ac_precious_vars; do
  eval ac_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_env_${ac_var}_value=\$${ac_var}
  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_cv_env_${ac_var}_value=\$${ac_var}
done

#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
  # Omit some internal or obsolete options to make the list less imposing.
  # This message is too long to be a string in the A/UX 3.1 sh.
  cat <<_ACEOF
'configure' configures python 3.16 to adapt to many kinds of systems.

Usage: $0 [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print 'checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for '--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or '..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, 'make install' will install all the files in
'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc.  You can specify
an installation prefix other than '$ac_default_prefix' using '--prefix',
for instance '--prefix=\$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/python]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]
_ACEOF

  cat <<\_ACEOF

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
_ACEOF
fi

if test -n "$ac_init_help"; then
  case $ac_init_help in
     short | recursive ) echo "Configuration of python 3.16:";;
   esac
  cat <<\_ACEOF

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-universalsdk[=SDKDIR]
                          create a universal binary build. SDKDIR specifies
                          which macOS SDK should be used to perform the build,
                          see Mac/README.rst. (default is no)
  --enable-framework[=INSTALLDIR]
                          create a Python.framework rather than a traditional
                          Unix install. optional INSTALLDIR specifies the
                          installation path. see Mac/README.rst (default is
                          no)
  --enable-wasm-dynamic-linking
                          Enable dynamic linking support for WebAssembly
                          (default is no); WASI requires an external dynamic
                          loader to handle imports
  --enable-wasm-pthreads  Enable pthread emulation for WebAssembly (default is
                          no)
  --disable-emscripten-syscalls
                          Disable the Emscripten syscall overrides in
                          Python/emscripten_syscalls.c (default is enabled for
                          Emscripten)
  --enable-shared         enable building a shared Python library (default is
                          no)
  --enable-static-libpython-for-interpreter
                          even with --enable-shared, statically link libpython
                          into the interpreter (default is to use the shared
                          library)
  --enable-profiling      enable C-level code profiling with gprof (default is
                          no)
  --disable-gil           enable support for running without the GIL (default
                          is no)
  --enable-pystats        enable internal statistics gathering (default is no)
  --enable-optimizations  enable expensive, stable optimizations (PGO, etc.)
                          (default is no)
  --enable-bolt           enable usage of the llvm-bolt post-link optimizer
                          (default is no)
  --enable-safety         enable usage of the security compiler options with
                          no performance overhead
  --enable-slower-safety  enable usage of the security compiler options with
                          performance overhead
  --enable-experimental-jit[=no|yes|yes-off|interpreter]
                          build the experimental just-in-time compiler
                          (default is no)
  --enable-loadable-sqlite-extensions
                          support loadable extensions in the sqlite3 module,
                          see Doc/library/sqlite3.rst (default is no)
  --enable-ipv6           enable ipv6 (with ipv4) support, see
                          Doc/library/socket.rst (default is yes if supported)
  --disable-epoll         disable epoll (default is yes if supported)
  --enable-big-digits[=15|30]
                          use big digits (30 or 15 bits) for Python longs
                          (default is 30)]
  --disable-test-modules  don't build nor install test modules

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-build-python=python3.16
                          path to build python binary for cross compiling
                          (default: _bootstrap_python or python3.16)
  --with-pkg-config=[yes|no|check]
                          use pkg-config to detect build options (default is
                          check)
  --with-missing-stdlib-config=FILE
                          File with custom module error messages for missing
                          stdlib modules
  --with-universal-archs=ARCH
                          specify the kind of macOS universal binary that
                          should be created. This option is only valid when
                          --enable-universalsdk is set; options are:
                          ("universal2", "intel-64", "intel-32", "intel",
                          "32-bit", "64-bit", "3-way", or "all") see
                          Mac/README.rst
  --with-framework-name=FRAMEWORK
                          specify the name for the python framework on macOS
                          only valid when --enable-framework is set. see
                          Mac/README.rst (default is 'Python')
  --with-app-store-compliance=[PATCH-FILE]
                          Enable any patches required for compiliance with app
                          stores. Optional PATCH-FILE specifies the custom
                          patch to apply.
  --with-suffix=SUFFIX    set executable suffix to SUFFIX (default is empty,
                          yes is mapped to '.exe')
  --without-static-libpython
                          do not build libpythonMAJOR.MINOR.a and do not
                          install python.o (default is yes)
  --with-pydebug          build with Py_DEBUG defined (default is no)
  --with-trace-refs       enable tracing references for debugging purpose
                          (default is no)
  --with-assertions       build with C assertions enabled (default is no)
  --with-lto=[full|thin|no|yes]
                          enable Link-Time-Optimization in any build (default
                          is no)
  --with-strict-overflow  if 'yes', add -fstrict-overflow to CFLAGS, else add
                          -fno-strict-overflow (default is no)
  --without-frame-pointers
                          build without frame pointers (default is no)
  --with-dsymutil         link debug information into final executable with
                          dsymutil in macOS (default is no)
  --with-address-sanitizer
                          enable AddressSanitizer memory error detector,
                          'asan' (default is no)
  --with-memory-sanitizer enable MemorySanitizer allocation error detector,
                          'msan' (default is no)
  --with-undefined-behavior-sanitizer
                          enable UndefinedBehaviorSanitizer undefined
                          behaviour detector, 'ubsan' (default is no)
  --with-thread-sanitizer enable ThreadSanitizer data race detector, 'tsan'
                          (default is no)
  --with-hash-algorithm=[fnv|siphash13|siphash24]
                          select hash algorithm for use in Python/pyhash.c
                          (default is SipHash13)
  --with-tzpath=<list of absolute paths separated by pathsep>
                          Select the default time zone search path for
                          zoneinfo.TZPATH
  --with-libs='lib1 ...'  link against additional libs (default is no)
  --with-system-expat     build pyexpat module using an installed expat
                          library, see Doc/library/pyexpat.rst (default is no)
  --with-decimal-contextvar
                          build _decimal module using a coroutine-local rather
                          than a thread-local context (default is yes)
  --with-dbmliborder=db1:db2:...
                          override order to check db backends for dbm; a valid
                          value is a colon separated string with the backend
                          names `ndbm', `gdbm' and `bdb'.
  --with-doc-strings      enable documentation strings (default is yes)
  --with-mimalloc         build with mimalloc memory allocator (default is yes
                          if C11 stdatomic.h is available.)
  --with-pymalloc         enable specialized mallocs (default is yes)
  --with-pymalloc-hugepages
                          enable huge page support for pymalloc arenas
                          (default is no)
  --with-c-locale-coercion
                          enable C locale coercion to a UTF-8 based locale
                          (default is yes)
  --with-valgrind         enable Valgrind support (default is no)
  --with-dtrace           enable DTrace support (default is no)
  --with(out)-zlib[=zlib|zlib-ng|zlib-rs|no]
                          select the zlib implementation to link against, or
                          disable zlib support (default: auto)
  --with(out)-bzip2[=bzip2|bzip2-rs|no]
                          select the bzip2 implementation to link against, or
                          disable bzip2 support (default: auto)
  --with-libm=STRING      override libm math library to STRING (default is
                          system-dependent)
  --with-libc=STRING      override libc C library to STRING (default is
                          system-dependent)
  --with-platlibdir=DIRNAME
                          Python library directory name (default is "lib")
  --with-wheel-pkg-dir=PATH
                          Directory of wheel packages used by ensurepip
                          (default: none)
  --with(out)-readline[=editline|readline|no]
                          use libedit for backend or disable readline module
  --with(out)-curses[=ncursesw|ncurses|curses|no]
                          select the curses backend for the curses and
                          _curses_panel modules, or disable them (default:
                          auto)
  --with-computed-gotos   enable computed gotos in evaluation loop (enabled by
                          default on supported compilers)
  --with-tail-call-interp enable tail-calling interpreter in evaluation loop
                          and rest of CPython
  --with-remote-debug     enable remote debugging support (default is yes)
  --with-ensurepip[=install|upgrade|no]
                          "install" or "upgrade" using bundled pip (default is
                          upgrade)
  --with-openssl=DIR      root of the OpenSSL directory
  --with-openssl-rpath=[DIR|auto|no]
                          Set runtime library directory (rpath) for OpenSSL
                          libraries, no (default): don't set rpath, auto:
                          auto-detect rpath from --with-openssl and
                          pkg-config, DIR: set an explicit rpath
  --with-ssl-default-suites=[python|openssl|STRING]
                          override default cipher suites string, python: use
                          Python's preferred selection (default), openssl:
                          leave OpenSSL's defaults untouched, STRING: use a
                          custom string, python and STRING also set TLS 1.2 as
                          minimum TLS version
  --with-builtin-hashlib-hashes=md5,sha1,sha2,sha3,blake2
                          builtin hash modules, md5, sha1, sha2, sha3 (with
                          shake), blake2
  --with-build-details-suffix=
                          rename build-details.json to permit multiple
                          colocated Python installs; optionally specify a
                          custom suffix (default: no)

Some influential environment variables:
  PKG_CONFIG  path to pkg-config utility
  PKG_CONFIG_PATH
              directories to add to pkg-config's search path
  PKG_CONFIG_LIBDIR
              path overriding pkg-config's built-in search path
  MACHDEP     name for machine-dependent library files
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CPP         C preprocessor
  PROFILE_TASK
              Python args for PGO generation task
  BOLT_COMMON_FLAGS
              Common arguments to llvm-bolt when instrumenting and applying
  BOLT_INSTRUMENT_FLAGS
              Arguments to llvm-bolt when instrumenting binaries
  BOLT_APPLY_FLAGS
              Arguments to llvm-bolt when creating a BOLT optimized binary
  LIBUUID_CFLAGS
              C compiler flags for LIBUUID, overriding pkg-config
  LIBUUID_LIBS
              linker flags for LIBUUID, overriding pkg-config
  LIBFFI_CFLAGS
              C compiler flags for LIBFFI, overriding pkg-config
  LIBFFI_LIBS linker flags for LIBFFI, overriding pkg-config
  LIBMPDEC_CFLAGS
              C compiler flags for LIBMPDEC, overriding pkg-config
  LIBMPDEC_LIBS
              linker flags for LIBMPDEC, overriding pkg-config
  LIBSQLITE3_CFLAGS
              C compiler flags for LIBSQLITE3, overriding pkg-config
  LIBSQLITE3_LIBS
              linker flags for LIBSQLITE3, overriding pkg-config
  TCLTK_CFLAGS
              C compiler flags for TCLTK, overriding pkg-config
  TCLTK_LIBS  linker flags for TCLTK, overriding pkg-config
  X11_CFLAGS  C compiler flags for X11, overriding pkg-config
  X11_LIBS    linker flags for X11, overriding pkg-config
  GDBM_CFLAGS C compiler flags for gdbm
  GDBM_LIBS   additional linker flags for gdbm
  ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config
  ZLIB_LIBS   linker flags for ZLIB, overriding pkg-config
  BZIP2_CFLAGS
              C compiler flags for BZIP2, overriding pkg-config
  BZIP2_LIBS  linker flags for BZIP2, overriding pkg-config
  LIBLZMA_CFLAGS
              C compiler flags for LIBLZMA, overriding pkg-config
  LIBLZMA_LIBS
              linker flags for LIBLZMA, overriding pkg-config
  LIBZSTD_CFLAGS
              C compiler flags for LIBZSTD, overriding pkg-config
  LIBZSTD_LIBS
              linker flags for LIBZSTD, overriding pkg-config
  LIBREADLINE_CFLAGS
              C compiler flags for LIBREADLINE, overriding pkg-config
  LIBREADLINE_LIBS
              linker flags for LIBREADLINE, overriding pkg-config
  LIBEDIT_CFLAGS
              C compiler flags for LIBEDIT, overriding pkg-config
  LIBEDIT_LIBS
              linker flags for LIBEDIT, overriding pkg-config
  CURSES_CFLAGS
              C compiler flags for CURSES, overriding pkg-config
  CURSES_LIBS linker flags for CURSES, overriding pkg-config
  PANEL_CFLAGS
              C compiler flags for PANEL, overriding pkg-config
  PANEL_LIBS  linker flags for PANEL, overriding pkg-config

Use these variables to override the choices made by 'configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to <https://github.com/python/cpython/issues/>.
_ACEOF
ac_status=$?
fi

if test "$ac_init_help" = "recursive"; then
  # If there are subdirs, report their specific --help.
  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
    test -d "$ac_dir" ||
      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
      continue
    ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix

    cd "$ac_dir" || { ac_status=$?; continue; }
    # Check for configure.gnu first; this name is used for a wrapper for
    # Metaconfig's "Configure" on case-insensitive file systems.
    if test -f "$ac_srcdir/configure.gnu"; then
      echo &&
      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
    elif test -f "$ac_srcdir/configure"; then
      echo &&
      $SHELL "$ac_srcdir/configure" --help=recursive
    else
      printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
    fi || ac_status=$?
    cd "$ac_pwd" || { ac_status=$?; break; }
  done
fi

test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
  cat <<\_ACEOF
python configure 3.16
generated by GNU Autoconf 2.72

Copyright (C) 2023 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
  exit
fi

## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##

# ac_fn_c_try_compile LINENO
# --------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest.beam
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext
then :
  ac_retval=0
else case e in #(
  e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1 ;;
esac
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_compile

# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_cpp ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } > conftest.i && {
	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
	 test ! -s conftest.err
       }
then :
  ac_retval=0
else case e in #(
  e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

    ac_retval=1 ;;
esac
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_cpp

# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
# INCLUDES, setting the cache variable VAR accordingly.
ac_fn_c_check_header_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
printf %s "checking for $2... " >&6; }
if eval test \${$3+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  eval "$3=yes"
else case e in #(
  e) eval "$3=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
eval ac_res=\$$3
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_header_compile

# ac_fn_c_try_link LINENO
# -----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_link ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 test -x conftest$ac_exeext
       }
then :
  ac_retval=0
else case e in #(
  e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1 ;;
esac
fi
  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
  # interfere with the next link command; also delete a directory that is
  # left behind by Apple's compiler.  We do this before executing the actions.
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_link

# ac_fn_c_try_run LINENO
# ----------------------
# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
# executables *can* be run.
ac_fn_c_try_run ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }
then :
  ac_retval=0
else case e in #(
  e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5
       printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

       ac_retval=$ac_status ;;
esac
fi
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_run

# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR
# ------------------------------------------------------------------
# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR.
ac_fn_check_decl ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  as_decl_name=`echo $2|sed 's/ *(.*//'`
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
printf %s "checking whether $as_decl_name is declared... " >&6; }
if eval test \${$3+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
  eval ac_save_FLAGS=\$$6
  as_fn_append $6 " $5"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main (void)
{
#ifndef $as_decl_name
#ifdef __cplusplus
  (void) $as_decl_use;
#else
  (void) $as_decl_name;
#endif
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  eval "$3=yes"
else case e in #(
  e) eval "$3=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  eval $6=\$ac_save_FLAGS
 ;;
esac
fi
eval ac_res=\$$3
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_check_decl

# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
# variable VAR accordingly.
ac_fn_c_check_type ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
printf %s "checking for $2... " >&6; }
if eval test \${$3+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) eval "$3=no"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main (void)
{
if (sizeof ($2))
	 return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main (void)
{
if (sizeof (($2)))
	    return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

else case e in #(
  e) eval "$3=yes" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
eval ac_res=\$$3
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_type

# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
# INCLUDES, setting VAR accordingly. Returns whether the value could be
# computed
ac_fn_c_compute_int ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if test "$cross_compiling" = yes; then
    # Depending upon the size, compute the lo and hi bounds.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main (void)
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_lo=0 ac_mid=0
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_hi=$ac_mid; break
else case e in #(
  e) as_fn_arith $ac_mid + 1 && ac_lo=$as_val
			if test $ac_lo -le $ac_mid; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  done
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main (void)
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_hi=-1 ac_mid=-1
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main (void)
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_lo=$ac_mid; break
else case e in #(
  e) as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
			if test $ac_mid -le $ac_hi; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  done
else case e in #(
  e) ac_lo= ac_hi= ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_hi=$ac_mid
else case e in #(
  e) as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
'') ac_retval=1 ;;
esac
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
static long int longval (void) { return $2; }
static unsigned long int ulongval (void) { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
main (void)
{

  FILE *f = fopen ("conftest.val", "w");
  if (! f)
    return 1;
  if (($2) < 0)
    {
      long int i = longval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%ld", i);
    }
  else
    {
      unsigned long int i = ulongval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%lu", i);
    }
  /* Do not output a trailing newline, as this causes \r\n confusion
     on some platforms.  */
  return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
else case e in #(
  e) ac_retval=1 ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
rm -f conftest.val

  fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_compute_int

# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
ac_fn_c_check_func ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
printf %s "checking for $2... " >&6; }
if eval test \${$3+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
#define $2 innocuous_$2

/* System header to define __stub macros and hopefully few prototypes,
   which can conflict with char $2 (void); below.  */

#include <limits.h>
#undef $2

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char $2 (void);
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined __stub_$2 || defined __stub___$2
choke me
#endif

int
main (void)
{
return $2 ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  eval "$3=yes"
else case e in #(
  e) eval "$3=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext ;;
esac
fi
eval ac_res=\$$3
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_func

# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
# ----------------------------------------------------
# Tries to find if the field MEMBER exists in type AGGR, after including
# INCLUDES, setting cache variable VAR accordingly.
ac_fn_c_check_member ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
printf %s "checking for $2.$3... " >&6; }
if eval test \${$4+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$5
int
main (void)
{
static $2 ac_aggr;
if (ac_aggr.$3)
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  eval "$4=yes"
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$5
int
main (void)
{
static $2 ac_aggr;
if (sizeof ac_aggr.$3)
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  eval "$4=yes"
else case e in #(
  e) eval "$4=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
eval ac_res=\$$4
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_member
ac_configure_args_raw=
for ac_arg
do
  case $ac_arg in
  *\'*)
    ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
  esac
  as_fn_append ac_configure_args_raw " '$ac_arg'"
done

case $ac_configure_args_raw in
  *$as_nl*)
    ac_safe_unquote= ;;
  *)
    ac_unsafe_z='|&;<>()$`\\"*?[ ''	' # This string ends in space, tab.
    ac_unsafe_a="$ac_unsafe_z#~"
    ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
    ac_configure_args_raw=`      printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
esac

cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by python $as_me 3.16, which was
generated by GNU Autoconf 2.72.  Invocation command line was

  $ $0$ac_configure_args_raw

_ACEOF
exec 5>>config.log
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##

hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`

/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`

/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`

_ASUNAME

as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    printf "%s\n" "PATH: $as_dir"
  done
IFS=$as_save_IFS

} >&5

cat >&5 <<_ACEOF


## ----------- ##
## Core tests. ##
## ----------- ##

_ACEOF


# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_must_keep_next=false
for ac_pass in 1 2
do
  for ac_arg
  do
    case $ac_arg in
    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
    | -silent | --silent | --silen | --sile | --sil)
      continue ;;
    *\'*)
      ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    case $ac_pass in
    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
    2)
      as_fn_append ac_configure_args1 " '$ac_arg'"
      if test $ac_must_keep_next = true; then
	ac_must_keep_next=false # Got value, back to normal.
      else
	case $ac_arg in
	  *=* | --config-cache | -C | -disable-* | --disable-* \
	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
	  | -with-* | --with-* | -without-* | --without-* | --x)
	    case "$ac_configure_args0 " in
	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
	    esac
	    ;;
	  -* ) ac_must_keep_next=true ;;
	esac
      fi
      as_fn_append ac_configure_args " '$ac_arg'"
      ;;
    esac
  done
done
{ ac_configure_args0=; unset ac_configure_args0;}
{ ac_configure_args1=; unset ac_configure_args1;}

# When interrupted or exit'd, cleanup temporary files, and complete
# config.log.  We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
  # Sanitize IFS.
  IFS=" ""	$as_nl"
  # Save into config.log some information that might help in debugging.
  {
    echo

    printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
    echo
    # The following way of writing the cache mishandles newlines in values,
(
  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done
  (set) 2>&1 |
    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      sed -n \
	"s/'\''/'\''\\\\'\'''\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
      ;; #(
    *)
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
)
    echo

    printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
    echo
    for ac_var in $ac_subst_vars
    do
      eval ac_val=\$$ac_var
      case $ac_val in
      *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
      esac
      printf "%s\n" "$ac_var='\''$ac_val'\''"
    done | sort
    echo

    if test -n "$ac_subst_files"; then
      printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
      echo
      for ac_var in $ac_subst_files
      do
	eval ac_val=\$$ac_var
	case $ac_val in
	*\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
	esac
	printf "%s\n" "$ac_var='\''$ac_val'\''"
      done | sort
      echo
    fi

    if test -s confdefs.h; then
      printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
      echo
      cat confdefs.h
      echo
    fi
    test "$ac_signal" != 0 &&
      printf "%s\n" "$as_me: caught signal $ac_signal"
    printf "%s\n" "$as_me: exit $exit_status"
  } >&5
  rm -f core *.core core.conftest.* &&
    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
    exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
done
ac_signal=0

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h

printf "%s\n" "/* confdefs.h */" > confdefs.h

# Predefined preprocessor variables.

printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h

printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h

printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h

printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h

printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h

printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h


# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
if test -n "$CONFIG_SITE"; then
  ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
  ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
  ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi

for ac_site_file in $ac_site_files
do
  case $ac_site_file in #(
  */*) :
     ;; #(
  *) :
    ac_site_file=./$ac_site_file ;;
esac
  if test -f "$ac_site_file" && test -r "$ac_site_file"; then
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
    sed 's/^/| /' "$ac_site_file" >&5
    . "$ac_site_file" \
      || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See 'config.log' for more details" "$LINENO" 5; }
  fi
done

if test -r "$cache_file"; then
  # Some versions of bash will fail to source /dev/null (special files
  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
    case $cache_file in
      [\\/]* | ?:[\\/]* ) . "$cache_file";;
      *)                      . "./$cache_file";;
    esac
  fi
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
  >$cache_file
fi

# Test code for whether the C compiler supports C89 (global declarations)
ac_c_conftest_c89_globals='
/* Does the compiler advertise C89 conformance?
   Do not test the value of __STDC__, because some compilers set it to 0
   while being otherwise adequately conformant. */
#if !defined __STDC__
# error "Compiler does not advertise C89 conformance"
#endif

#include <stddef.h>
#include <stdarg.h>
struct stat;
/* Most of the following tests are stolen from RCS 5.7 src/conf.sh.  */
struct buf { int x; };
struct buf * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (char **p, int i)
{
  return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
  char *s;
  va_list v;
  va_start (v,p);
  s = g (p, va_arg (v,int));
  va_end (v);
  return s;
}

/* C89 style stringification. */
#define noexpand_stringify(a) #a
const char *stringified = noexpand_stringify(arbitrary+token=sequence);

/* C89 style token pasting.  Exercises some of the corner cases that
   e.g. old MSVC gets wrong, but not very hard. */
#define noexpand_concat(a,b) a##b
#define expand_concat(a,b) noexpand_concat(a,b)
extern int vA;
extern int vbee;
#define aye A
#define bee B
int *pvA = &expand_concat(v,aye);
int *pvbee = &noexpand_concat(v,bee);

/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
   function prototypes and stuff, but not \xHH hex character constants.
   These do not provoke an error unfortunately, instead are silently treated
   as an "x".  The following induces an error, until -std is added to get
   proper ANSI mode.  Curiously \x00 != x always comes out true, for an
   array size at least.  It is necessary to write \x00 == 0 to get something
   that is true only with -std.  */
int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];

/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
   inside strings and character constants.  */
#define FOO(x) '\''x'\''
int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];

int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
               int, int);'

# Test code for whether the C compiler supports C89 (body of main).
ac_c_conftest_c89_main='
ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
'

# Test code for whether the C compiler supports C99 (global declarations)
ac_c_conftest_c99_globals='
/* Does the compiler advertise C99 conformance? */
#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
# error "Compiler does not advertise C99 conformance"
#endif

// See if C++-style comments work.

#include <stdbool.h>
extern int puts (const char *);
extern int printf (const char *, ...);
extern int dprintf (int, const char *, ...);
extern void *malloc (size_t);
extern void free (void *);

// Check varargs macros.  These examples are taken from C99 6.10.3.5.
// dprintf is used instead of fprintf to avoid needing to declare
// FILE and stderr.
#define debug(...) dprintf (2, __VA_ARGS__)
#define showlist(...) puts (#__VA_ARGS__)
#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
static void
test_varargs_macros (void)
{
  int x = 1234;
  int y = 5678;
  debug ("Flag");
  debug ("X = %d\n", x);
  showlist (The first, second, and third items.);
  report (x>y, "x is %d but y is %d", x, y);
}

// Check long long types.
#define BIG64 18446744073709551615ull
#define BIG32 4294967295ul
#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
#if !BIG_OK
  #error "your preprocessor is broken"
#endif
#if BIG_OK
#else
  #error "your preprocessor is broken"
#endif
static long long int bignum = -9223372036854775807LL;
static unsigned long long int ubignum = BIG64;

struct incomplete_array
{
  int datasize;
  double data[];
};

struct named_init {
  int number;
  const wchar_t *name;
  double average;
};

typedef const char *ccp;

static inline int
test_restrict (ccp restrict text)
{
  // Iterate through items via the restricted pointer.
  // Also check for declarations in for loops.
  for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
    continue;
  return 0;
}

// Check varargs and va_copy.
static bool
test_varargs (const char *format, ...)
{
  va_list args;
  va_start (args, format);
  va_list args_copy;
  va_copy (args_copy, args);

  const char *str = "";
  int number = 0;
  float fnumber = 0;

  while (*format)
    {
      switch (*format++)
	{
	case '\''s'\'': // string
	  str = va_arg (args_copy, const char *);
	  break;
	case '\''d'\'': // int
	  number = va_arg (args_copy, int);
	  break;
	case '\''f'\'': // float
	  fnumber = va_arg (args_copy, double);
	  break;
	default:
	  break;
	}
    }
  va_end (args_copy);
  va_end (args);

  return *str && number && fnumber;
}
'

# Test code for whether the C compiler supports C99 (body of main).
ac_c_conftest_c99_main='
  // Check bool.
  _Bool success = false;
  success |= (argc != 0);

  // Check restrict.
  if (test_restrict ("String literal") == 0)
    success = true;
  char *restrict newvar = "Another string";

  // Check varargs.
  success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
  test_varargs_macros ();

  // Check flexible array members.
  struct incomplete_array *ia =
    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
  ia->datasize = 10;
  for (int i = 0; i < ia->datasize; ++i)
    ia->data[i] = i * 1.234;
  // Work around memory leak warnings.
  free (ia);

  // Check named initializers.
  struct named_init ni = {
    .number = 34,
    .name = L"Test wide string",
    .average = 543.34343,
  };

  ni.number = 58;

  int dynamic_array[ni.number];
  dynamic_array[0] = argv[0][0];
  dynamic_array[ni.number - 1] = 543;

  // work around unused variable warnings
  ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
	 || dynamic_array[ni.number - 1] != 543);
'

# Test code for whether the C compiler supports C11 (global declarations)
ac_c_conftest_c11_globals='
/* Does the compiler advertise C11 conformance? */
#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
# error "Compiler does not advertise C11 conformance"
#endif

// Check _Alignas.
char _Alignas (double) aligned_as_double;
char _Alignas (0) no_special_alignment;
extern char aligned_as_int;
char _Alignas (0) _Alignas (int) aligned_as_int;

// Check _Alignof.
enum
{
  int_alignment = _Alignof (int),
  int_array_alignment = _Alignof (int[100]),
  char_alignment = _Alignof (char)
};
_Static_assert (0 < -_Alignof (int), "_Alignof is signed");

// Check _Noreturn.
int _Noreturn does_not_return (void) { for (;;) continue; }

// Check _Static_assert.
struct test_static_assert
{
  int x;
  _Static_assert (sizeof (int) <= sizeof (long int),
                  "_Static_assert does not work in struct");
  long int y;
};

// Check UTF-8 literals.
#define u8 syntax error!
char const utf8_literal[] = u8"happens to be ASCII" "another string";

// Check duplicate typedefs.
typedef long *long_ptr;
typedef long int *long_ptr;
typedef long_ptr long_ptr;

// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
struct anonymous
{
  union {
    struct { int i; int j; };
    struct { int k; long int l; } w;
  };
  int m;
} v1;
'

# Test code for whether the C compiler supports C11 (body of main).
ac_c_conftest_c11_main='
  _Static_assert ((offsetof (struct anonymous, i)
		   == offsetof (struct anonymous, w.k)),
		  "Anonymous union alignment botch");
  v1.i = 2;
  v1.w.k = 5;
  ok |= v1.i != 5;
'

# Test code for whether the C compiler supports C11 (complete).
ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
${ac_c_conftest_c99_globals}
${ac_c_conftest_c11_globals}

int
main (int argc, char **argv)
{
  int ok = 0;
  ${ac_c_conftest_c89_main}
  ${ac_c_conftest_c99_main}
  ${ac_c_conftest_c11_main}
  return ok;
}
"

# Test code for whether the C compiler supports C99 (complete).
ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
${ac_c_conftest_c99_globals}

int
main (int argc, char **argv)
{
  int ok = 0;
  ${ac_c_conftest_c89_main}
  ${ac_c_conftest_c99_main}
  return ok;
}
"

# Test code for whether the C compiler supports C89 (complete).
ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}

int
main (int argc, char **argv)
{
  int ok = 0;
  ${ac_c_conftest_c89_main}
  return ok;
}
"

as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H"
as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H"
as_fn_append ac_func_c_list " acospi HAVE_ACOSPI"
as_fn_append ac_func_c_list " asinpi HAVE_ASINPI"
as_fn_append ac_func_c_list " atanpi HAVE_ATANPI"
as_fn_append ac_func_c_list " atan2pi HAVE_ATAN2PI"
as_fn_append ac_func_c_list " cospi HAVE_COSPI"
as_fn_append ac_func_c_list " sinpi HAVE_SINPI"
as_fn_append ac_func_c_list " tanpi HAVE_TANPI"

# Auxiliary files required by this configure script.
ac_aux_files="install-sh config.guess config.sub"

# Locations in which to look for auxiliary files.
ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."

# Search for a directory containing all of the required auxiliary files,
# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
# If we don't find one directory that contains all the files we need,
# we report the set of missing files from the *first* directory in
# $ac_aux_dir_candidates and give up.
ac_missing_aux_files=""
ac_first_candidate=:
printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in $ac_aux_dir_candidates
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
  as_found=:

  printf "%s\n" "$as_me:${as_lineno-$LINENO}:  trying $as_dir" >&5
  ac_aux_dir_found=yes
  ac_install_sh=
  for ac_aux in $ac_aux_files
  do
    # As a special case, if "install-sh" is required, that requirement
    # can be satisfied by any of "install-sh", "install.sh", or "shtool",
    # and $ac_install_sh is set appropriately for whichever one is found.
    if test x"$ac_aux" = x"install-sh"
    then
      if test -f "${as_dir}install-sh"; then
        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}install-sh found" >&5
        ac_install_sh="${as_dir}install-sh -c"
      elif test -f "${as_dir}install.sh"; then
        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}install.sh found" >&5
        ac_install_sh="${as_dir}install.sh -c"
      elif test -f "${as_dir}shtool"; then
        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}shtool found" >&5
        ac_install_sh="${as_dir}shtool install -c"
      else
        ac_aux_dir_found=no
        if $ac_first_candidate; then
          ac_missing_aux_files="${ac_missing_aux_files} install-sh"
        else
          break
        fi
      fi
    else
      if test -f "${as_dir}${ac_aux}"; then
        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}${ac_aux} found" >&5
      else
        ac_aux_dir_found=no
        if $ac_first_candidate; then
          ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
        else
          break
        fi
      fi
    fi
  done
  if test "$ac_aux_dir_found" = yes; then
    ac_aux_dir="$as_dir"
    break
  fi
  ac_first_candidate=false

  as_found=false
done
IFS=$as_save_IFS
if $as_found
then :

else case e in #(
  e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;;
esac
fi


# These three variables are undocumented and unsupported,
# and are intended to be withdrawn in a future Autoconf release.
# They can cause serious problems if a builder's source tree is in a directory
# whose full name contains unusual characters.
if test -f "${ac_aux_dir}config.guess"; then
  ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
fi
if test -f "${ac_aux_dir}config.sub"; then
  ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
fi
if test -f "$ac_aux_dir/configure"; then
  ac_configure="$SHELL ${ac_aux_dir}configure"
fi

# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in $ac_precious_vars; do
  eval ac_old_set=\$ac_cv_env_${ac_var}_set
  eval ac_new_set=\$ac_env_${ac_var}_set
  eval ac_old_val=\$ac_cv_env_${ac_var}_value
  eval ac_new_val=\$ac_env_${ac_var}_value
  case $ac_old_set,$ac_new_set in
    set,)
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5
printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,set)
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5
printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,);;
    *)
      if test "x$ac_old_val" != "x$ac_new_val"; then
	# differences in whitespace do not lead to failure.
	ac_old_val_w=`echo x $ac_old_val`
	ac_new_val_w=`echo x $ac_new_val`
	if test "$ac_old_val_w" != "$ac_new_val_w"; then
	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5
printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;}
	  ac_cache_corrupted=:
	else
	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5
printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;}
	  eval $ac_var=\$ac_old_val
	fi
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}:   former value:  '$ac_old_val'" >&5
printf "%s\n" "$as_me:   former value:  '$ac_old_val'" >&2;}
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}:   current value: '$ac_new_val'" >&5
printf "%s\n" "$as_me:   current value: '$ac_new_val'" >&2;}
      fi;;
  esac
  # Pass precious variables to config.status.
  if test "$ac_new_set" = set; then
    case $ac_new_val in
    *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
    *) ac_arg=$ac_var=$ac_new_val ;;
    esac
    case " $ac_configure_args " in
      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
    esac
  fi
done
if $ac_cache_corrupted; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
  as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file'
	    and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
## -------------------- ##

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu












if test "$srcdir" != . -a "$srcdir" != "$(pwd)"; then
    # If we're building out-of-tree, we need to make sure the following
    # resources get picked up before their $srcdir counterparts.
    #   Objects/ -> slots_generated.c
    #   Include/ -> Python.h
    # (A side effect of this is that these resources will automatically be
    #  regenerated when building out-of-tree, regardless of whether or not
    #  the $srcdir counterpart is up-to-date.  This is an acceptable trade
    #  off.)
    BASECPPFLAGS="-IObjects -IInclude -IPython"
else
    BASECPPFLAGS=""
fi





if test -e $srcdir/.git
then
# Extract the first word of "git", so it can be a program name with args.
set dummy git; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_HAS_GIT+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$HAS_GIT"; then
  ac_cv_prog_HAS_GIT="$HAS_GIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAS_GIT="found"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_HAS_GIT" && ac_cv_prog_HAS_GIT="not-found"
fi ;;
esac
fi
HAS_GIT=$ac_cv_prog_HAS_GIT
if test -n "$HAS_GIT"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAS_GIT" >&5
printf "%s\n" "$HAS_GIT" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


else
HAS_GIT=no-repository
fi
if test $HAS_GIT = found
then
    GITVERSION="git --git-dir \$(srcdir)/.git rev-parse --short HEAD"
    GITTAG="git --git-dir \$(srcdir)/.git describe --all --always --dirty"
    GITBRANCH="git --git-dir \$(srcdir)/.git name-rev --name-only HEAD"
else
    GITVERSION=""
    GITTAG=""
    GITBRANCH=""
fi


ac_config_headers="$ac_config_headers pyconfig.h"





  # Make sure we can run config.sub.
$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
  as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
printf %s "checking build system type... " >&6; }
if test ${ac_cv_build+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
  ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
  as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_build
shift
build_cpu=$1
build_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
printf %s "checking host system type... " >&6; }
if test ${ac_cv_host+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "x$host_alias" = x; then
  ac_cv_host=$ac_cv_build
else
  ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
    as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_host
shift
host_cpu=$1
host_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
host_os=$*
IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac





if test "x$cross_compiling" = xmaybe
then :
  as_fn_error $? "Cross compiling required --host=HOST-TUPLE and --build=ARCH" "$LINENO" 5

fi

# pybuilddir.txt will be created by --generate-posix-vars in the Makefile
rm -f pybuilddir.txt


# Check whether --with-build-python was given.
if test ${with_build_python+y}
then :
  withval=$with_build_python;
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-build-python" >&5
printf %s "checking for --with-build-python... " >&6; }

    if test "x$with_build_python" = xyes
then :
  with_build_python=python$PACKAGE_VERSION
fi
    if test "x$with_build_python" = xno
then :
  as_fn_error $? "invalid --with-build-python option: expected path or \"yes\", not \"no\"" "$LINENO" 5
fi

    if ! $(command -v "$with_build_python" >/dev/null 2>&1); then
      as_fn_error $? "invalid or missing build python binary \"$with_build_python\"" "$LINENO" 5
    fi
    build_python_ver=$($with_build_python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
    if test "$build_python_ver" != "$PACKAGE_VERSION"; then
      as_fn_error $? "\"$with_build_python\" has incompatible version $build_python_ver (expected: $PACKAGE_VERSION)" "$LINENO" 5
    fi
        ac_cv_prog_PYTHON_FOR_REGEN=$with_build_python
    PYTHON_FOR_FREEZE="$with_build_python"
    PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(srcdir)/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH) _PYTHON_SYSCONFIGDATA_PATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`) '$with_build_python
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_build_python" >&5
printf "%s\n" "$with_build_python" >&6; }

else case e in #(
  e)
    if test "x$cross_compiling" = xyes
then :
  as_fn_error $? "Cross compiling requires --with-build-python" "$LINENO" 5

fi
    PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E'
    PYTHON_FOR_FREEZE="./_bootstrap_python"

 ;;
esac
fi



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Python interpreter freezing" >&5
printf %s "checking for Python interpreter freezing... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON_FOR_FREEZE" >&5
printf "%s\n" "$PYTHON_FOR_FREEZE" >&6; }


if test "x$cross_compiling" = xyes
then :

        FREEZE_MODULE_BOOTSTRAP='$(PYTHON_FOR_FREEZE) $(srcdir)/Programs/_freeze_module.py'
    FREEZE_MODULE_BOOTSTRAP_DEPS='$(srcdir)/Programs/_freeze_module.py'
    FREEZE_MODULE='$(FREEZE_MODULE_BOOTSTRAP)'
    FREEZE_MODULE_DEPS='$(FREEZE_MODULE_BOOTSTRAP_DEPS)'
    PYTHON_FOR_BUILD_DEPS=''

else case e in #(
  e)
        FREEZE_MODULE_BOOTSTRAP='./Programs/_freeze_module'
    FREEZE_MODULE_BOOTSTRAP_DEPS="Programs/_freeze_module"
    FREEZE_MODULE='$(PYTHON_FOR_FREEZE) $(srcdir)/Programs/_freeze_module.py'
    FREEZE_MODULE_DEPS="_bootstrap_python \$(srcdir)/Programs/_freeze_module.py"
    PYTHON_FOR_BUILD_DEPS='$(BUILDPYTHON)'

 ;;
esac
fi






for ac_prog in python$PACKAGE_VERSION python3.16 python3.15 python3.14 python3.13 python3.12 python3.11 python3.10 python3 python
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_PYTHON_FOR_REGEN+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$PYTHON_FOR_REGEN"; then
  ac_cv_prog_PYTHON_FOR_REGEN="$PYTHON_FOR_REGEN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_PYTHON_FOR_REGEN="$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
PYTHON_FOR_REGEN=$ac_cv_prog_PYTHON_FOR_REGEN
if test -n "$PYTHON_FOR_REGEN"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON_FOR_REGEN" >&5
printf "%s\n" "$PYTHON_FOR_REGEN" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  test -n "$PYTHON_FOR_REGEN" && break
done
test -n "$PYTHON_FOR_REGEN" || PYTHON_FOR_REGEN="python3"



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking Python for regen version" >&5
printf %s "checking Python for regen version... " >&6; }
if command -v "$PYTHON_FOR_REGEN" >/dev/null 2>&1; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $($PYTHON_FOR_REGEN -V 2>/dev/null)" >&5
printf "%s\n" "$($PYTHON_FOR_REGEN -V 2>/dev/null)" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: missing" >&5
printf "%s\n" "missing" >&6; }
fi


if test "$prefix" != "/"; then
    prefix=`echo "$prefix" | sed -e 's/\/$//g'`
fi




# We don't use PACKAGE_ variables, and they cause conflicts
# with other autoconf-based packages that include Python.h
grep -v 'define PACKAGE_' <confdefs.h >confdefs.h.new
rm confdefs.h
mv confdefs.h.new confdefs.h


VERSION=3.16

# Version number of Python's own shared library file.

SOVERSION=1.0

# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables
# certain features on NetBSD, so we need _NETBSD_SOURCE to re-enable
# them.

printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h


# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables
# certain features on FreeBSD, so we need __BSD_VISIBLE to re-enable
# them.

printf "%s\n" "#define __BSD_VISIBLE 1" >>confdefs.h


# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables
# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable
# them.

printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h



define_xopen_source=yes

# Arguments passed to configure.

CONFIG_ARGS="$ac_configure_args"


# Check whether --with-pkg-config was given.
if test ${with_pkg_config+y}
then :
  withval=$with_pkg_config;
else case e in #(
  e) with_pkg_config=check
 ;;
esac
fi

case $with_pkg_config in #(
  yes|check) :

    if test -z "$PKG_CONFIG"; then
            { PKG_CONFIG=; unset PKG_CONFIG;}
      { ac_cv_path_ac_pt_PKG_CONFIG=; unset ac_cv_path_ac_pt_PKG_CONFIG;}
      { ac_cv_prog_ac_ct_PKG_CONFIG=; unset ac_cv_prog_ac_ct_PKG_CONFIG;}
    fi







if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
	if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_PKG_CONFIG+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $PKG_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
PKG_CONFIG=$ac_cv_path_PKG_CONFIG
if test -n "$PKG_CONFIG"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
printf "%s\n" "$PKG_CONFIG" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_PKG_CONFIG"; then
  ac_pt_PKG_CONFIG=$PKG_CONFIG
  # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_PKG_CONFIG+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_PKG_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
if test -n "$ac_pt_PKG_CONFIG"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_PKG_CONFIG" = x; then
    PKG_CONFIG=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    PKG_CONFIG=$ac_pt_PKG_CONFIG
  fi
else
  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi

fi
if test -n "$PKG_CONFIG"; then
	_pkg_min_version=0.9.0
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; }
	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
		{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
	else
		{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
		PKG_CONFIG=""
	fi
fi
   ;; #(
  no) :

    PKG_CONFIG=''
        ac_cv_path_ac_pt_PKG_CONFIG=''
    ac_cv_prog_ac_ct_PKG_CONFIG=''
   ;; #(
  *) :
    as_fn_error $? "invalid argument --with-pkg-config=$with_pkg_config" "$LINENO" 5
 ;;
esac
if test "$with_pkg_config" = yes -a -z "$PKG_CONFIG"; then
  as_fn_error $? "pkg-config is required" "$LINENO" 5]
fi


# Check whether --with-missing-stdlib-config was given.
if test ${with_missing_stdlib_config+y}
then :
  withval=$with_missing_stdlib_config; MISSING_STDLIB_CONFIG="$withval"
else case e in #(
  e) MISSING_STDLIB_CONFIG=""
 ;;
esac
fi



# Set name for machine-dependent library files

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking MACHDEP" >&5
printf %s "checking MACHDEP... " >&6; }
if test -z "$MACHDEP"
then
    # avoid using uname for cross builds
    if test "$cross_compiling" = yes; then
       # ac_sys_system and ac_sys_release are used for setting
       # a lot of different things including 'define_xopen_source'
       # in the case statement below.
	case "$host" in
	*-*-linux-android*)
		ac_sys_system=Linux-android
		;;
	*-*-linux*)
		ac_sys_system=Linux
		;;
	*-*-cygwin*)
		ac_sys_system=CYGWIN
		;;
	*-apple-ios*)
		ac_sys_system=iOS
		;;
	*-*-darwin*)
		ac_sys_system=Darwin
		;;
	*-gnu)
		ac_sys_system=GNU
		;;
	*-*-vxworks*)
	    ac_sys_system=VxWorks
	    ;;
	*-*-emscripten)
	    ac_sys_system=Emscripten
	    ;;
	*-*-wasi*)
	    ac_sys_system=WASI
	    ;;
	*)
		# for now, limit cross builds to known configurations
		MACHDEP="unknown"
		as_fn_error $? "cross build not supported for $host" "$LINENO" 5
	esac
	ac_sys_release=
    else
	ac_sys_system=`uname -s`
	if test "$ac_sys_system" = "AIX" \
	-o "$ac_sys_system" = "UnixWare" -o "$ac_sys_system" = "OpenUNIX"; then
		ac_sys_release=`uname -v`
	else
		ac_sys_release=`uname -r`
	fi
    fi
    ac_md_system=`echo $ac_sys_system |
			tr -d '/ ' | tr '[A-Z]' '[a-z]'`
    ac_md_release=`echo $ac_sys_release |
			tr -d '/ ' | sed 's/^[A-Z]\.//' | sed 's/\..*//'`
    MACHDEP="$ac_md_system$ac_md_release"

    case $MACHDEP in
	aix*) MACHDEP="aix";;
	freebsd*) MACHDEP="freebsd";;
	linux-android*) MACHDEP="android";;
	linux*) MACHDEP="linux";;
	cygwin*) MACHDEP="cygwin";;
	darwin*) MACHDEP="darwin";;
	'')	MACHDEP="unknown";;
    esac

    if test "$ac_sys_system" = "SunOS"; then
	# For Solaris, there isn't an OS version specific macro defined
	# in most compilers, so we define one here.
	SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\(0-9\)$!.0\1!g' | tr -d '.'`

printf "%s\n" "#define Py_SUNOS_VERSION $SUNOS_VERSION" >>confdefs.h

    fi
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"$MACHDEP\"" >&5
printf "%s\n" "\"$MACHDEP\"" >&6; }


if test -z "$host_prefix"; then
  case $ac_sys_system in #(
  Emscripten) :
    host_prefix=/ ;; #(
  *) :
    host_prefix='${prefix}'
   ;;
esac
fi


if test -z "$host_exec_prefix"; then
  case $ac_sys_system in #(
  Emscripten) :
    host_exec_prefix=$host_prefix ;; #(
  *) :
    host_exec_prefix='${exec_prefix}'
   ;;
esac
fi


# On cross-compile builds, configure will look for a host-specific compiler by
# prepending the user-provided host triple to the required binary name.
#
# On iOS, this results in binaries like "arm64-apple-ios13.0-simulator-gcc",
# which isn't a binary that exists, and isn't very convenient, as it contains the
# iOS version. As the default cross-compiler name won't exist, configure falls
# back to gcc, which *definitely* won't work. We're providing wrapper scripts for
# these tools; the binary names of these scripts are better defaults than "gcc".
# This only requires that the user put the platform scripts folder (e.g.,
# "iOS/Resources/bin") in their path, rather than defining platform-specific
# names/paths for AR, CC, CPP, and CXX explicitly; and if the user forgets to
# either put the platform scripts folder in the path, or specify CC etc,
# configure will fail.
if test -z "$AR"; then
	case "$host" in
		aarch64-apple-ios*-simulator) AR=arm64-apple-ios-simulator-ar ;;
		aarch64-apple-ios*)           AR=arm64-apple-ios-ar ;;
		x86_64-apple-ios*-simulator)  AR=x86_64-apple-ios-simulator-ar ;;
		*)
	esac
fi
if test -z "$CC"; then
	case "$host" in
		aarch64-apple-ios*-simulator) CC=arm64-apple-ios-simulator-clang ;;
		aarch64-apple-ios*)           CC=arm64-apple-ios-clang ;;
		x86_64-apple-ios*-simulator)  CC=x86_64-apple-ios-simulator-clang ;;
		*)
	esac
fi
if test -z "$CPP"; then
	case "$host" in
		aarch64-apple-ios*-simulator) CPP=arm64-apple-ios-simulator-cpp ;;
		aarch64-apple-ios*)           CPP=arm64-apple-ios-cpp ;;
		x86_64-apple-ios*-simulator)  CPP=x86_64-apple-ios-simulator-cpp ;;
		*)
	esac
fi
if test -z "$CXX"; then
	case "$host" in
		aarch64-apple-ios*-simulator) CXX=arm64-apple-ios-simulator-clang++ ;;
		aarch64-apple-ios*)           CXX=arm64-apple-ios-clang++ ;;
		x86_64-apple-ios*-simulator)  CXX=x86_64-apple-ios-simulator-clang++ ;;
		*)
	esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-universalsdk" >&5
printf %s "checking for --enable-universalsdk... " >&6; }
# Check whether --enable-universalsdk was given.
if test ${enable_universalsdk+y}
then :
  enableval=$enable_universalsdk;
	case $enableval in
	yes)
		# Locate the best usable SDK, see Mac/README for more
		# information
		enableval="`/usr/bin/xcodebuild -version -sdk macosx Path 2>/dev/null`"
		if ! ( echo $enableval | grep -E '\.sdk' 1>/dev/null )
		then
			enableval=/Developer/SDKs/MacOSX10.4u.sdk
			if test ! -d "${enableval}"
			then
				enableval=/
			fi
		fi
		;;
	esac
	case $enableval in
	no)
		UNIVERSALSDK=
		enable_universalsdk=
		;;
	*)
		UNIVERSALSDK=$enableval
		if test ! -d "${UNIVERSALSDK}"
		then
			as_fn_error $? "--enable-universalsdk specifies non-existing SDK: ${UNIVERSALSDK}" "$LINENO" 5
		fi
		;;
	esac


else case e in #(
  e)
   	UNIVERSALSDK=
	enable_universalsdk=
 ;;
esac
fi

if test -n "${UNIVERSALSDK}"
then
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${UNIVERSALSDK}" >&5
printf "%s\n" "${UNIVERSALSDK}" >&6; }
else
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi



ARCH_RUN_32BIT=""

# For backward compatibility reasons we prefer to select '32-bit' if available,
# otherwise use 'intel'
UNIVERSAL_ARCHS="32-bit"
if test "`uname -s`" = "Darwin"
then
	if test -n "${UNIVERSALSDK}"
	then
		if test -z "`/usr/bin/file -L "${UNIVERSALSDK}/usr/lib/libSystem.dylib" | grep ppc`"
		then
			UNIVERSAL_ARCHS="intel"
		fi
	fi
fi



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-universal-archs" >&5
printf %s "checking for --with-universal-archs... " >&6; }

# Check whether --with-universal-archs was given.
if test ${with_universal_archs+y}
then :
  withval=$with_universal_archs;
	UNIVERSAL_ARCHS="$withval"

fi

if test -n "${UNIVERSALSDK}"
then
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${UNIVERSAL_ARCHS}" >&5
printf "%s\n" "${UNIVERSAL_ARCHS}" >&6; }
else
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


# Check whether --with-framework-name was given.
if test ${with_framework_name+y}
then :
  withval=$with_framework_name;
    PYTHONFRAMEWORK=${withval}
    PYTHONFRAMEWORKDIR=${withval}.framework
    PYTHONFRAMEWORKIDENTIFIER=org.python.`echo $withval | tr 'A-Z' 'a-z'`

else case e in #(
  e)
    PYTHONFRAMEWORK=Python
    PYTHONFRAMEWORKDIR=Python.framework
    PYTHONFRAMEWORKIDENTIFIER=org.python.python
 ;;
esac
fi

# Check whether --enable-framework was given.
if test ${enable_framework+y}
then :
  enableval=$enable_framework;
	case $enableval in
	yes)
		case $ac_sys_system in
			Darwin) enableval=/Library/Frameworks ;;
			iOS)    enableval=Platforms/Apple/iOS/Frameworks/\$\(MULTIARCH\) ;;
			*) as_fn_error $? "Unknown platform for framework build" "$LINENO" 5
		esac
	esac

	case $enableval in
	no)
		PYTHONFRAMEWORK=
		PYTHONFRAMEWORKDIR=no-framework
		PYTHONFRAMEWORKPREFIX=
		PYTHONFRAMEWORKINSTALLDIR=
		PYTHONFRAMEWORKINSTALLNAMEPREFIX=
		RESSRCDIR=
		FRAMEWORKINSTALLFIRST=
		FRAMEWORKINSTALLLAST=
		FRAMEWORKALTINSTALLFIRST=
		FRAMEWORKALTINSTALLLAST=
		FRAMEWORKPYTHONW=
		INSTALLTARGETS="commoninstall bininstall maninstall"

		if test "x${prefix}" = "xNONE"; then
			FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
		else
			FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
		fi
		enable_framework=
		;;
	*)
		PYTHONFRAMEWORKPREFIX="${enableval}"
		PYTHONFRAMEWORKINSTALLDIR=$PYTHONFRAMEWORKPREFIX/$PYTHONFRAMEWORKDIR

		case $ac_sys_system in #(
			Darwin) :
				FRAMEWORKINSTALLFIRST="frameworkinstallversionedstructure"
				FRAMEWORKALTINSTALLFIRST="frameworkinstallversionedstructure "
				FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
				FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
				FRAMEWORKPYTHONW="frameworkpythonw"
				FRAMEWORKINSTALLAPPSPREFIX="/Applications"
				INSTALLTARGETS="commoninstall bininstall maninstall"

				if test "x${prefix}" = "xNONE" ; then
					FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"

				else
					FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
				fi

				case "${enableval}" in
				/System*)
					FRAMEWORKINSTALLAPPSPREFIX="/Applications"
					if test "${prefix}" = "NONE" ; then
						# See below
						FRAMEWORKUNIXTOOLSPREFIX="/usr"
					fi
					;;

				/Library*)
					FRAMEWORKINSTALLAPPSPREFIX="/Applications"
					;;

				*/Library/Frameworks)
					MDIR="`dirname "${enableval}"`"
					MDIR="`dirname "${MDIR}"`"
					FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"

					if test "${prefix}" = "NONE"; then
						# User hasn't specified the
						# --prefix option, but wants to install
						# the framework in a non-default location,
						# ensure that the compatibility links get
						# installed relative to that prefix as well
						# instead of in /usr/local.
						FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
					fi
					;;

				*)
					FRAMEWORKINSTALLAPPSPREFIX="/Applications"
					;;
				esac

				prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
				PYTHONFRAMEWORKINSTALLNAMEPREFIX=${prefix}
				RESSRCDIR=Mac/Resources/framework

				# Add files for Mac specific code to the list of output
				# files:
				ac_config_files="$ac_config_files Mac/Makefile"

				ac_config_files="$ac_config_files Mac/PythonLauncher/Makefile"

				ac_config_files="$ac_config_files Mac/Resources/framework/Info.plist"

				ac_config_files="$ac_config_files Mac/Resources/app/Info.plist"

				;;
			iOS) :
				FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
				FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
				FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
				FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
				FRAMEWORKPYTHONW=
				INSTALLTARGETS="libinstall inclinstall sharedinstall"

				prefix=$PYTHONFRAMEWORKPREFIX
				PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
				RESSRCDIR=Platforms/Apple/iOS/Resources

				ac_config_files="$ac_config_files Platforms/Apple/iOS/Resources/Info.plist"

				;;
			*)
				as_fn_error $? "Unknown platform for framework build" "$LINENO" 5
				;;
			esac
		esac

else case e in #(
  e)
	PYTHONFRAMEWORK=
	PYTHONFRAMEWORKDIR=no-framework
	PYTHONFRAMEWORKPREFIX=
	PYTHONFRAMEWORKINSTALLDIR=
	PYTHONFRAMEWORKINSTALLNAMEPREFIX=
	RESSRCDIR=
	FRAMEWORKINSTALLFIRST=
	FRAMEWORKINSTALLLAST=
	FRAMEWORKALTINSTALLFIRST=
	FRAMEWORKALTINSTALLLAST=
	FRAMEWORKPYTHONW=
	INSTALLTARGETS="commoninstall bininstall maninstall"
	if test "x${prefix}" = "xNONE" ; then
		FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
	else
		FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
	fi
	enable_framework=
 ;;
esac
fi


















printf "%s\n" "#define _PYTHONFRAMEWORK \"${PYTHONFRAMEWORK}\"" >>confdefs.h


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-app-store-compliance" >&5
printf %s "checking for --with-app-store-compliance... " >&6; }

# Check whether --with-app_store_compliance was given.
if test ${with_app_store_compliance+y}
then :
  withval=$with_app_store_compliance;
    case "$withval" in
    yes)
      case $ac_sys_system in
        Darwin|iOS)
          # iOS is able to share the macOS patch
          APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
          ;;
        *) as_fn_error $? "no default app store compliance patch available for $ac_sys_system" "$LINENO" 5 ;;
      esac
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: applying default app store compliance patch" >&5
printf "%s\n" "applying default app store compliance patch" >&6; }
      ;;
    *)
      APP_STORE_COMPLIANCE_PATCH="${withval}"
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: applying custom app store compliance patch" >&5
printf "%s\n" "applying custom app store compliance patch" >&6; }
      ;;
    esac

else case e in #(
  e)
    case $ac_sys_system in
      iOS)
        # Always apply the compliance patch on iOS; we can use the macOS patch
        APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: applying default app store compliance patch" >&5
printf "%s\n" "applying default app store compliance patch" >&6; }
        ;;
      *)
        # No default app compliance patching on any other platform
        APP_STORE_COMPLIANCE_PATCH=
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not patching for app store compliance" >&5
printf "%s\n" "not patching for app store compliance" >&6; }
        ;;
    esac
 ;;
esac
fi




if test "$cross_compiling" = yes; then
	case "$host" in
	*-*-linux*)
		case "$host_cpu" in
		arm*)
			_host_ident=arm
			;;
		*)
			_host_ident=$host_cpu
		esac
		;;
	*-gnu)
		_host_ident=$host_cpu
		;;
	*-*-cygwin*)
		_host_ident=
		;;
	*-apple-ios*)
		_host_os=`echo $host | cut -d '-' -f3`
		_host_device=`echo $host | cut -d '-' -f4`
		_host_device=${_host_device:=os}

		# IPHONEOS_DEPLOYMENT_TARGET is the minimum supported iOS version
		{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking iOS deployment target" >&5
printf %s "checking iOS deployment target... " >&6; }
		IPHONEOS_DEPLOYMENT_TARGET=$(echo ${_host_os} | cut -c4-)
		IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET:=13.0}
		{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $IPHONEOS_DEPLOYMENT_TARGET" >&5
printf "%s\n" "$IPHONEOS_DEPLOYMENT_TARGET" >&6; }

		case "$host_cpu" in
			aarch64)
				_host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-arm64-iphone${_host_device}
				;;
			*)
				_host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-$host_cpu-iphone${_host_device}
				;;
		esac
		;;
	*-*-darwin*)
		case "$host_cpu" in
		arm*)
			_host_ident=arm
			;;
		*)
			_host_ident=$host_cpu
		esac
		;;
	*-*-vxworks*)
		_host_ident=$host_cpu
		;;
	*-*-emscripten)
		_host_ident=$(emcc -dumpversion | cut -f1 -d-)-$host_cpu
		;;
	wasm32-*-* | wasm64-*-*)
		_host_ident=$host_cpu
		;;
	*)
		# for now, limit cross builds to known configurations
		MACHDEP="unknown"
		as_fn_error $? "cross build not supported for $host" "$LINENO" 5
	esac
	_PYTHON_HOST_PLATFORM="$MACHDEP${_host_ident:+-$_host_ident}"
fi

# Some systems cannot stand _XOPEN_SOURCE being defined at all; they
# disable features if it is defined, without any means to access these
# features as extensions. For these systems, we skip the definition of
# _XOPEN_SOURCE. Before adding a system to the list to gain access to
# some feature, make sure there is no alternative way to access this
# feature. Also, when using wildcards, make sure you have verified the
# need for not defining _XOPEN_SOURCE on all systems matching the
# wildcard, and that the wildcard does not include future systems
# (which may remove their limitations).
case $ac_sys_system/$ac_sys_release in
  # On OpenBSD, select(2) is not available if _XOPEN_SOURCE is defined,
  # even though select is a POSIX function. Reported by J. Ribbens.
  # Reconfirmed for OpenBSD 3.3 by Zachary Hamm, for 3.4 by Jason Ish.
  # In addition, Stefan Krah confirms that issue #1244610 exists through
  # OpenBSD 4.6, but is fixed in 4.7.
  OpenBSD/2.* | OpenBSD/3.* | OpenBSD/4.[0123456])
    define_xopen_source=no
    # OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is
    # also defined. This can be overridden by defining _BSD_SOURCE
    # As this has a different meaning on Linux, only define it on OpenBSD

printf "%s\n" "#define _BSD_SOURCE 1" >>confdefs.h

    ;;
  OpenBSD/*)
    # OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is
    # also defined. This can be overridden by defining _BSD_SOURCE
    # As this has a different meaning on Linux, only define it on OpenBSD

printf "%s\n" "#define _BSD_SOURCE 1" >>confdefs.h

    ;;
  # Defining _XOPEN_SOURCE on NetBSD version prior to the introduction of
  # _NETBSD_SOURCE disables certain features (eg. setgroups). Reported by
  # Marc Recht
  NetBSD/1.5 | NetBSD/1.5.* | NetBSD/1.6 | NetBSD/1.6.* | NetBSD/1.6[A-S])
    define_xopen_source=no;;
  # On Solaris, _XOPEN_SOURCE=800 hides platform specific features.
  # A lower level is defined below.
  SunOS/*)
    define_xopen_source=no;;
  # On UnixWare 7, u_long is never defined with _XOPEN_SOURCE,
  # but used in /usr/include/netinet/tcp.h. Reported by Tim Rice.
  # Reconfirmed for 7.1.4 by Martin v. Loewis.
  OpenUNIX/8.0.0| UnixWare/7.1.[0-4])
    define_xopen_source=no;;
  # On OpenServer 5, u_short is never defined with _XOPEN_SOURCE,
  # but used in struct sockaddr.sa_family. Reported by Tim Rice.
  SCO_SV/3.2)
    define_xopen_source=no;;
  # On MacOS X 10.2, a bug in ncurses.h means that it craps out if
  # _XOPEN_EXTENDED_SOURCE is defined. Apparently, this is fixed in 10.3, which
  # identifies itself as Darwin/7.*
  # On Mac OS X 10.4, defining _POSIX_C_SOURCE or _XOPEN_SOURCE
  # disables platform specific features beyond repair.
  # On Mac OS X 10.3, defining _POSIX_C_SOURCE or _XOPEN_SOURCE
  # has no effect, don't bother defining them
  Darwin/[6789].*)
    define_xopen_source=no;;
  Darwin/[12][0-9].*)
    define_xopen_source=no;;
  # On iOS, defining _POSIX_C_SOURCE also disables platform specific features.
  iOS/*)
    define_xopen_source=no;;
  # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from
  # defining NI_NUMERICHOST.
  QNX/6.3.2)
    define_xopen_source=no
    ;;
  # On VxWorks, defining _XOPEN_SOURCE causes compile failures
  # in network headers still using system V types.
  VxWorks/*)
    define_xopen_source=no
    ;;

  # On HP-UX, defining _XOPEN_SOURCE to 600 or greater hides
  # chroot() and other functions
  hp*|HP*)
    define_xopen_source=no
    ;;

esac

if test $define_xopen_source = yes
then
  # X/Open 8, incorporating POSIX.1-2024

printf "%s\n" "#define _XOPEN_SOURCE 800" >>confdefs.h


  # On Tru64 Unix 4.0F, defining _XOPEN_SOURCE also requires
  # definition of _XOPEN_SOURCE_EXTENDED and _POSIX_C_SOURCE, or else
  # several APIs are not declared. Since this is also needed in some
  # cases for HP-UX, we define it globally.

printf "%s\n" "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h



printf "%s\n" "#define _POSIX_C_SOURCE 202405L" >>confdefs.h


  # Defining _POSIX_C_SOURCE and _XOPEN_SOURCE hides C23 library
  # declarations on FreeBSD (e.g. sinpi() in math.h) when compiling
  # with -std=c11.  Defining _ISOC23_SOURCE makes them visible again.

printf "%s\n" "#define _ISOC23_SOURCE 1" >>confdefs.h

elif test "$ac_sys_system" = "SunOS"
then
  # On illumos the socket ancillary-data API (CMSG_*, sendmsg(), recvmsg())
  # is declared only with _XOPEN_SOURCE >= 600; Solaris declares it anyway.
  # __EXTENSIONS__ keeps the platform specific features which _XOPEN_SOURCE
  # would otherwise hide.  See gh-57208.

printf "%s\n" "#define _XOPEN_SOURCE 600" >>confdefs.h

fi

# On HP-UX mbstate_t requires _INCLUDE__STDC_A1_SOURCE
case $ac_sys_system in
  hp*|HP*)
    define_stdc_a1=yes;;
  *)
    define_stdc_a1=no;;
esac

if test $define_stdc_a1 = yes
then

printf "%s\n" "#define _INCLUDE__STDC_A1_SOURCE 1" >>confdefs.h

fi

# Record the configure-time value of MACOSX_DEPLOYMENT_TARGET,
# it may influence the way we can build extensions, so distutils
# needs to check it


CONFIGURE_MACOSX_DEPLOYMENT_TARGET=
EXPORT_MACOSX_DEPLOYMENT_TARGET='#'

# Record the value of IPHONEOS_DEPLOYMENT_TARGET enforced by the selected host triple.


# checks for alternative programs

# compiler flags are generated in two sets, BASECFLAGS and OPT.  OPT is just
# for debug/optimization stuff.  BASECFLAGS is for flags that are required
# just to get things to compile and link.  Users are free to override OPT
# when running configure or make.  The build should not break if they do.
# BASECFLAGS should generally not be messed with, however.

# If the user switches compilers, we can't believe the cache
if test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"
then
  as_fn_error $? "cached CC is different -- throw away $cache_file
(it is also a good idea to do 'make clean' before compiling)" "$LINENO" 5
fi

# Don't let AC_PROG_CC set the default CFLAGS. It normally sets -g -O2
# when the compiler supports them, but we don't always want -O2, and
# we set -g later.
if test -z "$CFLAGS"; then
        CFLAGS=
fi

case $host in #(
  wasm64-*-emscripten) :

    as_fn_append CFLAGS " -sMEMORY64=1"
    as_fn_append LDFLAGS " -sMEMORY64=1"
   ;; #(
  *) :
     ;;
esac

case $host in #(
  *-apple-ios*-simulator) :

    as_fn_append CFLAGS " -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"
    as_fn_append LDFLAGS " -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"
   ;; #(
  *-apple-ios*) :

    as_fn_append CFLAGS " -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"
    as_fn_append LDFLAGS " -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"
   ;; #(
  *) :
     ;;
esac

if test "$ac_sys_system" = "Darwin"
then
    # Extract the first word of "xcrun", so it can be a program name with args.
set dummy xcrun; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_HAS_XCRUN+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$HAS_XCRUN"; then
  ac_cv_prog_HAS_XCRUN="$HAS_XCRUN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAS_XCRUN="yes"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_HAS_XCRUN" && ac_cv_prog_HAS_XCRUN="missing"
fi ;;
esac
fi
HAS_XCRUN=$ac_cv_prog_HAS_XCRUN
if test -n "$HAS_XCRUN"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAS_XCRUN" >&5
printf "%s\n" "$HAS_XCRUN" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking macOS SDKROOT" >&5
printf %s "checking macOS SDKROOT... " >&6; }
  if test -z "$SDKROOT"; then
        if test "$HAS_XCRUN" = "yes"; then
            SDKROOT=$(xcrun --show-sdk-path)
    else
            SDKROOT="/"
    fi
  fi
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SDKROOT" >&5
printf "%s\n" "$SDKROOT" >&6; }

	# Compiler selection on MacOSX is more complicated than
	# AC_PROG_CC can handle, see Mac/README for more
	# information
	if test -z "${CC}"
	then
		found_gcc=
		found_clang=
		as_save_IFS=$IFS; IFS=:
		for as_dir in $PATH
		do
			IFS=$as_save_IFS
			if test -x "${as_dir}/gcc"; then
				if test -z "${found_gcc}"; then
					found_gcc="${as_dir}/gcc"
				fi
			fi
			if test -x "${as_dir}/clang"; then
				if test -z "${found_clang}"; then
					found_clang="${as_dir}/clang"
				fi
			fi
		done
		IFS=$as_save_IFS

		if test -n "$found_gcc" -a -n "$found_clang"
		then
			if test -n "`"$found_gcc" --version | grep llvm-gcc`"
			then
				{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Detected llvm-gcc, falling back to clang" >&5
printf "%s\n" "$as_me: Detected llvm-gcc, falling back to clang" >&6;}
				CC="$found_clang"
				CXX="$found_clang++"
			fi


		elif test -z "$found_gcc" -a -n "$found_clang"
		then
			{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: No GCC found, use CLANG" >&5
printf "%s\n" "$as_me: No GCC found, use CLANG" >&6;}
			CC="$found_clang"
			CXX="$found_clang++"

		elif test -z "$found_gcc" -a -z "$found_clang"
		then
			found_clang=`/usr/bin/xcrun -find clang 2>/dev/null`
			if test -n "${found_clang}"
			then
				{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Using clang from Xcode.app" >&5
printf "%s\n" "$as_me: Using clang from Xcode.app" >&6;}
				CC="${found_clang}"
				CXX="`/usr/bin/xcrun -find clang++`"

			# else: use default behaviour
			fi
		fi
	fi
fi









ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}gcc"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
printf "%s\n" "$CC" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CC"; then
  ac_ct_CC=$CC
  # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="gcc"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
printf "%s\n" "$ac_ct_CC" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
else
  CC="$ac_cv_prog_CC"
fi

if test -z "$CC"; then
          if test -n "$ac_tool_prefix"; then
    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}cc"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
printf "%s\n" "$CC" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  fi
fi
if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
       ac_prog_rejected=yes
       continue
     fi
    ac_cv_prog_CC="cc"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# != 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
  fi
fi
fi ;;
esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
printf "%s\n" "$CC" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$CC"; then
  if test -n "$ac_tool_prefix"; then
  for ac_prog in cl.exe
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
printf "%s\n" "$CC" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


    test -n "$CC" && break
  done
fi
if test -z "$CC"; then
  ac_ct_CC=$CC
  for ac_prog in cl.exe
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
printf "%s\n" "$ac_ct_CC" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  test -n "$ac_ct_CC" && break
done

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
fi

fi
if test -z "$CC"; then
  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
set dummy ${ac_tool_prefix}clang; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}clang"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
printf "%s\n" "$CC" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CC"; then
  ac_ct_CC=$CC
  # Extract the first word of "clang", so it can be a program name with args.
set dummy clang; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="clang"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
printf "%s\n" "$ac_ct_CC" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
else
  CC="$ac_cv_prog_CC"
fi

fi


test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See 'config.log' for more details" "$LINENO" 5; }

# Provide some information about the compiler.
printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion -version; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
printf %s "checking whether the C compiler works... " >&6; }
ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`

# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"

ac_rmfiles=
for ac_file in $ac_files
do
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
  esac
done
rm -f $ac_rmfiles

if { { ac_try="$ac_link_default"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_link_default") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
then :
  # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'.
# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no'
# in a Makefile.  We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
for ac_file in $ac_files ''
do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
	;;
    [ab].out )
	# We found the default executable, but exeext='' is most
	# certainly right.
	break;;
    *.* )
	if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
	then :; else
	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	fi
	# We set ac_cv_exeext here because the later test for it is not
	# safe: cross compilers may not add the suffix if given an '-o'
	# argument, so we may need to know it at that point already.
	# Even if this section looks crufty: it has the advantage of
	# actually working.
	break;;
    * )
	break;;
  esac
done
test "$ac_cv_exeext" = no && ac_cv_exeext=

else case e in #(
  e) ac_file='' ;;
esac
fi
if test -z "$ac_file"
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See 'config.log' for more details" "$LINENO" 5; }
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; } ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
printf %s "checking for C compiler default output file name... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext

rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
then :
  # If both 'conftest.exe' and 'conftest' are 'present' (well, observable)
# catch 'conftest.exe'.  For instance with Cygwin, 'ls conftest' will
# work properly (i.e., refer to 'conftest.exe'), while it won't with
# 'rm'.
for ac_file in conftest.exe conftest conftest.*; do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	  break;;
    * ) break;;
  esac
done
else case e in #(
  e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See 'config.log' for more details" "$LINENO" 5; } ;;
esac
fi
rm -f conftest conftest$ac_cv_exeext
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
printf "%s\n" "$ac_cv_exeext" >&6; }

rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
int
main (void)
{
FILE *f = fopen ("conftest.out", "w");
 if (!f)
  return 1;
 return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run.  If not, either
# the compiler is broken, or we cross compile.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
  { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
  if { ac_try='./conftest$ac_cv_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then
    cross_compiling=no
  else
    if test "$cross_compiling" = maybe; then
	cross_compiling=yes
    else
	{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot run C compiled programs.
If you meant to cross compile, use '--host'.
See 'config.log' for more details" "$LINENO" 5; }
    fi
  fi
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
printf "%s\n" "$cross_compiling" >&6; }

rm -f conftest.$ac_ext conftest$ac_cv_exeext \
  conftest.o conftest.obj conftest.out
ac_clean_files=$ac_clean_files_save
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
printf %s "checking for suffix of object files... " >&6; }
if test ${ac_cv_objext+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
printf "%s\n" "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
then :
  for ac_file in conftest.o conftest.obj conftest.*; do
  test -f "$ac_file" || continue;
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
       break;;
  esac
done
else case e in #(
  e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See 'config.log' for more details" "$LINENO" 5; } ;;
esac
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
printf %s "checking whether the compiler supports GNU C... " >&6; }
if test ${ac_cv_c_compiler_gnu+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_compiler_gnu=yes
else case e in #(
  e) ac_compiler_gnu=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
ac_compiler_gnu=$ac_cv_c_compiler_gnu

if test $ac_compiler_gnu = yes; then
  GCC=yes
else
  GCC=
fi
ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
printf %s "checking whether $CC accepts -g... " >&6; }
if test ${ac_cv_prog_cc_g+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_save_c_werror_flag=$ac_c_werror_flag
   ac_c_werror_flag=yes
   ac_cv_prog_cc_g=no
   CFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_prog_cc_g=yes
else case e in #(
  e) CFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

else case e in #(
  e) ac_c_werror_flag=$ac_save_c_werror_flag
	 CFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_prog_cc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ac_c_werror_flag=$ac_save_c_werror_flag ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
if test $ac_test_CFLAGS; then
  CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi
ac_prog_cc_stdc=no
if test x$ac_prog_cc_stdc = xno
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
printf %s "checking for $CC option to enable C11 features... " >&6; }
if test ${ac_cv_prog_cc_c11+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_c_conftest_c11_program
_ACEOF
for ac_arg in '' -std=gnu11
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_prog_cc_c11=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam
  test "x$ac_cv_prog_cc_c11" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC ;;
esac
fi

if test "x$ac_cv_prog_cc_c11" = xno
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
else case e in #(
  e) if test "x$ac_cv_prog_cc_c11" = x
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
     CC="$CC $ac_cv_prog_cc_c11" ;;
esac
fi
  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
  ac_prog_cc_stdc=c11 ;;
esac
fi
fi
if test x$ac_prog_cc_stdc = xno
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
printf %s "checking for $CC option to enable C99 features... " >&6; }
if test ${ac_cv_prog_cc_c99+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_cv_prog_cc_c99=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_c_conftest_c99_program
_ACEOF
for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_prog_cc_c99=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam
  test "x$ac_cv_prog_cc_c99" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC ;;
esac
fi

if test "x$ac_cv_prog_cc_c99" = xno
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
else case e in #(
  e) if test "x$ac_cv_prog_cc_c99" = x
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
     CC="$CC $ac_cv_prog_cc_c99" ;;
esac
fi
  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
  ac_prog_cc_stdc=c99 ;;
esac
fi
fi
if test x$ac_prog_cc_stdc = xno
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
printf %s "checking for $CC option to enable C89 features... " >&6; }
if test ${ac_cv_prog_cc_c89+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_c_conftest_c89_program
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam
  test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC ;;
esac
fi

if test "x$ac_cv_prog_cc_c89" = xno
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
else case e in #(
  e) if test "x$ac_cv_prog_cc_c89" = x
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
     CC="$CC $ac_cv_prog_cc_c89" ;;
esac
fi
  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
  ac_prog_cc_stdc=c89 ;;
esac
fi
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
printf %s "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
  if test ${ac_cv_prog_CPP+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)     # Double quotes because $CC needs to be expanded
    for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
    do
      ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"
then :

else case e in #(
  e) # Broken: fails on valid input.
continue ;;
esac
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"
then :
  # Broken: success on invalid input.
continue
else case e in #(
  e) # Passes both tests.
ac_preproc_ok=:
break ;;
esac
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok
then :
  break
fi

    done
    ac_cv_prog_CPP=$CPP
   ;;
esac
fi
  CPP=$ac_cv_prog_CPP
else
  ac_cv_prog_CPP=$CPP
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
printf "%s\n" "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"
then :

else case e in #(
  e) # Broken: fails on valid input.
continue ;;
esac
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"
then :
  # Broken: success on invalid input.
continue
else case e in #(
  e) # Passes both tests.
ac_preproc_ok=:
break ;;
esac
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok
then :

else case e in #(
  e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
See 'config.log' for more details" "$LINENO" 5; } ;;
esac
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
printf %s "checking for grep that handles long lines and -e... " >&6; }
if test ${ac_cv_path_GREP+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -z "$GREP"; then
  ac_path_GREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_prog in grep ggrep
   do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_GREP" || continue
# Check for GNU ac_path_GREP and select it if it is found.
  # Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in #(
*GNU*)
  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
#(
*)
  ac_count=0
  printf %s 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    printf "%s\n" 'GREP' >> "conftest.nl"
    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_GREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_GREP="$ac_path_GREP"
      ac_path_GREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_GREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_GREP"; then
    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_GREP=$GREP
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
printf "%s\n" "$ac_cv_path_GREP" >&6; }
 GREP="$ac_cv_path_GREP"


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
printf %s "checking for a sed that does not truncate output... " >&6; }
if test ${ac_cv_path_SED+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)           ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
     for ac_i in 1 2 3 4 5 6 7; do
       ac_script="$ac_script$as_nl$ac_script"
     done
     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
     { ac_script=; unset ac_script;}
     if test -z "$SED"; then
  ac_path_SED_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_prog in sed gsed
   do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
  # Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in #(
*GNU*)
  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
#(
*)
  ac_count=0
  printf %s 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    printf "%s\n" '' >> "conftest.nl"
    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_SED_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_SED="$ac_path_SED"
      ac_path_SED_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_SED_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_SED"; then
    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
  fi
else
  ac_cv_path_SED=$SED
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
printf "%s\n" "$ac_cv_path_SED" >&6; }
 SED="$ac_cv_path_SED"
  rm -f conftest.sed

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
printf %s "checking for egrep... " >&6; }
if test ${ac_cv_path_EGREP+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
   then ac_cv_path_EGREP="$GREP -E"
   else
     if test -z "$EGREP"; then
  ac_path_EGREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_prog in egrep
   do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_EGREP" || continue
# Check for GNU ac_path_EGREP and select it if it is found.
  # Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in #(
*GNU*)
  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
#(
*)
  ac_count=0
  printf %s 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    printf "%s\n" 'EGREP' >> "conftest.nl"
    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_EGREP="$ac_path_EGREP"
      ac_path_EGREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_EGREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_EGREP"; then
    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_EGREP=$EGREP
fi

   fi ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
printf "%s\n" "$ac_cv_path_EGREP" >&6; }
 EGREP="$ac_cv_path_EGREP"

         EGREP_TRADITIONAL=$EGREP
 ac_cv_path_EGREP_TRADITIONAL=$EGREP


CC_BASENAME=$(expr "//$CC" : '.*/\(.*\)')

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CC compiler name" >&5
printf %s "checking for CC compiler name... " >&6; }
if test ${ac_cv_cc_name+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat > conftest.c <<EOF
#if defined(__EMSCRIPTEN__)
  emcc
#elif defined(__INTEL_CLANG_COMPILER) || defined(__INTEL_LLVM_COMPILER)
  icx
#elif defined(__INTEL_COMPILER) || defined(__ICC)
  icc
#elif defined(__ibmxl__) || defined(__xlc__) || defined(__xlC__)
  xlc
#elif defined(_MSC_VER)
  msvc
#elif defined(__clang__)
  clang
#elif defined(__GNUC__)
  gcc
#else
#  error unknown compiler
#endif
EOF

if $CPP $CPPFLAGS conftest.c >conftest.out 2>/dev/null; then
  ac_cv_cc_name=`grep -v '^#' conftest.out | grep -v '^ *$' | tr -d ' 	'`
  if test "x$CC_BASENAME" = xmpicc
then :
  ac_cv_cc_name=mpicc
fi
else
  ac_cv_cc_name="unknown"
fi
rm -f conftest.c conftest.out
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_name" >&5
printf "%s\n" "$ac_cv_cc_name" >&6; }

# checks for UNIX variants that set C preprocessor variables
# may set _GNU_SOURCE, __EXTENSIONS__, _POSIX_PTHREAD_SEMANTICS,
# _POSIX_SOURCE, _POSIX_1_SOURCE, and more

ac_header= ac_cache=
for ac_item in $ac_header_c_list
do
  if test $ac_cache; then
    ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
    if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
      printf "%s\n" "#define $ac_item 1" >> confdefs.h
    fi
    ac_header= ac_cache=
  elif test $ac_header; then
    ac_cache=$ac_item
  else
    ac_header=$ac_item
  fi
done








if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
then :

printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h

fi






  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; }
if test ${ac_cv_safe_to_define___extensions__+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#         define __EXTENSIONS__ 1
          $ac_includes_default
int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_safe_to_define___extensions__=yes
else case e in #(
  e) ac_cv_safe_to_define___extensions__=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; }

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5
printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; }
if test ${ac_cv_should_define__xopen_source+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_cv_should_define__xopen_source=no
    if test $ac_cv_header_wchar_h = yes
then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

          #include <wchar.h>
          mbstate_t x;
int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

            #define _XOPEN_SOURCE 500
            #include <wchar.h>
            mbstate_t x;
int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_should_define__xopen_source=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; }

  printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h

  printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h

  printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h

  printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h

  printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h

  printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h

  printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h

  printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h

  printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h

  printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h

  printf "%s\n" "#define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h

  printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h

  printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h

  printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h

  printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h

  printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h

  if test $ac_cv_header_minix_config_h = yes
then :
  MINIX=yes
    printf "%s\n" "#define _MINIX 1" >>confdefs.h

    printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h

    printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h

else case e in #(
  e) MINIX= ;;
esac
fi
  if test $ac_cv_safe_to_define___extensions__ = yes
then :
  printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h

fi
  if test $ac_cv_should_define__xopen_source = yes
then :
  printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h

fi



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GCC compatible compiler" >&5
printf %s "checking for GCC compatible compiler... " >&6; }
if test ${ac_cv_gcc_compat+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

                #if !defined(__GNUC__)
                  #error "not GCC compatible"
                #else
                  /* GCC compatible! */
                #endif

_ACEOF
if ac_fn_c_try_cpp "$LINENO"
then :
  ac_cv_gcc_compat=yes
else case e in #(
  e) ac_cv_gcc_compat=no ;;
esac
fi
rm -f conftest.err conftest.i conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_compat" >&5
printf "%s\n" "$ac_cv_gcc_compat" >&6; }



preset_cxx="$CXX"
if test -z "$CXX"
then
        case "$ac_cv_cc_name" in
        gcc)    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args.
set dummy ${ac_tool_prefix}g++; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_CXX="$CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
CXX=$ac_cv_path_CXX
if test -n "$CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
printf "%s\n" "$CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_CXX"; then
  ac_pt_CXX=$CXX
  # Extract the first word of "g++", so it can be a program name with args.
set dummy g++; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_CXX="$ac_pt_CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_CXX=$ac_cv_path_ac_pt_CXX
if test -n "$ac_pt_CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CXX" >&5
printf "%s\n" "$ac_pt_CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_CXX" = x; then
    CXX="notfound"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_pt_CXX
  fi
else
  CXX="$ac_cv_path_CXX"
fi
 ;;
        cc)     if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}c++", so it can be a program name with args.
set dummy ${ac_tool_prefix}c++; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_CXX="$CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
CXX=$ac_cv_path_CXX
if test -n "$CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
printf "%s\n" "$CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_CXX"; then
  ac_pt_CXX=$CXX
  # Extract the first word of "c++", so it can be a program name with args.
set dummy c++; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_CXX="$ac_pt_CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_CXX=$ac_cv_path_ac_pt_CXX
if test -n "$ac_pt_CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CXX" >&5
printf "%s\n" "$ac_pt_CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_CXX" = x; then
    CXX="notfound"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_pt_CXX
  fi
else
  CXX="$ac_cv_path_CXX"
fi
 ;;
        clang)  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}clang++", so it can be a program name with args.
set dummy ${ac_tool_prefix}clang++; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_CXX="$CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
CXX=$ac_cv_path_CXX
if test -n "$CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
printf "%s\n" "$CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_CXX"; then
  ac_pt_CXX=$CXX
  # Extract the first word of "clang++", so it can be a program name with args.
set dummy clang++; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_CXX="$ac_pt_CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_CXX=$ac_cv_path_ac_pt_CXX
if test -n "$ac_pt_CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CXX" >&5
printf "%s\n" "$ac_pt_CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_CXX" = x; then
    CXX="notfound"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_pt_CXX
  fi
else
  CXX="$ac_cv_path_CXX"
fi
 ;;
        icx)    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}icpx", so it can be a program name with args.
set dummy ${ac_tool_prefix}icpx; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_CXX="$CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
CXX=$ac_cv_path_CXX
if test -n "$CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
printf "%s\n" "$CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_CXX"; then
  ac_pt_CXX=$CXX
  # Extract the first word of "icpx", so it can be a program name with args.
set dummy icpx; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_CXX="$ac_pt_CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_CXX=$ac_cv_path_ac_pt_CXX
if test -n "$ac_pt_CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CXX" >&5
printf "%s\n" "$ac_pt_CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_CXX" = x; then
    CXX="notfound"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_pt_CXX
  fi
else
  CXX="$ac_cv_path_CXX"
fi
 ;;
        icc)    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}icpc", so it can be a program name with args.
set dummy ${ac_tool_prefix}icpc; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_CXX="$CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
CXX=$ac_cv_path_CXX
if test -n "$CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
printf "%s\n" "$CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_CXX"; then
  ac_pt_CXX=$CXX
  # Extract the first word of "icpc", so it can be a program name with args.
set dummy icpc; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_CXX="$ac_pt_CXX" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_CXX="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_CXX=$ac_cv_path_ac_pt_CXX
if test -n "$ac_pt_CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CXX" >&5
printf "%s\n" "$ac_pt_CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_CXX" = x; then
    CXX="notfound"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_pt_CXX
  fi
else
  CXX="$ac_cv_path_CXX"
fi
 ;;
        esac
	if test "$CXX" = "notfound"
	then
		CXX=""
	fi
fi
if test -z "$CXX"
then
	if test -n "$ac_tool_prefix"; then
  for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
printf "%s\n" "$CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


    test -n "$CXX" && break
  done
fi
if test -z "$CXX"; then
  ac_ct_CXX=$CXX
  for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CXX+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$ac_ct_CXX"; then
  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CXX="$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
printf "%s\n" "$ac_ct_CXX" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  test -n "$ac_ct_CXX" && break
done

  if test "x$ac_ct_CXX" = x; then
    CXX="notfound"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_ct_CXX
  fi
fi

	if test "$CXX" = "notfound"
	then
		CXX=""
	fi
fi
if test "$preset_cxx" != "$CXX"
then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}:

  By default, distutils will build C++ extension modules with \"$CXX\".
  If this is not intended, then set CXX on the configure command line.
  " >&5
printf "%s\n" "$as_me:

  By default, distutils will build C++ extension modules with \"$CXX\".
  If this is not intended, then set CXX on the configure command line.
  " >&6;}
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5
printf %s "checking for the platform triplet based on compiler characteristics... " >&6; }
if $CPP $CPPFLAGS $srcdir/Misc/platform_triplet.c >conftest.out 2>/dev/null; then
  PLATFORM_TRIPLET=`grep '^PLATFORM_TRIPLET=' conftest.out | tr -d ' 	'`
  PLATFORM_TRIPLET="${PLATFORM_TRIPLET#PLATFORM_TRIPLET=}"
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PLATFORM_TRIPLET" >&5
printf "%s\n" "$PLATFORM_TRIPLET" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
printf "%s\n" "none" >&6; }
fi
rm -f conftest.out

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for multiarch" >&5
printf %s "checking for multiarch... " >&6; }
case $ac_sys_system in #(
  Darwin*) :
    MULTIARCH="" ;; #(
  iOS) :
    MULTIARCH="" ;; #(
  FreeBSD*) :
    MULTIARCH="" ;; #(
  OpenBSD*) :
    MULTIARCH="" ;; #(
  *) :
    MULTIARCH=$($CC --print-multiarch 2>/dev/null)
 ;;
esac


if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
  if test x$PLATFORM_TRIPLET != x$MULTIARCH; then
    as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5
  fi
elif test x$PLATFORM_TRIPLET != x && test x$MULTIARCH = x; then
  MULTIARCH=$PLATFORM_TRIPLET
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MULTIARCH" >&5
printf "%s\n" "$MULTIARCH" >&6; }

case $ac_sys_system in #(
  iOS) :
    SOABI_PLATFORM=`echo "$PLATFORM_TRIPLET" | cut -d '-' -f2` ;; #(
  *) :
    SOABI_PLATFORM=$PLATFORM_TRIPLET
 ;;
esac

if test x$SOABI_PLATFORM != x; then

printf "%s\n" "#define SOABI_PLATFORM \"${SOABI_PLATFORM}\"" >>confdefs.h

fi

if test x$MULTIARCH != x; then
  MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\""
fi


# Guess C stack direction
case $host in #(
  hppa*) :
    _Py_STACK_GROWS_DOWN=0 ;; #(
  *) :
    _Py_STACK_GROWS_DOWN=1 ;;
esac

printf "%s\n" "#define _Py_STACK_GROWS_DOWN $_Py_STACK_GROWS_DOWN" >>confdefs.h



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PEP 11 support tier" >&5
printf %s "checking for PEP 11 support tier... " >&6; }
case $host/$ac_cv_cc_name in #(
  x86_64-*-linux-gnu/gcc) :
    PY_SUPPORT_TIER=1 ;; #(
    x86_64-apple-darwin*/clang) :
    PY_SUPPORT_TIER=1 ;; #(
    aarch64-apple-darwin*/clang) :
    PY_SUPPORT_TIER=1 ;; #(
    i686-pc-windows-msvc/msvc) :
    PY_SUPPORT_TIER=1 ;; #(
    x86_64-pc-windows-msvc/msvc) :
    PY_SUPPORT_TIER=1 ;; #(

  aarch64-*-linux-gnu/gcc) :
    PY_SUPPORT_TIER=2 ;; #(
    aarch64-*-linux-gnu/clang) :
    PY_SUPPORT_TIER=2 ;; #(
  powerpc64le-*-linux-gnu/gcc) :
    PY_SUPPORT_TIER=2 ;; #(
    wasm32-unknown-wasip1/clang) :
    PY_SUPPORT_TIER=2 ;; #(
    x86_64-*-linux-gnu/clang) :
    PY_SUPPORT_TIER=2 ;; #(

  aarch64-pc-windows-msvc/msvc) :
    PY_SUPPORT_TIER=3 ;; #(
    armv7l-*-linux-gnueabihf/gcc) :
    PY_SUPPORT_TIER=3 ;; #(
    powerpc64le-*-linux-gnu/clang) :
    PY_SUPPORT_TIER=3 ;; #(
    riscv64-*-linux-gnu/gcc) :
    PY_SUPPORT_TIER=3 ;; #(
    riscv64-*-linux-gnu/clang) :
    PY_SUPPORT_TIER=3 ;; #(
  s390x-*-linux-gnu/gcc) :
    PY_SUPPORT_TIER=3 ;; #(
    x86_64-*-freebsd*/clang) :
    PY_SUPPORT_TIER=3 ;; #(
    aarch64-apple-ios*-simulator/clang) :
    PY_SUPPORT_TIER=3 ;; #(
    aarch64-apple-ios*/clang) :
    PY_SUPPORT_TIER=3 ;; #(
    aarch64-*-linux-android/clang) :
    PY_SUPPORT_TIER=3 ;; #(
    x86_64-*-linux-android/clang) :
    PY_SUPPORT_TIER=3 ;; #(
    wasm32-*-emscripten/emcc) :
    PY_SUPPORT_TIER=3 ;; #(
  *) :

  PY_SUPPORT_TIER=0
 ;;
esac

case $PY_SUPPORT_TIER in #(
  1) :
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $host/$ac_cv_cc_name has tier 1 (supported)" >&5
printf "%s\n" "$host/$ac_cv_cc_name has tier 1 (supported)" >&6; } ;; #(
  2) :
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $host/$ac_cv_cc_name has tier 2 (supported)" >&5
printf "%s\n" "$host/$ac_cv_cc_name has tier 2 (supported)" >&6; } ;; #(
  3) :
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $host/$ac_cv_cc_name has tier 3 (partially supported)" >&5
printf "%s\n" "$host/$ac_cv_cc_name has tier 3 (partially supported)" >&6; } ;; #(
  *) :
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $host/$ac_cv_cc_name is not supported" >&5
printf "%s\n" "$as_me: WARNING: $host/$ac_cv_cc_name is not supported" >&2;}
 ;;
esac


printf "%s\n" "#define PY_SUPPORT_TIER $PY_SUPPORT_TIER" >>confdefs.h


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -Wl,--no-as-needed" >&5
printf %s "checking for -Wl,--no-as-needed... " >&6; }
if test ${ac_cv_wl_no_as_needed+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  save_LDFLAGS="$LDFLAGS"
  as_fn_append LDFLAGS " -Wl,--no-as-needed"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  NO_AS_NEEDED="-Wl,--no-as-needed"
     ac_cv_wl_no_as_needed=yes
else case e in #(
  e) NO_AS_NEEDED=""
     ac_cv_wl_no_as_needed=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
  LDFLAGS="$save_LDFLAGS"
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_wl_no_as_needed" >&5
printf "%s\n" "$ac_cv_wl_no_as_needed" >&6; }


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Android API level" >&5
printf %s "checking for the Android API level... " >&6; }
cat > conftest.c <<EOF
#ifdef __ANDROID__
android_api = __ANDROID_API__
arm_arch = __ARM_ARCH
#else
#error not Android
#endif
EOF

if $CPP $CPPFLAGS conftest.c >conftest.out 2>/dev/null; then
  ANDROID_API_LEVEL=`sed -n -e '/__ANDROID_API__/d' -e 's/^android_api = //p' conftest.out`
  _arm_arch=`sed -n -e '/__ARM_ARCH/d' -e 's/^arm_arch = //p' conftest.out`
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ANDROID_API_LEVEL" >&5
printf "%s\n" "$ANDROID_API_LEVEL" >&6; }
  if test -z "$ANDROID_API_LEVEL"; then
    as_fn_error $? "Fatal: you must define __ANDROID_API__" "$LINENO" 5
  fi

printf "%s\n" "#define ANDROID_API_LEVEL $ANDROID_API_LEVEL" >>confdefs.h


  # For __android_log_write() in Python/pylifecycle.c.
  LIBS="$LIBS -llog"

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Android arm ABI" >&5
printf %s "checking for the Android arm ABI... " >&6; }
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $_arm_arch" >&5
printf "%s\n" "$_arm_arch" >&6; }
  if test "$_arm_arch" = 7; then
    BASECFLAGS="${BASECFLAGS} -mfloat-abi=softfp -mfpu=vfpv3-d16"
    LDFLAGS="${LDFLAGS} -march=armv7-a -Wl,--fix-cortex-a8"
  fi
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not Android" >&5
printf "%s\n" "not Android" >&6; }
fi
rm -f conftest.c conftest.out

# Check for unsupported systems
case $ac_sys_system/$ac_sys_release in #(
  atheos*|Linux*/1*) :

    as_fn_error $? "This system \($ac_sys_system/$ac_sys_release\) is no longer supported. See README for details." "$LINENO" 5

 ;; #(
  *) :
     ;;
esac

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-wasm-dynamic-linking" >&5
printf %s "checking for --enable-wasm-dynamic-linking... " >&6; }
# Check whether --enable-wasm-dynamic-linking was given.
if test ${enable_wasm_dynamic_linking+y}
then :
  enableval=$enable_wasm_dynamic_linking;
  case $ac_sys_system in #(
  Emscripten) :
     ;; #(
  WASI) :
     ;; #(
  *) :
    as_fn_error $? "--enable-wasm-dynamic-linking only applies to Emscripten and WASI" "$LINENO" 5
   ;;
esac

else case e in #(
  e)
  enable_wasm_dynamic_linking=missing
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_wasm_dynamic_linking" >&5
printf "%s\n" "$enable_wasm_dynamic_linking" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-wasm-pthreads" >&5
printf %s "checking for --enable-wasm-pthreads... " >&6; }
# Check whether --enable-wasm-pthreads was given.
if test ${enable_wasm_pthreads+y}
then :
  enableval=$enable_wasm_pthreads;
  case $ac_sys_system in #(
  Emscripten) :
     ;; #(
  WASI) :
     ;; #(
  *) :
    as_fn_error $? "--enable-wasm-pthreads only applies to Emscripten and WASI" "$LINENO" 5
   ;;
esac

else case e in #(
  e)
  enable_wasm_pthreads=missing
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_wasm_pthreads" >&5
printf "%s\n" "$enable_wasm_pthreads" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-emscripten-syscalls" >&5
printf %s "checking for --enable-emscripten-syscalls... " >&6; }
# Check whether --enable-emscripten-syscalls was given.
if test ${enable_emscripten_syscalls+y}
then :
  enableval=$enable_emscripten_syscalls;
  case $ac_sys_system in #(
  Emscripten) :
     ;; #(
  *) :
    as_fn_error $? "--enable-emscripten-syscalls only applies to Emscripten" "$LINENO" 5
   ;;
esac

else case e in #(
  e)
  enable_emscripten_syscalls=yes
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_emscripten_syscalls" >&5
printf "%s\n" "$enable_emscripten_syscalls" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-suffix" >&5
printf %s "checking for --with-suffix... " >&6; }

# Check whether --with-suffix was given.
if test ${with_suffix+y}
then :
  withval=$with_suffix;
	case $with_suffix in #(
  no) :
    EXEEXT= ;; #(
  yes) :
    EXEEXT=.exe ;; #(
  *) :
    EXEEXT=$with_suffix
   ;;
esac

else case e in #(
  e)
  case $ac_sys_system in #(
  Emscripten) :
    EXEEXT=.mjs ;; #(
  WASI) :
    EXEEXT=.wasm ;; #(
  *) :
    EXEEXT=
   ;;
esac
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $EXEEXT" >&5
printf "%s\n" "$EXEEXT" >&6; }

# Make sure we keep EXEEXT and ac_exeext sync'ed.
ac_exeext=$EXEEXT

# Test whether we're running on a non-case-sensitive system, in which
# case we give a warning if no ext is given

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for case-insensitive build directory" >&5
printf %s "checking for case-insensitive build directory... " >&6; }
if test ! -d CaseSensitiveTestDir; then
mkdir CaseSensitiveTestDir
fi

if test -d casesensitivetestdir && test -z "$EXEEXT"
then
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
    BUILDEXEEXT=.exe
else
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
	BUILDEXEEXT=$EXEEXT
fi
rmdir CaseSensitiveTestDir

case $ac_sys_system in
hp*|HP*)
    case $ac_cv_cc_name in
    cc|*/cc) CC="$CC -Ae";;
    esac;;
esac


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking LIBRARY" >&5
printf %s "checking LIBRARY... " >&6; }
if test -z "$LIBRARY"
then
	LIBRARY='libpython$(VERSION)$(ABIFLAGS).a'
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBRARY" >&5
printf "%s\n" "$LIBRARY" >&6; }

# LDLIBRARY is the name of the library to link against (as opposed to the
# name of the library into which to insert object files). BLDLIBRARY is also
# the library to link against, usually. On Mac OS X frameworks, BLDLIBRARY
# is blank as the main program is not linked directly against LDLIBRARY.
# LDLIBRARYDIR is the path to LDLIBRARY, which is made in a subdirectory. On
# systems without shared libraries, LDLIBRARY is the same as LIBRARY
# (defined in the Makefiles). On Cygwin LDLIBRARY is the import library,
# DLLLIBRARY is the shared (i.e., DLL) library.
#
# RUNSHARED is used to run shared python without installed libraries
#
# INSTSONAME is the name of the shared library that will be use to install
# on the system - some systems like version suffix, others don't
#
# LDVERSION is the shared library version number, normally the Python version
# with the ABI build flags appended.








LDLIBRARY="$LIBRARY"
BLDLIBRARY='$(LDLIBRARY)'
INSTSONAME='$(LDLIBRARY)'
DLLLIBRARY=''
LDLIBRARYDIR=''
RUNSHARED=''
LDVERSION="$VERSION"

# LINKCC is the command that links the python executable -- default is $(CC).
# If CXX is set, and if it is needed to link a main function that was
# compiled with CXX, LINKCC is CXX instead. Always using CXX is undesirable:
# python might then depend on the C++ runtime

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking LINKCC" >&5
printf %s "checking LINKCC... " >&6; }
if test -z "$LINKCC"
then
	LINKCC='$(PURIFY) $(CC)'
	case $ac_sys_system in
	QNX*)
	   # qcc must be used because the other compilers do not
	   # support -N.
	   LINKCC=qcc;;
	esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LINKCC" >&5
printf "%s\n" "$LINKCC" >&6; }

# EXPORTSYMS holds the list of exported symbols for AIX.
# EXPORTSFROM holds the module name exporting symbols on AIX.
EXPORTSYMS=
EXPORTSFROM=


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking EXPORTSYMS" >&5
printf %s "checking EXPORTSYMS... " >&6; }
case $ac_sys_system in
AIX*)
	EXPORTSYMS="Modules/python.exp"
	EXPORTSFROM=. # the main executable
	;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $EXPORTSYMS" >&5
printf "%s\n" "$EXPORTSYMS" >&6; }

# GNULD is set to "yes" if the GNU linker is used.  If this goes wrong
# make sure we default having it set to "no": this is used by
# distutils.unixccompiler to know if it should add --enable-new-dtags
# to linker command lines, and failing to detect GNU ld simply results
# in the same behaviour as before.

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
printf %s "checking for GNU ld... " >&6; }
ac_prog=ld
if test "$ac_cv_cc_name" = "gcc"; then
       ac_prog=`$CC -print-prog-name=ld`
fi
case `"$ac_prog" -V 2>&1 < /dev/null` in
      *GNU*)
          GNULD=yes;;
      *)
          GNULD=no;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GNULD" >&5
printf "%s\n" "$GNULD" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-shared" >&5
printf %s "checking for --enable-shared... " >&6; }
# Check whether --enable-shared was given.
if test ${enable_shared+y}
then :
  enableval=$enable_shared;
fi


if test -z "$enable_shared"
then
  case $ac_sys_system in
  CYGWIN*)
    enable_shared="yes";;
  *)
    enable_shared="no";;
  esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
printf "%s\n" "$enable_shared" >&6; }

# --with-static-libpython
STATIC_LIBPYTHON=1
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-static-libpython" >&5
printf %s "checking for --with-static-libpython... " >&6; }

# Check whether --with-static-libpython was given.
if test ${with_static_libpython+y}
then :
  withval=$with_static_libpython;
if test "$withval" = no
then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; };
  STATIC_LIBPYTHON=0
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; };
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; } ;;
esac
fi



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-static-libpython-for-interpreter" >&5
printf %s "checking for --enable-static-libpython-for-interpreter... " >&6; }
# Check whether --enable-static-libpython-for-interpreter was given.
if test ${enable_static_libpython_for_interpreter+y}
then :
  enableval=$enable_static_libpython_for_interpreter;
fi


if test -z "$enable_static_libpython_for_interpreter"
then
  enable_static_libpython_for_interpreter="no"
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static_libpython_for_interpreter" >&5
printf "%s\n" "$enable_static_libpython_for_interpreter" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-profiling" >&5
printf %s "checking for --enable-profiling... " >&6; }
# Check whether --enable-profiling was given.
if test ${enable_profiling+y}
then :
  enableval=$enable_profiling;
fi

if test "x$enable_profiling" = xyes; then
  ac_save_cc="$CC"
  CC="$CC -pg"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(void) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :

else case e in #(
  e) enable_profiling=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
  CC="$ac_save_cc"
else
  enable_profiling=no
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_profiling" >&5
printf "%s\n" "$enable_profiling" >&6; }

if test "x$enable_profiling" = xyes; then
  BASECFLAGS="-pg $BASECFLAGS"
  LDFLAGS="-pg $LDFLAGS"
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking LDLIBRARY" >&5
printf %s "checking LDLIBRARY... " >&6; }

# Apple framework builds need more magic. LDLIBRARY is the dynamic
# library that we build, but we do not want to link against it (we
# will find it with a -framework option). For this reason there is an
# extra variable BLDLIBRARY against which Python and the extension
# modules are linked, BLDLIBRARY. This is normally the same as
# LDLIBRARY, but empty for MacOSX framework builds. iOS does the same,
# but uses a non-versioned framework layout.
if test "$enable_framework"
then
  case $ac_sys_system in
    Darwin)
      LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)';;
    iOS)
      LDLIBRARY='$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)';;
    *)
      as_fn_error $? "Unknown platform for framework build" "$LINENO" 5;;
  esac
  BLDLIBRARY=''
  RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
else
  BLDLIBRARY='$(LDLIBRARY)'
fi

# Other platforms follow
if test $enable_shared = "yes"; then
  PY_ENABLE_SHARED=1

printf "%s\n" "#define Py_ENABLE_SHARED 1" >>confdefs.h

  case $ac_sys_system in
    CYGWIN*)
      LDLIBRARY='libpython$(LDVERSION).dll.a'
      BLDLIBRARY='-L. -lpython$(LDVERSION)'
      DLLLIBRARY='cygpython$(LDVERSION).dll'
      ;;
    SunOS*)
      LDLIBRARY='libpython$(LDVERSION).so'
      BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
      RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
      INSTSONAME="$LDLIBRARY".$SOVERSION
      if test "$with_pydebug" != yes
      then
        PY3LIBRARY=libpython3.so
      fi
      ;;
    Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*)
      LDLIBRARY='libpython$(LDVERSION).so'
      BLDLIBRARY='-L. -lpython$(LDVERSION)'
      RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

      # The Android Gradle plugin will only package libraries whose names end
      # with ".so".
      if test "$ac_sys_system" != "Linux-android"; then
          INSTSONAME="$LDLIBRARY".$SOVERSION
      fi

      if test "$with_pydebug" != yes
      then
        PY3LIBRARY=libpython3.so
      fi
      ;;
    hp*|HP*)
      case `uname -m` in
        ia64)
          LDLIBRARY='libpython$(LDVERSION).so'
          ;;
        *)
          LDLIBRARY='libpython$(LDVERSION).sl'
          ;;
      esac
      BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
      RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
      ;;
    Darwin*)
      LDLIBRARY='libpython$(LDVERSION).dylib'
      BLDLIBRARY='-L. -lpython$(LDVERSION)'
      RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
      ;;
    iOS)
      if test -z "$PYTHONFRAMEWORK"; then
        as_fn_error $? "iOS shared builds must use --enable-framework; an iOS app can only load a signed framework, never a bare dylib" "$LINENO" 5
      fi
      LDLIBRARY='libpython$(LDVERSION).dylib'
      ;;
    AIX*)
      LDLIBRARY='libpython$(LDVERSION).so'
      RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
      ;;

  esac
else # shared is disabled
  PY_ENABLE_SHARED=0
  case $ac_sys_system in
    CYGWIN*)
      BLDLIBRARY='$(LIBRARY)'
      LDLIBRARY='libpython$(LDVERSION).a'
      ;;
  esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LDLIBRARY" >&5
printf "%s\n" "$LDLIBRARY" >&6; }

# HOSTRUNNER - Program to run CPython for the host platform
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking HOSTRUNNER" >&5
printf %s "checking HOSTRUNNER... " >&6; }
if test -z "$HOSTRUNNER"
then
  case $ac_sys_system in #(
  Emscripten) :

      if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}node", so it can be a program name with args.
set dummy ${ac_tool_prefix}node; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_NODE+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $NODE in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_NODE="$NODE" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_NODE="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
NODE=$ac_cv_path_NODE
if test -n "$NODE"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NODE" >&5
printf "%s\n" "$NODE" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_NODE"; then
  ac_pt_NODE=$NODE
  # Extract the first word of "node", so it can be a program name with args.
set dummy node; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_NODE+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_NODE in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_NODE="$ac_pt_NODE" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_NODE="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_NODE=$ac_cv_path_ac_pt_NODE
if test -n "$ac_pt_NODE"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_NODE" >&5
printf "%s\n" "$ac_pt_NODE" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_NODE" = x; then
    NODE="node"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    NODE=$ac_pt_NODE
  fi
else
  NODE="$ac_cv_path_NODE"
fi

      HOSTRUNNER="$NODE"
      if test "x$host_cpu" = xwasm64
then :
  as_fn_append HOSTRUNNER " --experimental-wasm-memory64"
fi
     ;; #(
  WASI) :

      as_fn_error $? "HOSTRUNNER must be set when cross-compiling to WASI" "$LINENO" 5
     ;; #(
  *) :
    HOSTRUNNER=''
   ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HOSTRUNNER" >&5
printf "%s\n" "$HOSTRUNNER" >&6; }

if test -n "$HOSTRUNNER"; then
    PYTHON_FOR_BUILD="_PYTHON_HOSTRUNNER='$HOSTRUNNER' $PYTHON_FOR_BUILD"
fi

# LIBRARY_DEPS, LINK_PYTHON_OBJS and LINK_PYTHON_DEPS variable
LIBRARY_DEPS='$(PY3LIBRARY) $(EXPORTSYMS)'

LINK_PYTHON_DEPS='$(LIBRARY_DEPS)'
if test "$PY_ENABLE_SHARED" = 1 || test "$enable_framework" ; then
    LIBRARY_DEPS="\$(LDLIBRARY) $LIBRARY_DEPS"
    if test "$STATIC_LIBPYTHON" = 1; then
        LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS"
    fi
    # Link Python program to the shared library
    if test "$enable_static_libpython_for_interpreter" = "yes"; then
        LINK_PYTHON_OBJS='$(LIBRARY_OBJS)'
    else
        LINK_PYTHON_OBJS='$(BLDLIBRARY)'
    fi
else
    if test "$STATIC_LIBPYTHON" = 0; then
        # Build Python needs object files but don't need to build
        # Python static library
        LINK_PYTHON_DEPS="$LIBRARY_DEPS \$(LIBRARY_OBJS)"
    fi
    LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS"
    # Link Python program to object files
    LINK_PYTHON_OBJS='$(LIBRARY_OBJS)'
fi




# ar program

if test -n "$ac_tool_prefix"; then
  for ac_prog in ar aal
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_AR+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
printf "%s\n" "$AR" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


    test -n "$AR" && break
  done
fi
if test -z "$AR"; then
  ac_ct_AR=$AR
  for ac_prog in ar aal
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_AR+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$ac_ct_AR"; then
  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_AR="$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
printf "%s\n" "$ac_ct_AR" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  test -n "$ac_ct_AR" && break
done

  if test "x$ac_ct_AR" = x; then
    AR="ar"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    AR=$ac_ct_AR
  fi
fi


# tweak ARFLAGS only if the user didn't set it on the command line

if test -z "$ARFLAGS"
then
        ARFLAGS="rcs"
fi

case $MACHDEP in
hp*|HP*)
	# install -d does not work on HP-UX
	if test -z "$INSTALL"
	then
		INSTALL="${srcdir}/install-sh -c"
	fi
esac

  # Find a good install program.  We prefer a C program (faster),
# so one script is as good as another.  But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
printf %s "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
if test ${ac_cv_path_install+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    # Account for fact that we put trailing slashes in our PATH walk.
case $as_dir in #((
  ./ | /[cC]/* | \
  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
  /usr/ucb/* ) ;;
  *)
    # OSF1 and SCO ODT 3.0 have their own names for install.
    # Don't use installbsd from OSF since it installs stuff as root
    # by default.
    for ac_prog in ginstall scoinst install; do
      for ac_exec_ext in '' $ac_executable_extensions; do
	if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
	  if test $ac_prog = install &&
	    grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # AIX install.  It has an incompatible calling convention.
	    :
	  elif test $ac_prog = install &&
	    grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # program-specific install script used by HP pwplus--don't use.
	    :
	  else
	    rm -rf conftest.one conftest.two conftest.dir
	    echo one > conftest.one
	    echo two > conftest.two
	    mkdir conftest.dir
	    if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
	      test -s conftest.one && test -s conftest.two &&
	      test -s conftest.dir/conftest.one &&
	      test -s conftest.dir/conftest.two
	    then
	      ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
	      break 3
	    fi
	  fi
	fi
      done
    done
    ;;
esac

  done
IFS=$as_save_IFS

rm -rf conftest.one conftest.two conftest.dir
 ;;
esac
fi
  if test ${ac_cv_path_install+y}; then
    INSTALL=$ac_cv_path_install
  else
    # As a last resort, use the slow shell script.  Don't cache a
    # value for INSTALL within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the value is a relative name.
    INSTALL=$ac_install_sh
  fi
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
printf "%s\n" "$INSTALL" >&6; }

# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'

test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'

test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
printf %s "checking for a race-free mkdir -p... " >&6; }
if test -z "$MKDIR_P"; then
  if test ${ac_cv_path_mkdir+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_prog in mkdir gmkdir; do
	 for ac_exec_ext in '' $ac_executable_extensions; do
	   as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
	   case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
	     'mkdir ('*'coreutils) '* | \
	     *'BusyBox '* | \
	     'mkdir (fileutils) '4.1*)
	       ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
	       break 3;;
	   esac
	 done
       done
  done
IFS=$as_save_IFS
 ;;
esac
fi

  test -d ./--version && rmdir ./--version
  if test ${ac_cv_path_mkdir+y}; then
    MKDIR_P="$ac_cv_path_mkdir -p"
  else
    # As a last resort, use plain mkdir -p,
    # in the hope it doesn't have the bugs of ancient mkdir.
    MKDIR_P='mkdir -p'
  fi
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
printf "%s\n" "$MKDIR_P" >&6; }


# Not every filesystem supports hard links

if test -z "$LN" ; then
	case $ac_sys_system in
		CYGWIN*) LN="ln -s";;
		*) LN=ln;;
	esac
fi

# For calculating the .so ABI tag.


ABIFLAGS=""
ABI_THREAD=""

# Check for --disable-gil
# --disable-gil
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --disable-gil" >&5
printf %s "checking for --disable-gil... " >&6; }
# Check whether --enable-gil was given.
if test ${enable_gil+y}
then :
  enableval=$enable_gil; if test "x$enable_gil" = xyes
then :
  disable_gil=no
else case e in #(
  e) disable_gil=yes ;;
esac
fi
else case e in #(
  e) disable_gil=no
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $disable_gil" >&5
printf "%s\n" "$disable_gil" >&6; }

if test "$disable_gil" = "yes"
then

printf "%s\n" "#define Py_GIL_DISABLED 1" >>confdefs.h

  # Add "t" for "threaded"
  ABIFLAGS="${ABIFLAGS}t"
  ABI_THREAD="t"
fi

# Check for --with-pydebug
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-pydebug" >&5
printf %s "checking for --with-pydebug... " >&6; }

# Check whether --with-pydebug was given.
if test ${with_pydebug+y}
then :
  withval=$with_pydebug;
if test "$withval" != no
then

printf "%s\n" "#define Py_DEBUG 1" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; };
  Py_DEBUG='true'
  ABIFLAGS="${ABIFLAGS}d"
else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }; Py_DEBUG='false'
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi


# Check for --with-trace-refs
# --with-trace-refs
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-trace-refs" >&5
printf %s "checking for --with-trace-refs... " >&6; }

# Check whether --with-trace-refs was given.
if test ${with_trace_refs+y}
then :
  withval=$with_trace_refs;
else case e in #(
  e) with_trace_refs=no
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_trace_refs" >&5
printf "%s\n" "$with_trace_refs" >&6; }

if test "$with_trace_refs" = "yes"
then

printf "%s\n" "#define Py_TRACE_REFS 1" >>confdefs.h

fi

if test "$disable_gil" = "yes" -a "$with_trace_refs" = "yes";
then
  as_fn_error $? "--disable-gil cannot be used with --with-trace-refs" "$LINENO" 5
fi

# Check for --enable-pystats
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-pystats" >&5
printf %s "checking for --enable-pystats... " >&6; }
# Check whether --enable-pystats was given.
if test ${enable_pystats+y}
then :
  enableval=$enable_pystats;
else case e in #(
  e) enable_pystats=no
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_pystats" >&5
printf "%s\n" "$enable_pystats" >&6; }

if test "x$enable_pystats" = xyes
then :


printf "%s\n" "#define Py_STATS 1" >>confdefs.h


fi

# Check for --with-assertions.
# This allows enabling assertions without Py_DEBUG.
assertions='false'
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-assertions" >&5
printf %s "checking for --with-assertions... " >&6; }

# Check whether --with-assertions was given.
if test ${with_assertions+y}
then :
  withval=$with_assertions;
if test "$withval" != no
then
  assertions='true'
fi
fi

if test "$assertions" = 'true'; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
elif test "$Py_DEBUG" = 'true'; then
  assertions='true'
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: implied by --with-pydebug" >&5
printf "%s\n" "implied by --with-pydebug" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

# Enable optimization flags


Py_OPT='false'
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-optimizations" >&5
printf %s "checking for --enable-optimizations... " >&6; }
# Check whether --enable-optimizations was given.
if test ${enable_optimizations+y}
then :
  enableval=$enable_optimizations;
if test "$enableval" != no
then
  Py_OPT='true'
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; };
else
  Py_OPT='false'
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; };
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi


if test "$Py_OPT" = 'true' ; then
  # Check for conflicting CFLAGS=-O0 and --enable-optimizations
  case "$CFLAGS" in
    *-O0*)
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: CFLAGS contains -O0 which may conflict with --enable-optimizations. Consider removing -O0 from CFLAGS for optimal performance." >&5
printf "%s\n" "$as_me: WARNING: CFLAGS contains -O0 which may conflict with --enable-optimizations. Consider removing -O0 from CFLAGS for optimal performance." >&2;}
      ;;
  esac
  # Intentionally not forcing Py_LTO='true' here.  Too many toolchains do not
  # compile working code using it and both test_distutils and test_gdb are
  # broken when you do manage to get a toolchain that works with it.  People
  # who want LTO need to use --with-lto themselves.
  DEF_MAKE_ALL_RULE="profile-opt"
  REQUIRE_PGO="yes"
  DEF_MAKE_RULE="build_all"
  if test "x$ac_cv_gcc_compat" = xyes
then :

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-semantic-interposition" >&5
printf %s "checking whether C compiler accepts -fno-semantic-interposition... " >&6; }
if test ${ax_cv_check_cflags__Werror__fno_semantic_interposition+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -fno-semantic-interposition"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__fno_semantic_interposition=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__fno_semantic_interposition=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__fno_semantic_interposition" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__fno_semantic_interposition" >&6; }
if test "x$ax_cv_check_cflags__Werror__fno_semantic_interposition" = xyes
then :

      CFLAGS_NODIST="$CFLAGS_NODIST -fno-semantic-interposition"
      LDFLAGS_NODIST="$LDFLAGS_NODIST -fno-semantic-interposition"

else case e in #(
  e) : ;;
esac
fi


fi
elif test "$ac_sys_system" = "Emscripten"; then
    DEF_MAKE_ALL_RULE="build_emscripten"
  REQUIRE_PGO="no"
  DEF_MAKE_RULE="all"
elif test "$ac_sys_system" = "WASI"; then
    DEF_MAKE_ALL_RULE="build_wasm"
  REQUIRE_PGO="no"
  DEF_MAKE_RULE="all"
else
  DEF_MAKE_ALL_RULE="build_all"
  REQUIRE_PGO="no"
  DEF_MAKE_RULE="all"
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking PROFILE_TASK" >&5
printf %s "checking PROFILE_TASK... " >&6; }
if test -z "$PROFILE_TASK"
then
	PROFILE_TASK='-m test --pgo --timeout=$(TESTTIMEOUT)'
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PROFILE_TASK" >&5
printf "%s\n" "$PROFILE_TASK" >&6; }

# Make llvm-related checks work on systems where llvm tools are not installed with their
# normal names in the default $PATH (ie: Ubuntu).  They exist under the
# non-suffixed name in their versioned llvm directory.

llvm_bin_dir=''
llvm_path="${PATH}"
if test "${ac_cv_cc_name}" = "clang"
then
  clang_bin=`which clang`
  # Some systems install clang elsewhere as a symlink to the real path
  # which is where the related llvm tools are located.
  if test -L "${clang_bin}"
  then
    clang_dir=`dirname "${clang_bin}"`
    clang_bin=`readlink "${clang_bin}"`
    llvm_bin_dir="${clang_dir}/"`dirname "${clang_bin}"`
    llvm_path="${llvm_path}${PATH_SEPARATOR}${llvm_bin_dir}"
  fi
fi

# Enable LTO flags
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-lto" >&5
printf %s "checking for --with-lto... " >&6; }

# Check whether --with-lto was given.
if test ${with_lto+y}
then :
  withval=$with_lto;
case "$withval" in
    full)
        Py_LTO='true'
        Py_LTO_POLICY='full'
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        ;;
    thin)
        Py_LTO='true'
        Py_LTO_POLICY='thin'
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        ;;
    yes)
        Py_LTO='true'
        Py_LTO_POLICY='default'
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        ;;
    no)
        Py_LTO='false'
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        ;;
    *)
        Py_LTO='false'
        as_fn_error $? "unknown lto option: '$withval'" "$LINENO" 5
        ;;
esac

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi

if test "$Py_LTO" = 'true' ; then
  case $ac_cv_cc_name in
    clang)
      LDFLAGS_NOLTO="-fno-lto"
                  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -flto=thin" >&5
printf %s "checking whether C compiler accepts -flto=thin... " >&6; }
if test ${ax_cv_check_cflags___flto_thin+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS  -flto=thin"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags___flto_thin=yes
else case e in #(
  e) ax_cv_check_cflags___flto_thin=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___flto_thin" >&5
printf "%s\n" "$ax_cv_check_cflags___flto_thin" >&6; }
if test "x$ax_cv_check_cflags___flto_thin" = xyes
then :
  LDFLAGS_NOLTO="-flto=thin"
else case e in #(
  e) LDFLAGS_NOLTO="-flto" ;;
esac
fi


      if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}llvm-ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}llvm-ar; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_LLVM_AR+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $LLVM_AR in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LLVM_AR="$LLVM_AR" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in ${llvm_path}
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_LLVM_AR="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
LLVM_AR=$ac_cv_path_LLVM_AR
if test -n "$LLVM_AR"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LLVM_AR" >&5
printf "%s\n" "$LLVM_AR" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_LLVM_AR"; then
  ac_pt_LLVM_AR=$LLVM_AR
  # Extract the first word of "llvm-ar", so it can be a program name with args.
set dummy llvm-ar; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_LLVM_AR+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_LLVM_AR in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_LLVM_AR="$ac_pt_LLVM_AR" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in ${llvm_path}
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_LLVM_AR="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_LLVM_AR=$ac_cv_path_ac_pt_LLVM_AR
if test -n "$ac_pt_LLVM_AR"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LLVM_AR" >&5
printf "%s\n" "$ac_pt_LLVM_AR" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_LLVM_AR" = x; then
    LLVM_AR="''"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    LLVM_AR=$ac_pt_LLVM_AR
  fi
else
  LLVM_AR="$ac_cv_path_LLVM_AR"
fi


      if test -n "${LLVM_AR}" -a -x "${LLVM_AR}"
      then
        LLVM_AR_FOUND="found"
      else
        LLVM_AR_FOUND="not-found"
      fi
      if test "$ac_sys_system" = "Darwin" -a "${LLVM_AR_FOUND}" = "not-found"
      then
        # The Apple-supplied ar in Xcode or the Command Line Tools is apparently sufficient
        found_llvm_ar=`/usr/bin/xcrun -find ar 2>/dev/null`
        if test -n "${found_llvm_ar}"
        then
          LLVM_AR='/usr/bin/xcrun ar'
          LLVM_AR_FOUND=found
          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: llvm-ar found via xcrun: ${LLVM_AR}" >&5
printf "%s\n" "$as_me: llvm-ar found via xcrun: ${LLVM_AR}" >&6;}
        fi
      fi
      if test $LLVM_AR_FOUND = not-found
      then
        LLVM_PROFR_ERR=yes
        as_fn_error $? "llvm-ar is required for a --with-lto build with clang but could not be found." "$LINENO" 5
      else
        LLVM_AR_ERR=no
      fi
      AR="${LLVM_AR}"
      case $ac_sys_system in
        Darwin*)
          # Any changes made here should be reflected in the GCC+Darwin case below
          if test $Py_LTO_POLICY = default
          then
            # Check that ThinLTO is accepted.
            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -flto=thin" >&5
printf %s "checking whether C compiler accepts -flto=thin... " >&6; }
if test ${ax_cv_check_cflags___flto_thin+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS  -flto=thin"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags___flto_thin=yes
else case e in #(
  e) ax_cv_check_cflags___flto_thin=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___flto_thin" >&5
printf "%s\n" "$ax_cv_check_cflags___flto_thin" >&6; }
if test "x$ax_cv_check_cflags___flto_thin" = xyes
then :

              LTOFLAGS="-flto=thin -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto"
              LTOCFLAGS="-flto=thin"

else case e in #(
  e)
              LTOFLAGS="-flto -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto"
              LTOCFLAGS="-flto"

             ;;
esac
fi

          else
            LTOFLAGS="-flto=${Py_LTO_POLICY} -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto"
            LTOCFLAGS="-flto=${Py_LTO_POLICY}"
          fi
          ;;
        *)
          if test $Py_LTO_POLICY = default
          then
            # Check that ThinLTO is accepted
            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -flto=thin" >&5
printf %s "checking whether C compiler accepts -flto=thin... " >&6; }
if test ${ax_cv_check_cflags___flto_thin+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS  -flto=thin"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags___flto_thin=yes
else case e in #(
  e) ax_cv_check_cflags___flto_thin=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___flto_thin" >&5
printf "%s\n" "$ax_cv_check_cflags___flto_thin" >&6; }
if test "x$ax_cv_check_cflags___flto_thin" = xyes
then :
  LTOFLAGS="-flto=thin"
else case e in #(
  e) LTOFLAGS="-flto" ;;
esac
fi

          else
            LTOFLAGS="-flto=${Py_LTO_POLICY}"
          fi
          ;;
      esac
      ;;
    emcc)
      if test "$Py_LTO_POLICY" != "default"; then
        as_fn_error $? "emcc supports only default lto." "$LINENO" 5
      fi
      LTOFLAGS="-flto"
      LTOCFLAGS="-flto"
      ;;
    gcc)
      if test $Py_LTO_POLICY = thin
      then
        as_fn_error $? "thin lto is not supported under gcc compiler." "$LINENO" 5
      fi
            LDFLAGS_NOLTO="-fno-lto"
      case $ac_sys_system in
        Darwin*)
          LTOFLAGS="-flto -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto"
          LTOCFLAGS="-flto"
          ;;
        *)
          LTOFLAGS="-flto -fuse-linker-plugin -ffat-lto-objects"
          ;;
      esac
      ;;
  esac

  if test "$ac_cv_prog_cc_g" = "yes"
  then
      # bpo-30345: Add -g to LDFLAGS when compiling with LTO
      # to get debug symbols.
      LTOFLAGS="$LTOFLAGS -g"
  fi

  CFLAGS_NODIST="$CFLAGS_NODIST ${LTOCFLAGS-$LTOFLAGS}"
  LDFLAGS_NODIST="$LDFLAGS_NODIST $LTOFLAGS"
fi

# Enable PGO flags.






if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}llvm-profdata", so it can be a program name with args.
set dummy ${ac_tool_prefix}llvm-profdata; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_LLVM_PROFDATA+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $LLVM_PROFDATA in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LLVM_PROFDATA="$LLVM_PROFDATA" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in ${llvm_path}
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_LLVM_PROFDATA="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
LLVM_PROFDATA=$ac_cv_path_LLVM_PROFDATA
if test -n "$LLVM_PROFDATA"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LLVM_PROFDATA" >&5
printf "%s\n" "$LLVM_PROFDATA" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_LLVM_PROFDATA"; then
  ac_pt_LLVM_PROFDATA=$LLVM_PROFDATA
  # Extract the first word of "llvm-profdata", so it can be a program name with args.
set dummy llvm-profdata; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_LLVM_PROFDATA+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_LLVM_PROFDATA in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_LLVM_PROFDATA="$ac_pt_LLVM_PROFDATA" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in ${llvm_path}
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_LLVM_PROFDATA="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_LLVM_PROFDATA=$ac_cv_path_ac_pt_LLVM_PROFDATA
if test -n "$ac_pt_LLVM_PROFDATA"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LLVM_PROFDATA" >&5
printf "%s\n" "$ac_pt_LLVM_PROFDATA" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_LLVM_PROFDATA" = x; then
    LLVM_PROFDATA="''"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    LLVM_PROFDATA=$ac_pt_LLVM_PROFDATA
  fi
else
  LLVM_PROFDATA="$ac_cv_path_LLVM_PROFDATA"
fi


if test -n "${LLVM_PROFDATA}" -a -x "${LLVM_PROFDATA}"
then
  LLVM_PROF_FOUND="found"
else
  LLVM_PROF_FOUND="not-found"
fi
if test "$ac_sys_system" = "Darwin" -a "${LLVM_PROF_FOUND}" = "not-found"
then
  found_llvm_profdata=`/usr/bin/xcrun -find llvm-profdata 2>/dev/null`
  if test -n "${found_llvm_profdata}"
  then
    # llvm-profdata isn't directly in $PATH in some cases.
    # https://apple.stackexchange.com/questions/197053/
    LLVM_PROFDATA='/usr/bin/xcrun llvm-profdata'
    LLVM_PROF_FOUND=found
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: llvm-profdata found via xcrun: ${LLVM_PROFDATA}" >&5
printf "%s\n" "$as_me: llvm-profdata found via xcrun: ${LLVM_PROFDATA}" >&6;}
  fi
fi
LLVM_PROF_ERR=no

case "$ac_cv_cc_name" in
  clang|icx)
    # Any changes made here should be reflected in the GCC+Darwin case below
    PGO_PROF_GEN_FLAG="-fprofile-instr-generate"
    PGO_PROF_USE_FLAG="-fprofile-instr-use=\"\$(shell pwd)/code.profclangd\""
    LLVM_PROF_MERGER=" ${LLVM_PROFDATA} merge -output=\"\$(shell pwd)/code.profclangd\" \"\$(shell pwd)\"/*.profclangr "
    LLVM_PROF_FILE="LLVM_PROFILE_FILE=\"\$(shell pwd)/code-%p.profclangr\""
    if test $LLVM_PROF_FOUND = not-found
    then
      LLVM_PROF_ERR=yes
      if test "${REQUIRE_PGO}" = "yes"
      then
        as_fn_error $? "llvm-profdata is required for a --enable-optimizations build but could not be found." "$LINENO" 5
      fi
    fi
    ;;
  gcc)
    # Check for 32-bit x86 ISA
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for i686" >&5
printf %s "checking for i686... " >&6; }
if test ${ac_cv_i686+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


                #ifdef __i386__
                #  error "i386"
                #endif

int
main (void)
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_i686=no
else case e in #(
  e) ac_cv_i686=yes ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_i686" >&5
printf "%s\n" "$ac_cv_i686" >&6; }

    PGO_PROF_GEN_FLAG="-fprofile-generate"

    # Use -fprofile-update=atomic to fix a random GCC internal error on PGO
    # build (gh-145801) caused by corruption of profile data (.gcda files).
    #
    # gh-148535: On i686, using -fprofile-update=atomic makes the PGO build
    # way slower (up to 47x slower). So far, the GCC internal error on PGO
    # build was not seen on i686, so don't use this flag on i686.
    if test "x$ac_cv_i686" = xno
then :

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fprofile-update=atomic" >&5
printf %s "checking whether C compiler accepts -fprofile-update=atomic... " >&6; }
if test ${ax_cv_check_cflags___fprofile_update_atomic+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS  -fprofile-update=atomic"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags___fprofile_update_atomic=yes
else case e in #(
  e) ax_cv_check_cflags___fprofile_update_atomic=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fprofile_update_atomic" >&5
printf "%s\n" "$ax_cv_check_cflags___fprofile_update_atomic" >&6; }
if test "x$ax_cv_check_cflags___fprofile_update_atomic" = xyes
then :
  PGO_PROF_GEN_FLAG="$PGO_PROF_GEN_FLAG -fprofile-update=atomic"
else case e in #(
  e) : ;;
esac
fi


fi

    PGO_PROF_USE_FLAG="-fprofile-use -fprofile-correction"
    LLVM_PROF_MERGER="true"
    LLVM_PROF_FILE=""
    ;;
  icc)
    PGO_PROF_GEN_FLAG="-prof-gen"
    PGO_PROF_USE_FLAG="-prof-use"
    LLVM_PROF_MERGER="true"
    LLVM_PROF_FILE=""
    ;;
esac

# BOLT optimization. Always configured after PGO since it always runs after PGO.
Py_BOLT='false'
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-bolt" >&5
printf %s "checking for --enable-bolt... " >&6; }
# Check whether --enable-bolt was given.
if test ${enable_bolt+y}
then :
  enableval=$enable_bolt;
if test "$enableval" != no
then
  Py_BOLT='true'
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; };
else
  Py_BOLT='false'
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; };
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi



if test "$Py_BOLT" = 'true' ; then
  PREBOLT_RULE="${DEF_MAKE_ALL_RULE}"
  DEF_MAKE_ALL_RULE="bolt-opt"
  DEF_MAKE_RULE="build_all"

  # -fno-reorder-blocks-and-partition is required for bolt to work.
  # Possibly GCC only.
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-reorder-blocks-and-partition" >&5
printf %s "checking whether C compiler accepts -fno-reorder-blocks-and-partition... " >&6; }
if test ${ax_cv_check_cflags___fno_reorder_blocks_and_partition+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS  -fno-reorder-blocks-and-partition"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags___fno_reorder_blocks_and_partition=yes
else case e in #(
  e) ax_cv_check_cflags___fno_reorder_blocks_and_partition=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fno_reorder_blocks_and_partition" >&5
printf "%s\n" "$ax_cv_check_cflags___fno_reorder_blocks_and_partition" >&6; }
if test "x$ax_cv_check_cflags___fno_reorder_blocks_and_partition" = xyes
then :

      CFLAGS_NODIST="$CFLAGS_NODIST -fno-reorder-blocks-and-partition"

else case e in #(
  e) : ;;
esac
fi


  # These flags are required for bolt to work:
  LDFLAGS_NODIST="$LDFLAGS_NODIST -Wl,--emit-relocs"

  # These flags are required to get good performance from bolt:
  CFLAGS_NODIST="$CFLAGS_NODIST -fno-pie"
  # We want to add these no-pie flags to linking executables but not shared libraries:
  LINKCC="$LINKCC -fno-pie -no-pie"

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}llvm-bolt", so it can be a program name with args.
set dummy ${ac_tool_prefix}llvm-bolt; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_LLVM_BOLT+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $LLVM_BOLT in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LLVM_BOLT="$LLVM_BOLT" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in ${llvm_path}
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_LLVM_BOLT="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
LLVM_BOLT=$ac_cv_path_LLVM_BOLT
if test -n "$LLVM_BOLT"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LLVM_BOLT" >&5
printf "%s\n" "$LLVM_BOLT" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_LLVM_BOLT"; then
  ac_pt_LLVM_BOLT=$LLVM_BOLT
  # Extract the first word of "llvm-bolt", so it can be a program name with args.
set dummy llvm-bolt; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_LLVM_BOLT+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_LLVM_BOLT in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_LLVM_BOLT="$ac_pt_LLVM_BOLT" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in ${llvm_path}
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_LLVM_BOLT="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_LLVM_BOLT=$ac_cv_path_ac_pt_LLVM_BOLT
if test -n "$ac_pt_LLVM_BOLT"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LLVM_BOLT" >&5
printf "%s\n" "$ac_pt_LLVM_BOLT" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_LLVM_BOLT" = x; then
    LLVM_BOLT="''"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    LLVM_BOLT=$ac_pt_LLVM_BOLT
  fi
else
  LLVM_BOLT="$ac_cv_path_LLVM_BOLT"
fi

  if test -n "${LLVM_BOLT}" -a -x "${LLVM_BOLT}"
  then
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"Found llvm-bolt\"" >&5
printf "%s\n" "\"Found llvm-bolt\"" >&6; }
  else
    as_fn_error $? "llvm-bolt is required for a --enable-bolt build but could not be found." "$LINENO" 5
  fi


  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}merge-fdata", so it can be a program name with args.
set dummy ${ac_tool_prefix}merge-fdata; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_MERGE_FDATA+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $MERGE_FDATA in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_MERGE_FDATA="$MERGE_FDATA" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in ${llvm_path}
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_MERGE_FDATA="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
MERGE_FDATA=$ac_cv_path_MERGE_FDATA
if test -n "$MERGE_FDATA"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MERGE_FDATA" >&5
printf "%s\n" "$MERGE_FDATA" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_path_MERGE_FDATA"; then
  ac_pt_MERGE_FDATA=$MERGE_FDATA
  # Extract the first word of "merge-fdata", so it can be a program name with args.
set dummy merge-fdata; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_MERGE_FDATA+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $ac_pt_MERGE_FDATA in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_MERGE_FDATA="$ac_pt_MERGE_FDATA" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in ${llvm_path}
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_MERGE_FDATA="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac ;;
esac
fi
ac_pt_MERGE_FDATA=$ac_cv_path_ac_pt_MERGE_FDATA
if test -n "$ac_pt_MERGE_FDATA"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_MERGE_FDATA" >&5
printf "%s\n" "$ac_pt_MERGE_FDATA" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_pt_MERGE_FDATA" = x; then
    MERGE_FDATA="''"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    MERGE_FDATA=$ac_pt_MERGE_FDATA
  fi
else
  MERGE_FDATA="$ac_cv_path_MERGE_FDATA"
fi

  if test -n "${MERGE_FDATA}" -a -x "${MERGE_FDATA}"
  then
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"Found merge-fdata\"" >&5
printf "%s\n" "\"Found merge-fdata\"" >&6; }
  else
    as_fn_error $? "merge-fdata is required for a --enable-bolt build but could not be found." "$LINENO" 5
  fi
fi


BOLT_BINARIES='$(BUILDPYTHON)'
if test "x$enable_shared" = xyes
then :

  if test "x$enable_static_libpython_for_interpreter" = xno
then :

    BOLT_BINARIES="${BOLT_BINARIES} \$(INSTSONAME)"

fi

fi



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking BOLT_COMMON_FLAGS" >&5
printf %s "checking BOLT_COMMON_FLAGS... " >&6; }
if test -z "${BOLT_COMMON_FLAGS}"
then
  BOLT_COMMON_FLAGS=" -update-debug-sections -skip-funcs=_PyEval_EvalFrameDefault,sre_ucs1_match/1,sre_ucs2_match/1,sre_ucs4_match/1,sre_ucs1_match.lto_priv.0/1,sre_ucs2_match.lto_priv.0/1,sre_ucs4_match.lto_priv.0/1 "

fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking BOLT_INSTRUMENT_FLAGS" >&5
printf %s "checking BOLT_INSTRUMENT_FLAGS... " >&6; }
if test -z "${BOLT_INSTRUMENT_FLAGS}"
then
  BOLT_INSTRUMENT_FLAGS="${BOLT_COMMON_FLAGS}"
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BOLT_INSTRUMENT_FLAGS" >&5
printf "%s\n" "$BOLT_INSTRUMENT_FLAGS" >&6; }


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking BOLT_APPLY_FLAGS" >&5
printf %s "checking BOLT_APPLY_FLAGS... " >&6; }
if test -z "${BOLT_APPLY_FLAGS}"
then
  BOLT_APPLY_FLAGS=" ${BOLT_COMMON_FLAGS} -reorder-blocks=ext-tsp -reorder-functions=cdsort -split-functions -icf=0 -inline-all -split-eh -reorder-functions-use-hot-size -peepholes=none -jump-tables=aggressive -inline-ap -indirect-call-promotion=all -dyno-stats -use-gnu-stack -frame-opt=hot "

fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BOLT_APPLY_FLAGS" >&5
printf "%s\n" "$BOLT_APPLY_FLAGS" >&6; }

# XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be
# merged with this chunk of code?

# Optimizer/debugger flags
# ------------------------
# (The following bit of code is complicated enough - please keep things
# indented properly.  Just pretend you're editing Python code. ;-)

# There are two parallel sets of case statements below, one that checks to
# see if OPT was set and one that does BASECFLAGS setting based upon
# compiler and platform.  BASECFLAGS tweaks need to be made even if the
# user set OPT.

save_CFLAGS=$CFLAGS
CFLAGS="-fstrict-overflow -fno-strict-overflow"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports -fstrict-overflow and -fno-strict-overflow" >&5
printf %s "checking if $CC supports -fstrict-overflow and -fno-strict-overflow... " >&6; }
if test ${ac_cv_cc_supports_fstrict_overflow+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_cc_supports_fstrict_overflow=yes
else case e in #(
  e) ac_cv_cc_supports_fstrict_overflow=no
   ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_supports_fstrict_overflow" >&5
printf "%s\n" "$ac_cv_cc_supports_fstrict_overflow" >&6; }
CFLAGS=$save_CFLAGS

if test "x$ac_cv_cc_supports_fstrict_overflow" = xyes
then :
  STRICT_OVERFLOW_CFLAGS="-fstrict-overflow"
           NO_STRICT_OVERFLOW_CFLAGS="-fno-strict-overflow"
else case e in #(
  e) STRICT_OVERFLOW_CFLAGS=""
           NO_STRICT_OVERFLOW_CFLAGS="" ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-strict-overflow" >&5
printf %s "checking for --with-strict-overflow... " >&6; }

# Check whether --with-strict-overflow was given.
if test ${with_strict_overflow+y}
then :
  withval=$with_strict_overflow;
    if test "x$ac_cv_cc_supports_fstrict_overflow" = xno
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --with-strict-overflow=yes requires a compiler that supports -fstrict-overflow" >&5
printf "%s\n" "$as_me: WARNING: --with-strict-overflow=yes requires a compiler that supports -fstrict-overflow" >&2;}
fi

else case e in #(
  e) with_strict_overflow=no
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_strict_overflow" >&5
printf "%s\n" "$with_strict_overflow" >&6; }

# Check if CC supports -Og optimization level
save_CFLAGS=$CFLAGS
CFLAGS="-Og"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Og optimization level" >&5
printf %s "checking if $CC supports -Og optimization level... " >&6; }
if test ${ac_cv_cc_supports_og+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


int
main (void)
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

      ac_cv_cc_supports_og=yes

else case e in #(
  e)
      ac_cv_cc_supports_og=no
     ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_supports_og" >&5
printf "%s\n" "$ac_cv_cc_supports_og" >&6; }
CFLAGS=$save_CFLAGS

# Optimization messes up debuggers, so turn it off for
# debug builds.
PYDEBUG_CFLAGS="-O0"
if test "x$ac_cv_cc_supports_og" = xyes
then :
  PYDEBUG_CFLAGS="-Og"
fi

# gh-120688: WASI uses -O3 in debug mode to support more recursive calls
if test "$ac_sys_system" = "WASI"; then
    PYDEBUG_CFLAGS="-O3"
fi

# tweak OPT based on compiler and platform, only if the user didn't set
# it on the command line


if test "${OPT-unset}" = "unset"
then
    case $GCC in
    yes)
        if test "${ac_cv_cc_name}" != "clang"
        then
            # bpo-30104: disable strict aliasing to compile correctly dtoa.c,
            # see Makefile.pre.in for more information
            CFLAGS_ALIASING="-fno-strict-aliasing"
        fi

	case $ac_cv_prog_cc_g in
	yes)
	    if test "$Py_DEBUG" = 'true' ; then
		OPT="-g $PYDEBUG_CFLAGS -Wall"
	    else
		OPT="-g -O3 -Wall"
	    fi
	    ;;
	*)
	    OPT="-O3 -Wall"
	    ;;
	esac

	case $ac_sys_system in
	    SCO_SV*) OPT="$OPT -m486 -DSCO5"
	    ;;
        esac
	;;

    *)
	OPT="-O"
	;;
    esac
fi

# WASM flags
case $ac_sys_system in #(
  Emscripten) :

            if test "x$Py_DEBUG" = xyes
then :
  wasm_debug=yes
else case e in #(
  e) wasm_debug=no ;;
esac
fi

        as_fn_append LINKFORSHARED " -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=20971520"

        as_fn_append LDFLAGS_NODIST " -sWASM_BIGINT"

        as_fn_append LINKFORSHARED " -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js"
    as_fn_append LINKFORSHARED " -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV,HEAPU32,TTY,ERRNO_CODES"
    as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,_PyGILState_GetThisThreadState,__PyEM_EMSCRIPTEN_TRAMPOLINE_OFFSET"
    as_fn_append LINKFORSHARED " -sSTACK_SIZE=5MB"
        as_fn_append LINKFORSHARED " -sTEXTDECODER=2"

    if test "x$enable_wasm_dynamic_linking" = xyes
then :

      as_fn_append LINKFORSHARED " -sMAIN_MODULE"

fi

    if test "x$enable_wasm_pthreads" = xyes
then :

      as_fn_append CFLAGS_NODIST " -pthread"
      as_fn_append LDFLAGS_NODIST " -sUSE_PTHREADS"
      as_fn_append LINKFORSHARED " -sPROXY_TO_PTHREAD"

fi
        as_fn_append LDFLAGS_NODIST " -sEXIT_RUNTIME"
    WASM_LINKFORSHARED_DEBUG="-gseparate-dwarf --emit-symbol-map"

    if test "x$wasm_debug" = xyes
then :

      as_fn_append LDFLAGS_NODIST " -sASSERTIONS"
      as_fn_append LINKFORSHARED " $WASM_LINKFORSHARED_DEBUG"

else case e in #(
  e)
      as_fn_append LINKFORSHARED " -O2 -g0"
     ;;
esac
fi
   ;; #(
  WASI) :


printf "%s\n" "#define _WASI_EMULATED_SIGNAL 1" >>confdefs.h


printf "%s\n" "#define _WASI_EMULATED_GETPID 1" >>confdefs.h


printf "%s\n" "#define _WASI_EMULATED_PROCESS_CLOCKS 1" >>confdefs.h

    LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks"
    echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h

    if test "x$enable_wasm_pthreads" = xyes
then :

      # Note: update CFLAGS because ac_compile/ac_link needs this too.
      # without this, configure fails to find pthread_create, sem_init,
      # etc because they are only available in the sysroot for
      # wasm32-wasi-threads.
      # Note: wasi-threads requires --import-memory.
      # Note: wasi requires --export-memory.
      # Note: --export-memory is implicit unless --import-memory is given
      # Note: this requires LLVM >= 16.
      as_fn_append CFLAGS " -target wasm32-wasi-threads -pthread"
      as_fn_append CFLAGS_NODIST " -target wasm32-wasi-threads -pthread"
      as_fn_append LDFLAGS_NODIST " -target wasm32-wasi-threads -pthread"
      as_fn_append LDFLAGS_NODIST " -Wl,--import-memory"
      as_fn_append LDFLAGS_NODIST " -Wl,--export-memory"
      as_fn_append LDFLAGS_NODIST " -Wl,--max-memory=10485760"

fi

                as_fn_append LDFLAGS_NODIST " -z stack-size=16777216 -Wl,--stack-first -Wl,--initial-memory=41943040"

 ;; #(
  *) :
     ;;
esac

if test "$ac_sys_system" = "Linux" -a "$cross_compiling" = no; then
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread stack size" >&5
printf %s "checking for thread stack size... " >&6; }
if test ${ac_cv_thread_stack_size+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    cat > conftest.c <<EOF
#include <pthread.h>

int main()
{
    pthread_attr_t attrs;
    size_t size;

    int rc = pthread_attr_init(&attrs);
    if (rc != 0) {
        return 2;
    }

    rc = pthread_attr_getstacksize(&attrs, &size);
    if (rc != 0) {
        return 2;
    }

    if (size < 1024 * 1024) {
        return 1;
    }
    return 0;
}
EOF

    ac_cv_thread_stack_size=unknown
    if $CC -pthread $CFLAGS conftest.c -o conftest &>/dev/null; then
        ./conftest &>/dev/null
        exitcode=$?
        if test $exitcode -eq 1; then
            ac_cv_thread_stack_size=1048576
        elif test $exitcode -eq 0; then
            ac_cv_thread_stack_size="default"
        fi
    fi
    rm -f conftest.c conftest
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_thread_stack_size" >&5
printf "%s\n" "$ac_cv_thread_stack_size" >&6; }

    if test "$ac_cv_thread_stack_size" != "default" -a "$ac_cv_thread_stack_size" != "unknown"; then
        LDFLAGS="$LDFLAGS -Wl,-z,stack-size=$ac_cv_thread_stack_size"
        # Stack size used by Python/ceval.c to set Py_C_STACK_SIZE

printf "%s\n" "#define _Py_LINKER_THREAD_STACK_SIZE $ac_cv_thread_stack_size" >>confdefs.h

    fi
fi

case $enable_wasm_dynamic_linking in #(
  yes) :
    ac_cv_func_dlopen=yes ;; #(
  no) :
    ac_cv_func_dlopen=no ;; #(
  missing) :

 ;; #(
  *) :
     ;;
esac









# The -arch flags for universal builds on macOS
UNIVERSAL_ARCH_FLAGS=




# tweak BASECFLAGS based on compiler and platform
if test "x$with_strict_overflow" = xyes
then :
  BASECFLAGS="$BASECFLAGS $STRICT_OVERFLOW_CFLAGS"
else case e in #(
  e) BASECFLAGS="$BASECFLAGS $NO_STRICT_OVERFLOW_CFLAGS" ;;
esac
fi

# Enable flags that warn and protect for potential security vulnerabilities.
# These flags should be enabled by default for all builds.

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-safety" >&5
printf %s "checking for --enable-safety... " >&6; }
# Check whether --enable-safety was given.
if test ${enable_safety+y}
then :
  enableval=$enable_safety; if test "x$disable_safety" = xyes
then :
  enable_safety=no
else case e in #(
  e) enable_safety=yes ;;
esac
fi
else case e in #(
  e) enable_safety=no ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_safety" >&5
printf "%s\n" "$enable_safety" >&6; }

if test "$enable_safety" = "yes"
then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstack-protector-strong" >&5
printf %s "checking whether C compiler accepts -fstack-protector-strong... " >&6; }
if test ${ax_cv_check_cflags__Werror__fstack_protector_strong+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -fstack-protector-strong"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__fstack_protector_strong=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__fstack_protector_strong=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__fstack_protector_strong" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__fstack_protector_strong" >&6; }
if test "x$ax_cv_check_cflags__Werror__fstack_protector_strong" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -fstack-protector-strong"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: -fstack-protector-strong not supported" >&5
printf "%s\n" "$as_me: WARNING: -fstack-protector-strong not supported" >&2;} ;;
esac
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wtrampolines" >&5
printf %s "checking whether C compiler accepts -Wtrampolines... " >&6; }
if test ${ax_cv_check_cflags__Werror__Wtrampolines+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -Wtrampolines"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__Wtrampolines=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__Wtrampolines=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__Wtrampolines" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__Wtrampolines" >&6; }
if test "x$ax_cv_check_cflags__Werror__Wtrampolines" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wtrampolines"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: -Wtrampolines not supported" >&5
printf "%s\n" "$as_me: WARNING: -Wtrampolines not supported" >&2;} ;;
esac
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wimplicit-fallthrough" >&5
printf %s "checking whether C compiler accepts -Wimplicit-fallthrough... " >&6; }
if test ${ax_cv_check_cflags__Werror__Wimplicit_fallthrough+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -Wimplicit-fallthrough"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__Wimplicit_fallthrough=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__Wimplicit_fallthrough=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__Wimplicit_fallthrough" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__Wimplicit_fallthrough" >&6; }
if test "x$ax_cv_check_cflags__Werror__Wimplicit_fallthrough" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wimplicit-fallthrough"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: -Wimplicit-fallthrough not supported" >&5
printf "%s\n" "$as_me: WARNING: -Wimplicit-fallthrough not supported" >&2;} ;;
esac
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Werror=format-security" >&5
printf %s "checking whether C compiler accepts -Werror=format-security... " >&6; }
if test ${ax_cv_check_cflags__Werror__Werror_format_security+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -Werror=format-security"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__Werror_format_security=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__Werror_format_security=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__Werror_format_security" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__Werror_format_security" >&6; }
if test "x$ax_cv_check_cflags__Werror__Werror_format_security" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Werror=format-security"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: -Werror=format-security not supported" >&5
printf "%s\n" "$as_me: WARNING: -Werror=format-security not supported" >&2;} ;;
esac
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wbidi-chars=any" >&5
printf %s "checking whether C compiler accepts -Wbidi-chars=any... " >&6; }
if test ${ax_cv_check_cflags__Werror__Wbidi_chars_any+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -Wbidi-chars=any"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__Wbidi_chars_any=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__Wbidi_chars_any=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__Wbidi_chars_any" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__Wbidi_chars_any" >&6; }
if test "x$ax_cv_check_cflags__Werror__Wbidi_chars_any" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wbidi-chars=any"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: -Wbidi-chars=any not supported" >&5
printf "%s\n" "$as_me: WARNING: -Wbidi-chars=any not supported" >&2;} ;;
esac
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wall" >&5
printf %s "checking whether C compiler accepts -Wall... " >&6; }
if test ${ax_cv_check_cflags__Werror__Wall+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -Wall"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__Wall=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__Wall=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__Wall" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__Wall" >&6; }
if test "x$ax_cv_check_cflags__Werror__Wall" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wall"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: -Wall not supported" >&5
printf "%s\n" "$as_me: WARNING: -Wall not supported" >&2;} ;;
esac
fi

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-slower-safety" >&5
printf %s "checking for --enable-slower-safety... " >&6; }
# Check whether --enable-slower-safety was given.
if test ${enable_slower_safety+y}
then :
  enableval=$enable_slower_safety; if test "x$disable_slower_safety" = xyes
then :
  enable_slower_safety=no
else case e in #(
  e) enable_slower_safety=yes ;;
esac
fi
else case e in #(
  e) enable_slower_safety=no ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_slower_safety" >&5
printf "%s\n" "$enable_slower_safety" >&6; }

if test "$enable_slower_safety" = "yes"
then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -D_FORTIFY_SOURCE=3" >&5
printf %s "checking whether C compiler accepts -D_FORTIFY_SOURCE=3... " >&6; }
if test ${ax_cv_check_cflags__Werror__D_FORTIFY_SOURCE_3+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -D_FORTIFY_SOURCE=3"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__D_FORTIFY_SOURCE_3=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__D_FORTIFY_SOURCE_3=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__D_FORTIFY_SOURCE_3" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__D_FORTIFY_SOURCE_3" >&6; }
if test "x$ax_cv_check_cflags__Werror__D_FORTIFY_SOURCE_3" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: -D_FORTIFY_SOURCE=3 not supported" >&5
printf "%s\n" "$as_me: WARNING: -D_FORTIFY_SOURCE=3 not supported" >&2;} ;;
esac
fi

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build with frame pointers" >&5
printf %s "checking whether to build with frame pointers... " >&6; }

# Check whether --with-frame-pointers was given.
if test ${with_frame_pointers+y}
then :
  withval=$with_frame_pointers;
else case e in #(
  e) with_frame_pointers=yes ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_frame_pointers" >&5
printf "%s\n" "$with_frame_pointers" >&6; }

if test "x$ac_cv_gcc_compat" = xyes
then :

                    frame_pointer_cflags=
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-omit-frame-pointer" >&5
printf %s "checking whether C compiler accepts -fno-omit-frame-pointer... " >&6; }
if test ${ax_cv_check_cflags__Werror__fno_omit_frame_pointer+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -fno-omit-frame-pointer"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__fno_omit_frame_pointer=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__fno_omit_frame_pointer=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__fno_omit_frame_pointer" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__fno_omit_frame_pointer" >&6; }
if test "x$ax_cv_check_cflags__Werror__fno_omit_frame_pointer" = xyes
then :

      frame_pointer_cflags="-fno-omit-frame-pointer"
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mno-omit-leaf-frame-pointer" >&5
printf %s "checking whether C compiler accepts -mno-omit-leaf-frame-pointer... " >&6; }
if test ${ax_cv_check_cflags__Werror__mno_omit_leaf_frame_pointer+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -mno-omit-leaf-frame-pointer"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__mno_omit_leaf_frame_pointer=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__mno_omit_leaf_frame_pointer=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__mno_omit_leaf_frame_pointer" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__mno_omit_leaf_frame_pointer" >&6; }
if test "x$ax_cv_check_cflags__Werror__mno_omit_leaf_frame_pointer" = xyes
then :

        frame_pointer_cflags="$frame_pointer_cflags -mno-omit-leaf-frame-pointer"

else case e in #(
  e) : ;;
esac
fi

      case $host_cpu in #(
  arm|armv*) :

                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -marm" >&5
printf %s "checking whether C compiler accepts -marm... " >&6; }
if test ${ax_cv_check_cflags__Werror__marm+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -marm"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__marm=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__marm=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__marm" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__marm" >&6; }
if test "x$ax_cv_check_cflags__Werror__marm" = xyes
then :

          frame_pointer_cflags="$frame_pointer_cflags -marm"

else case e in #(
  e) : ;;
esac
fi

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mno-thumb" >&5
printf %s "checking whether C compiler accepts -mno-thumb... " >&6; }
if test ${ax_cv_check_cflags__Werror__mno_thumb+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -mno-thumb"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__mno_thumb=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__mno_thumb=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__mno_thumb" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__mno_thumb" >&6; }
if test "x$ax_cv_check_cflags__Werror__mno_thumb" = xyes
then :

          frame_pointer_cflags="$frame_pointer_cflags -mno-thumb"

else case e in #(
  e) : ;;
esac
fi

       ;; #(
  *) :
     ;;
esac
      case $host_cpu in #(
  powerpc64le) :

        frame_pointer_cflags=""
       ;; #(
  *) :
     ;;
esac
      case $host_cpu in #(
  s390*) :

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mbackchain" >&5
printf %s "checking whether C compiler accepts -mbackchain... " >&6; }
if test ${ax_cv_check_cflags__Werror__mbackchain+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -mbackchain"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__mbackchain=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__mbackchain=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__mbackchain" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__mbackchain" >&6; }
if test "x$ax_cv_check_cflags__Werror__mbackchain" = xyes
then :

                    frame_pointer_cflags="-mbackchain"

else case e in #(
  e) : ;;
esac
fi

       ;; #(
  *) :
     ;;
esac

else case e in #(
  e) : ;;
esac
fi

    if test -n "$frame_pointer_cflags" && test "x$with_frame_pointers" != xno; then
      BASECFLAGS="$frame_pointer_cflags $BASECFLAGS"

printf "%s\n" "#define _Py_WITH_FRAME_POINTERS 1" >>confdefs.h

    fi

    CFLAGS_NODIST="$CFLAGS_NODIST -std=c11"



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Wextra" >&5
printf %s "checking if we can add -Wextra... " >&6; }
if test ${ac_cv_enable_extra_warning+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    py_cflags=$CFLAGS
    as_fn_append CFLAGS " -Wextra -Werror"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_enable_extra_warning=yes
else case e in #(
  e) ac_cv_enable_extra_warning=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    CFLAGS=$py_cflags
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_extra_warning" >&5
printf "%s\n" "$ac_cv_enable_extra_warning" >&6; }


    if test "x$ac_cv_enable_extra_warning" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wextra"
fi

    # Python doesn't violate C99 aliasing rules, but older versions of
    # GCC produce warnings for legal Python code.  Enable
    # -fno-strict-aliasing on versions of GCC that support but produce
    # warnings.  See Issue3326
     ac_save_cc="$CC"
     CC="$CC -fno-strict-aliasing"
     save_CFLAGS="$CFLAGS"
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts and needs -fno-strict-aliasing" >&5
printf %s "checking whether $CC accepts and needs -fno-strict-aliasing... " >&6; }
if test ${ac_cv_no_strict_aliasing+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


int
main (void)
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

	   CC="$ac_save_cc -fstrict-aliasing"
           CFLAGS="$CFLAGS -Werror -Wstrict-aliasing"
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

	       void f(int **x) {}
int
main (void)
{
double *x; f((int **) &x);
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

	       ac_cv_no_strict_aliasing=no

else case e in #(
  e)
               ac_cv_no_strict_aliasing=yes
	      ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

else case e in #(
  e)
	   ac_cv_no_strict_aliasing=no
	  ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_no_strict_aliasing" >&5
printf "%s\n" "$ac_cv_no_strict_aliasing" >&6; }
     CFLAGS="$save_CFLAGS"
     CC="$ac_save_cc"
    if test "x$ac_cv_no_strict_aliasing" = xyes
then :
  BASECFLAGS="$BASECFLAGS -fno-strict-aliasing"
fi

    # ICC doesn't recognize the option, but only emits a warning
    ## XXX does it emit an unused result warning and can it be disabled?
    case "$ac_cv_cc_name" in #(
  icc) :
    ac_cv_disable_unused_result_warning=no


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can disable $CC unused-result warning" >&5
printf %s "checking if we can disable $CC unused-result warning... " >&6; }
if test ${ac_cv_disable_unused_result_warning+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    py_cflags=$CFLAGS
    as_fn_append CFLAGS " -Wunused-result -Werror"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_disable_unused_result_warning=yes
else case e in #(
  e) ac_cv_disable_unused_result_warning=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    CFLAGS=$py_cflags
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_disable_unused_result_warning" >&5
printf "%s\n" "$ac_cv_disable_unused_result_warning" >&6; }

 ;; #(
  *) :
     ;;
esac
    if test "x$ac_cv_disable_unused_result_warning" = xyes
then :
  BASECFLAGS="$BASECFLAGS -Wno-unused-result"
               CFLAGS_NODIST="$CFLAGS_NODIST -Wno-unused-result"
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can disable $CC unused-parameter warning" >&5
printf %s "checking if we can disable $CC unused-parameter warning... " >&6; }
if test ${ac_cv_disable_unused_parameter_warning+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    py_cflags=$CFLAGS
    as_fn_append CFLAGS " -Wunused-parameter -Werror"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_disable_unused_parameter_warning=yes
else case e in #(
  e) ac_cv_disable_unused_parameter_warning=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    CFLAGS=$py_cflags
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_disable_unused_parameter_warning" >&5
printf "%s\n" "$ac_cv_disable_unused_parameter_warning" >&6; }


    if test "x$ac_cv_disable_unused_parameter_warning" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wno-unused-parameter"
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can disable $CC int-conversion warning" >&5
printf %s "checking if we can disable $CC int-conversion warning... " >&6; }
if test ${ac_cv_disable_int_conversion_warning+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    py_cflags=$CFLAGS
    as_fn_append CFLAGS " -Wint-conversion -Werror"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_disable_int_conversion_warning=yes
else case e in #(
  e) ac_cv_disable_int_conversion_warning=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    CFLAGS=$py_cflags
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_disable_int_conversion_warning" >&5
printf "%s\n" "$ac_cv_disable_int_conversion_warning" >&6; }


    if test "x$ac_cv_disable_int_conversion" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wno-int-conversion"
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can disable $CC missing-field-initializers warning" >&5
printf %s "checking if we can disable $CC missing-field-initializers warning... " >&6; }
if test ${ac_cv_disable_missing_field_initializers_warning+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    py_cflags=$CFLAGS
    as_fn_append CFLAGS " -Wmissing-field-initializers -Werror"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_disable_missing_field_initializers_warning=yes
else case e in #(
  e) ac_cv_disable_missing_field_initializers_warning=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    CFLAGS=$py_cflags
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_disable_missing_field_initializers_warning" >&5
printf "%s\n" "$ac_cv_disable_missing_field_initializers_warning" >&6; }


    if test "x$ac_cv_disable_missing_field_initializers_warning" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wno-missing-field-initializers"
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can enable $CC sign-compare warning" >&5
printf %s "checking if we can enable $CC sign-compare warning... " >&6; }
if test ${ac_cv_enable_sign_compare_warning+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    py_cflags=$CFLAGS
    as_fn_append CFLAGS " -Wsign-compare -Werror"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_enable_sign_compare_warning=yes
else case e in #(
  e) ac_cv_enable_sign_compare_warning=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    CFLAGS=$py_cflags
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_sign_compare_warning" >&5
printf "%s\n" "$ac_cv_enable_sign_compare_warning" >&6; }


    if test "x$ac_cv_enable_sign_compare_warning" = xyes
then :
  BASECFLAGS="$BASECFLAGS -Wsign-compare"
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can enable $CC unreachable-code warning" >&5
printf %s "checking if we can enable $CC unreachable-code warning... " >&6; }
if test ${ac_cv_enable_unreachable_code_warning+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    py_cflags=$CFLAGS
    as_fn_append CFLAGS " -Wunreachable-code -Werror"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_enable_unreachable_code_warning=yes
else case e in #(
  e) ac_cv_enable_unreachable_code_warning=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    CFLAGS=$py_cflags
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_unreachable_code_warning" >&5
printf "%s\n" "$ac_cv_enable_unreachable_code_warning" >&6; }


    # Don't enable unreachable code warning in debug mode, since it usually
    # results in non-standard code paths.
    # Issue #24324: Unfortunately, the unreachable code warning does not work
    # correctly on gcc and has been silently removed from the compiler.
    # It is supported on clang but on OS X systems gcc may be an alias
    # for clang.  Try to determine if the compiler is not really gcc and,
    # if so, only then enable the warning.
    if test $ac_cv_enable_unreachable_code_warning = yes && \
        test "$Py_DEBUG" != "true" && \
        test -z "`$CC --version 2>/dev/null | grep 'Free Software Foundation'`"
    then
      BASECFLAGS="$BASECFLAGS -Wunreachable-code"
    else
      ac_cv_enable_unreachable_code_warning=no
    fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can enable $CC strict-prototypes warning" >&5
printf %s "checking if we can enable $CC strict-prototypes warning... " >&6; }
if test ${ac_cv_enable_strict_prototypes_warning+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    py_cflags=$CFLAGS
    as_fn_append CFLAGS " -Wstrict-prototypes -Werror"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_enable_strict_prototypes_warning=yes
else case e in #(
  e) ac_cv_enable_strict_prototypes_warning=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    CFLAGS=$py_cflags
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_strict_prototypes_warning" >&5
printf "%s\n" "$ac_cv_enable_strict_prototypes_warning" >&6; }


    if test "x$ac_cv_enable_strict_prototypes_warning" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Wstrict-prototypes"
fi

     ac_save_cc="$CC"
     CC="$CC -Werror=implicit-function-declaration"
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can make implicit function declaration an error in $CC" >&5
printf %s "checking if we can make implicit function declaration an error in $CC... " >&6; }
if test ${ac_cv_enable_implicit_function_declaration_error+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


int
main (void)
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

           ac_cv_enable_implicit_function_declaration_error=yes

else case e in #(
  e)
           ac_cv_enable_implicit_function_declaration_error=no
	  ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_implicit_function_declaration_error" >&5
printf "%s\n" "$ac_cv_enable_implicit_function_declaration_error" >&6; }
     CC="$ac_save_cc"

    if test "x$ac_cv_enable_implicit_function_declaration_error" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -Werror=implicit-function-declaration"
fi

     ac_save_cc="$CC"
     CC="$CC -fvisibility=hidden"
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can use visibility in $CC" >&5
printf %s "checking if we can use visibility in $CC... " >&6; }
if test ${ac_cv_enable_visibility+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


int
main (void)
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

           ac_cv_enable_visibility=yes

else case e in #(
  e)
           ac_cv_enable_visibility=no
	  ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_visibility" >&5
printf "%s\n" "$ac_cv_enable_visibility" >&6; }
     CC="$ac_save_cc"

    if test "x$ac_cv_enable_visibility" = xyes
then :
  CFLAGS_NODIST="$CFLAGS_NODIST -fvisibility=hidden"
fi

    # if using gcc on alpha, use -mieee to get (near) full IEEE 754
    # support.  Without this, treatment of subnormals doesn't follow
    # the standard.
    case $host in
         alpha*)
                BASECFLAGS="$BASECFLAGS -mieee"
                ;;
    esac

    case $ac_sys_system in
	SCO_SV*)
	    BASECFLAGS="$BASECFLAGS -m486 -DSCO5"
	    ;;

    Darwin*)
        # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd
        # used to be here, but non-Apple gcc doesn't accept them.
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5
printf %s "checking which compiler should be used... " >&6; }
        case "${UNIVERSALSDK}" in
        */MacOSX10.4u.sdk)
            # Build using 10.4 SDK, force usage of gcc when the
            # compiler is gcc, otherwise the user will get very
            # confusing error messages when building on OSX 10.6
            CC=gcc-4.0
            CPP=cpp-4.0
            ;;
        esac
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
printf "%s\n" "$CC" >&6; }

        # Error on unguarded use of new symbols, which will fail at runtime for
        # users on older versions of macOS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wunguarded-availability" >&5
printf %s "checking whether C compiler accepts -Wunguarded-availability... " >&6; }
if test ${ax_cv_check_cflags__Werror__Wunguarded_availability+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -Wunguarded-availability"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__Wunguarded_availability=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__Wunguarded_availability=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__Wunguarded_availability" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__Wunguarded_availability" >&6; }
if test "x$ax_cv_check_cflags__Werror__Wunguarded_availability" = xyes
then :
  as_fn_append CFLAGS_NODIST " -Werror=unguarded-availability"
else case e in #(
  e) : ;;
esac
fi


        LIPO_INTEL64_FLAGS=""
        if test "${enable_universalsdk}"
        then
            case "$UNIVERSAL_ARCHS" in
            32-bit)
               UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386"
               LIPO_32BIT_FLAGS=""
               ARCH_RUN_32BIT=""
               ARCH_TRIPLES=`echo {ppc,i386}-apple-darwin`
               ;;
            64-bit)
               UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64"
               LIPO_32BIT_FLAGS=""
               ARCH_RUN_32BIT="true"
               ARCH_TRIPLES=`echo {ppc64,x86_64}-apple-darwin`
               ;;
            all)
               UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64"
               LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386"
               ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
               ARCH_TRIPLES=`echo {i386,ppc,ppc64,x86_64}-apple-darwin`
               ;;
            universal2)
               UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64"
               LIPO_32BIT_FLAGS=""
               LIPO_INTEL64_FLAGS="-extract x86_64"
               ARCH_RUN_32BIT="true"
               ARCH_TRIPLES=`echo {aarch64,x86_64}-apple-darwin`
               ;;
            intel)
               UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64"
               LIPO_32BIT_FLAGS="-extract i386"
               ARCH_RUN_32BIT="/usr/bin/arch -i386"
               ARCH_TRIPLES=`echo {i386,x86_64}-apple-darwin`
               ;;
            intel-32)
               UNIVERSAL_ARCH_FLAGS="-arch i386"
               LIPO_32BIT_FLAGS=""
               ARCH_RUN_32BIT=""
               ARCH_TRIPLES=i386-apple-darwin
               ;;
            intel-64)
               UNIVERSAL_ARCH_FLAGS="-arch x86_64"
               LIPO_32BIT_FLAGS=""
               ARCH_RUN_32BIT="true"
               ARCH_TRIPLES=x86_64-apple-darwin
               ;;
            3-way)
               UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64"
               LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386"
               ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
               ARCH_TRIPLES=`echo {i386,ppc,x86_64}-apple-darwin`
               ;;
            *)
               as_fn_error $? "proper usage is --with-universal-arch=universal2|32-bit|64-bit|all|intel|3-way" "$LINENO" 5
               ;;
            esac

            if test "${UNIVERSALSDK}" != "/"
            then
                CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}"
                LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}"
                CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}"
            else
                CFLAGS="${UNIVERSAL_ARCH_FLAGS} ${CFLAGS}"
                LDFLAGS="${UNIVERSAL_ARCH_FLAGS} ${LDFLAGS}"
            fi
        fi

        # Calculate an appropriate deployment target for this build:
        # The deployment target value is used explicitly to enable certain
        # features are enabled (such as builtin libedit support for readline)
        # through the use of Apple's Availability Macros and is used as a
        # component of the string returned by distutils.get_platform().
        #
        # Use the value from:
        # 1. the MACOSX_DEPLOYMENT_TARGET environment variable if specified
        # 2. the operating system version of the build machine if >= 10.6
        # 3. If running on OS X 10.3 through 10.5, use the legacy tests
        #       below to pick either 10.3, 10.4, or 10.5 as the target.
        # 4. If we are running on OS X 10.2 or earlier, good luck!

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which MACOSX_DEPLOYMENT_TARGET to use" >&5
printf %s "checking which MACOSX_DEPLOYMENT_TARGET to use... " >&6; }
        cur_target_major=`sw_vers -productVersion | \
                sed 's/\([0-9]*\)\.\([0-9]*\).*/\1/'`
        cur_target_minor=`sw_vers -productVersion | \
                sed 's/\([0-9]*\)\.\([0-9]*\).*/\2/'`
        cur_target="${cur_target_major}.${cur_target_minor}"
        if test ${cur_target_major} -eq 10 && \
           test ${cur_target_minor} -ge 3 && \
           test ${cur_target_minor} -le 5
        then
            # OS X 10.3 through 10.5
            cur_target=10.3
            if test ${enable_universalsdk}
            then
                case "$UNIVERSAL_ARCHS" in
                all|3-way|intel|64-bit)
                    # These configurations were first supported in 10.5
                    cur_target='10.5'
                    ;;
                esac
            else
                if test `/usr/bin/arch` = "i386"
                then
                    # 10.4 was the first release to support Intel archs
                    cur_target="10.4"
                fi
            fi
        fi
        CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}}

        # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the
        # environment with a value that is the same as what we'll use
        # in the Makefile to ensure that we'll get the same compiler
        # environment during configure and build time.
        MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET"
        export MACOSX_DEPLOYMENT_TARGET
        EXPORT_MACOSX_DEPLOYMENT_TARGET=''
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MACOSX_DEPLOYMENT_TARGET" >&5
printf "%s\n" "$MACOSX_DEPLOYMENT_TARGET" >&6; }

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if specified universal architectures work" >&5
printf %s "checking if specified universal architectures work... " >&6; }
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
int
main (void)
{
printf("%d", 42);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
             as_fn_error $? "check config.log and use the '--with-universal-archs' option" "$LINENO" 5
         ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext

        # end of Darwin* tests
        ;;
    esac

else case e in #(
  e)
    case $ac_sys_system in
    OpenUNIX*|UnixWare*)
	BASECFLAGS="$BASECFLAGS -K pentium,host,inline,loop_unroll,alloca "
	;;
    SCO_SV*)
	BASECFLAGS="$BASECFLAGS -belf -Ki486 -DSCO5"
	;;
    esac
 ;;
esac
fi

# Check for --enable-experimental-jit:
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-experimental-jit" >&5
printf %s "checking for --enable-experimental-jit... " >&6; }
# Check whether --enable-experimental-jit was given.
if test ${enable_experimental_jit+y}
then :
  enableval=$enable_experimental_jit;
else case e in #(
  e) enable_experimental_jit=no ;;
esac
fi

case $enable_experimental_jit in
  no)              jit_flags="";          tier2_flags="" ;;
  yes)             jit_flags="-D_Py_JIT"; tier2_flags="-D_Py_TIER2=1" ;;
  yes-off)         jit_flags="-D_Py_JIT"; tier2_flags="-D_Py_TIER2=3" ;;
  interpreter)     jit_flags="";          tier2_flags="-D_Py_TIER2=4" ;;
  interpreter-off) jit_flags="";          tier2_flags="-D_Py_TIER2=6" ;;  # Secret option
  *) as_fn_error $? "invalid argument: --enable-experimental-jit=$enable_experimental_jit; expected no|yes|yes-off|interpreter" "$LINENO" 5 ;;
esac
if ${tier2_flags:+false} :
then :

else case e in #(
  e) as_fn_append CFLAGS_NODIST " $tier2_flags" ;;
esac
fi
if ${jit_flags:+false} :
then :

else case e in #(
  e) as_fn_append CFLAGS_NODIST " $jit_flags"
           REGEN_JIT_COMMAND="\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir . --cflags=\"$CFLAGS_JIT\" --llvm-version=\"$LLVM_VERSION\" --llvm-tools-install-dir=\"$LLVM_TOOLS_INSTALL_DIR\""
           if test "x$Py_DEBUG" = xtrue
then :
  as_fn_append REGEN_JIT_COMMAND " --debug"
fi ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $tier2_flags $jit_flags" >&5
printf "%s\n" "$tier2_flags $jit_flags" >&6; }

if test "$disable_gil" = "yes" -a "$enable_experimental_jit" != "no"; then
  # GH-133171: This configuration builds the JIT but never actually uses it,
  # which is surprising (and strictly worse than not building it at all):
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --enable-experimental-jit does not work correctly with --disable-gil." >&5
printf "%s\n" "$as_me: WARNING: --enable-experimental-jit does not work correctly with --disable-gil." >&2;}
fi

case "$ac_cv_cc_name" in
mpicc)
    CFLAGS_NODIST="$CFLAGS_NODIST"
    ;;
icx)
    # ICX needs fp-model=precise (the default in clang) or floats behave badly
    CFLAGS_NODIST="$CFLAGS_NODIST -ffp-model=precise"
    ;;
icc)
    # ICC needs -fp-model strict or floats behave badly
    CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict"
    ;;
xlc)
    CFLAGS_NODIST="$CFLAGS_NODIST -qalias=noansi -qmaxmem=-1"
    ;;
esac

if test "$assertions" = 'true'; then
  :
else
  OPT="-DNDEBUG $OPT"
fi

if test "$ac_arch_flags"
then
	BASECFLAGS="$BASECFLAGS $ac_arch_flags"
fi

# On some compilers, pthreads are available without further options
# (e.g. MacOS X). On some of these systems, the compiler will not
# complain if unaccepted options are passed (e.g. gcc on Mac OS X).
# So we have to see first whether pthreads are available without
# options before we can check whether -Kpthread improves anything.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads are available without options" >&5
printf %s "checking whether pthreads are available without options... " >&6; }
if test ${ac_cv_pthread_is_default+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  ac_cv_pthread_is_default=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <pthread.h>

void* routine(void* p){return NULL;}

int main(void){
  pthread_t p;
  if(pthread_create(&p,NULL,routine,NULL)!=0)
    return 1;
  (void)pthread_detach(p);
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :

  ac_cv_pthread_is_default=yes
  ac_cv_kthread=no
  ac_cv_pthread=no

else case e in #(
  e) ac_cv_pthread_is_default=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pthread_is_default" >&5
printf "%s\n" "$ac_cv_pthread_is_default" >&6; }


if test $ac_cv_pthread_is_default = yes
then
  ac_cv_kpthread=no
else
# -Kpthread, if available, provides the right #defines
# and linker options to make pthread_create available
# Some compilers won't report that they do not support -Kpthread,
# so we need to run a program to see whether it really made the
# function available.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -Kpthread" >&5
printf %s "checking whether $CC accepts -Kpthread... " >&6; }
if test ${ac_cv_kpthread+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_save_cc="$CC"
CC="$CC -Kpthread"
if test "$cross_compiling" = yes
then :
  ac_cv_kpthread=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <pthread.h>

void* routine(void* p){return NULL;}

int main(void){
  pthread_t p;
  if(pthread_create(&p,NULL,routine,NULL)!=0)
    return 1;
  (void)pthread_detach(p);
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_kpthread=yes
else case e in #(
  e) ac_cv_kpthread=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

CC="$ac_save_cc" ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kpthread" >&5
printf "%s\n" "$ac_cv_kpthread" >&6; }
fi

if test $ac_cv_kpthread = no -a $ac_cv_pthread_is_default = no
then
# -Kthread, if available, provides the right #defines
# and linker options to make pthread_create available
# Some compilers won't report that they do not support -Kthread,
# so we need to run a program to see whether it really made the
# function available.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -Kthread" >&5
printf %s "checking whether $CC accepts -Kthread... " >&6; }
if test ${ac_cv_kthread+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_save_cc="$CC"
CC="$CC -Kthread"
if test "$cross_compiling" = yes
then :
  ac_cv_kthread=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <pthread.h>

void* routine(void* p){return NULL;}

int main(void){
  pthread_t p;
  if(pthread_create(&p,NULL,routine,NULL)!=0)
    return 1;
  (void)pthread_detach(p);
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_kthread=yes
else case e in #(
  e) ac_cv_kthread=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

CC="$ac_save_cc" ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kthread" >&5
printf "%s\n" "$ac_cv_kthread" >&6; }
fi

if test $ac_cv_kthread = no -a $ac_cv_pthread_is_default = no
then
# -pthread, if available, provides the right #defines
# and linker options to make pthread_create available
# Some compilers won't report that they do not support -pthread,
# so we need to run a program to see whether it really made the
# function available.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -pthread" >&5
printf %s "checking whether $CC accepts -pthread... " >&6; }
if test ${ac_cv_pthread+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_save_cc="$CC"
CC="$CC -pthread"
if test "$cross_compiling" = yes
then :
  ac_cv_pthread=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <pthread.h>

void* routine(void* p){return NULL;}

int main(void){
  pthread_t p;
  if(pthread_create(&p,NULL,routine,NULL)!=0)
    return 1;
  (void)pthread_detach(p);
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_pthread=yes
else case e in #(
  e) ac_cv_pthread=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

CC="$ac_save_cc" ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pthread" >&5
printf "%s\n" "$ac_cv_pthread" >&6; }
fi

# If we have set a CC compiler flag for thread support then
# check if it works for CXX, too.
if test ! -z "$CXX"
then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX also accepts flags for thread support" >&5
printf %s "checking whether $CXX also accepts flags for thread support... " >&6; }
if test ${ac_cv_cxx_thread+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_save_cxx="$CXX"

if test "$ac_cv_kpthread" = "yes"
then
  CXX="$CXX -Kpthread"
  ac_cv_cxx_thread=yes
elif test "$ac_cv_kthread" = "yes"
then
  CXX="$CXX -Kthread"
  ac_cv_cxx_thread=yes
elif test "$ac_cv_pthread" = "yes"
then
  CXX="$CXX -pthread"
  ac_cv_cxx_thread=yes
else
  ac_cv_cxx_thread=no
fi

if test $ac_cv_cxx_thread = yes
then
  echo 'void foo();int main(){foo();}void foo(){}' > conftest.$ac_ext
  $CXX -c conftest.$ac_ext 2>&5
  if $CXX -o conftest$ac_exeext conftest.$ac_objext 2>&5 \
     && test -s conftest$ac_exeext && ./conftest$ac_exeext
  then
    ac_cv_cxx_thread=yes
  else
    ac_cv_cxx_thread=no
  fi
  rm -fr conftest*
fi
CXX="$ac_save_cxx" ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_thread" >&5
printf "%s\n" "$ac_cv_cxx_thread" >&6; }
else
  ac_cv_cxx_thread=no
fi



printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h


# checks for header files
ac_fn_c_check_header_compile "$LINENO" "alloca.h" "ac_cv_header_alloca_h" "$ac_includes_default"
if test "x$ac_cv_header_alloca_h" = xyes
then :
  printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "asm/types.h" "ac_cv_header_asm_types_h" "$ac_includes_default"
if test "x$ac_cv_header_asm_types_h" = xyes
then :
  printf "%s\n" "#define HAVE_ASM_TYPES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "bluetooth.h" "ac_cv_header_bluetooth_h" "$ac_includes_default"
if test "x$ac_cv_header_bluetooth_h" = xyes
then :
  printf "%s\n" "#define HAVE_BLUETOOTH_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "conio.h" "ac_cv_header_conio_h" "$ac_includes_default"
if test "x$ac_cv_header_conio_h" = xyes
then :
  printf "%s\n" "#define HAVE_CONIO_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "direct.h" "ac_cv_header_direct_h" "$ac_includes_default"
if test "x$ac_cv_header_direct_h" = xyes
then :
  printf "%s\n" "#define HAVE_DIRECT_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default"
if test "x$ac_cv_header_dlfcn_h" = xyes
then :
  printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default"
if test "x$ac_cv_header_endian_h" = xyes
then :
  printf "%s\n" "#define HAVE_ENDIAN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default"
if test "x$ac_cv_header_errno_h" = xyes
then :
  printf "%s\n" "#define HAVE_ERRNO_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default"
if test "x$ac_cv_header_fcntl_h" = xyes
then :
  printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "grp.h" "ac_cv_header_grp_h" "$ac_includes_default"
if test "x$ac_cv_header_grp_h" = xyes
then :
  printf "%s\n" "#define HAVE_GRP_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "io.h" "ac_cv_header_io_h" "$ac_includes_default"
if test "x$ac_cv_header_io_h" = xyes
then :
  printf "%s\n" "#define HAVE_IO_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default"
if test "x$ac_cv_header_langinfo_h" = xyes
then :
  printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default"
if test "x$ac_cv_header_libintl_h" = xyes
then :
  printf "%s\n" "#define HAVE_LIBINTL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default"
if test "x$ac_cv_header_libutil_h" = xyes
then :
  printf "%s\n" "#define HAVE_LIBUTIL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/auxvec.h" "ac_cv_header_linux_auxvec_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_auxvec_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_AUXVEC_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/auxv.h" "ac_cv_header_sys_auxv_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_auxv_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_AUXV_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/fs.h" "ac_cv_header_linux_fs_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_fs_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_FS_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/limits.h" "ac_cv_header_linux_limits_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_limits_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_LIMITS_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/memfd.h" "ac_cv_header_linux_memfd_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_memfd_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_MEMFD_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/netfilter_ipv4.h" "ac_cv_header_linux_netfilter_ipv4_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_netfilter_ipv4_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_NETFILTER_IPV4_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/random.h" "ac_cv_header_linux_random_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_random_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_RANDOM_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/soundcard.h" "ac_cv_header_linux_soundcard_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_soundcard_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_SOUNDCARD_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/sched.h" "ac_cv_header_linux_sched_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_sched_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_SCHED_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/tipc.h" "ac_cv_header_linux_tipc_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_tipc_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_TIPC_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/wait.h" "ac_cv_header_linux_wait_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_wait_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_WAIT_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default"
if test "x$ac_cv_header_netdb_h" = xyes
then :
  printf "%s\n" "#define HAVE_NETDB_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "net/ethernet.h" "ac_cv_header_net_ethernet_h" "$ac_includes_default"
if test "x$ac_cv_header_net_ethernet_h" = xyes
then :
  printf "%s\n" "#define HAVE_NET_ETHERNET_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default"
if test "x$ac_cv_header_netinet_in_h" = xyes
then :
  printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "netpacket/packet.h" "ac_cv_header_netpacket_packet_h" "$ac_includes_default"
if test "x$ac_cv_header_netpacket_packet_h" = xyes
then :
  printf "%s\n" "#define HAVE_NETPACKET_PACKET_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default"
if test "x$ac_cv_header_poll_h" = xyes
then :
  printf "%s\n" "#define HAVE_POLL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "process.h" "ac_cv_header_process_h" "$ac_includes_default"
if test "x$ac_cv_header_process_h" = xyes
then :
  printf "%s\n" "#define HAVE_PROCESS_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
if test "x$ac_cv_header_pthread_h" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default"
if test "x$ac_cv_header_pty_h" = xyes
then :
  printf "%s\n" "#define HAVE_PTY_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sched.h" "ac_cv_header_sched_h" "$ac_includes_default"
if test "x$ac_cv_header_sched_h" = xyes
then :
  printf "%s\n" "#define HAVE_SCHED_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "setjmp.h" "ac_cv_header_setjmp_h" "$ac_includes_default"
if test "x$ac_cv_header_setjmp_h" = xyes
then :
  printf "%s\n" "#define HAVE_SETJMP_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "shadow.h" "ac_cv_header_shadow_h" "$ac_includes_default"
if test "x$ac_cv_header_shadow_h" = xyes
then :
  printf "%s\n" "#define HAVE_SHADOW_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "signal.h" "ac_cv_header_signal_h" "$ac_includes_default"
if test "x$ac_cv_header_signal_h" = xyes
then :
  printf "%s\n" "#define HAVE_SIGNAL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "spawn.h" "ac_cv_header_spawn_h" "$ac_includes_default"
if test "x$ac_cv_header_spawn_h" = xyes
then :
  printf "%s\n" "#define HAVE_SPAWN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/audioio.h" "ac_cv_header_sys_audioio_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_audioio_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_AUDIOIO_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/bsdtty.h" "ac_cv_header_sys_bsdtty_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_bsdtty_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_BSDTTY_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/devpoll.h" "ac_cv_header_sys_devpoll_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_devpoll_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_DEVPOLL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/endian.h" "ac_cv_header_sys_endian_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_endian_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_ENDIAN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/epoll.h" "ac_cv_header_sys_epoll_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_epoll_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_EPOLL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/event.h" "ac_cv_header_sys_event_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_event_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_EVENT_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/eventfd.h" "ac_cv_header_sys_eventfd_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_eventfd_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_EVENTFD_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/file.h" "ac_cv_header_sys_file_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_file_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_FILE_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_ioctl_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/kern_control.h" "ac_cv_header_sys_kern_control_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_kern_control_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_KERN_CONTROL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/loadavg.h" "ac_cv_header_sys_loadavg_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_loadavg_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_LOADAVG_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/lock.h" "ac_cv_header_sys_lock_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_lock_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_LOCK_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/memfd.h" "ac_cv_header_sys_memfd_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_memfd_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_MEMFD_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_mkdev_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_MKDEV_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_mman_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_MMAN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/modem.h" "ac_cv_header_sys_modem_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_modem_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_MODEM_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_param_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/pidfd.h" "ac_cv_header_sys_pidfd_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_pidfd_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_PIDFD_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/poll.h" "ac_cv_header_sys_poll_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_poll_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_POLL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/random.h" "ac_cv_header_sys_random_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_random_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_RANDOM_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_resource_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_RESOURCE_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_select_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/sendfile.h" "ac_cv_header_sys_sendfile_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_sendfile_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_SENDFILE_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_socket_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/soundcard.h" "ac_cv_header_sys_soundcard_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_soundcard_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_SOUNDCARD_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_stat_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_STAT_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/statvfs.h" "ac_cv_header_sys_statvfs_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_statvfs_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_STATVFS_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/sys_domain.h" "ac_cv_header_sys_sys_domain_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_sys_domain_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_SYS_DOMAIN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/syscall.h" "ac_cv_header_sys_syscall_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_syscall_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_SYSCALL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_sysctl_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_SYSCTL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_sysmacros_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_SYSMACROS_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/termio.h" "ac_cv_header_sys_termio_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_termio_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_TERMIO_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_time_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/times.h" "ac_cv_header_sys_times_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_times_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_TIMES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/timerfd.h" "ac_cv_header_sys_timerfd_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_timerfd_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_TIMERFD_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_types_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_uio_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_UIO_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_un_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_UN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_utsname_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_UTSNAME_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_wait_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_WAIT_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sys/xattr.h" "ac_cv_header_sys_xattr_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_xattr_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYS_XATTR_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "sysexits.h" "ac_cv_header_sysexits_h" "$ac_includes_default"
if test "x$ac_cv_header_sysexits_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYSEXITS_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "syslog.h" "ac_cv_header_syslog_h" "$ac_includes_default"
if test "x$ac_cv_header_syslog_h" = xyes
then :
  printf "%s\n" "#define HAVE_SYSLOG_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default"
if test "x$ac_cv_header_termios_h" = xyes
then :
  printf "%s\n" "#define HAVE_TERMIOS_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default"
if test "x$ac_cv_header_util_h" = xyes
then :
  printf "%s\n" "#define HAVE_UTIL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "utime.h" "ac_cv_header_utime_h" "$ac_includes_default"
if test "x$ac_cv_header_utime_h" = xyes
then :
  printf "%s\n" "#define HAVE_UTIME_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "utmp.h" "ac_cv_header_utmp_h" "$ac_includes_default"
if test "x$ac_cv_header_utmp_h" = xyes
then :
  printf "%s\n" "#define HAVE_UTMP_H 1" >>confdefs.h

fi

ac_header_dirent=no
for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
  as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | sed "$as_sed_sh"`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
printf %s "checking for $ac_hdr that defines DIR... " >&6; }
if eval test \${$as_ac_Header+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#include <$ac_hdr>

int
main (void)
{
if ((DIR *) 0)
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  eval "$as_ac_Header=yes"
else case e in #(
  e) eval "$as_ac_Header=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
eval ac_res=\$$as_ac_Header
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
if eval test \"x\$"$as_ac_Header"\" = x"yes"
then :
  cat >>confdefs.h <<_ACEOF
#define `printf "%s\n" "HAVE_$ac_hdr" | sed "$as_sed_cpp"` 1
_ACEOF

ac_header_dirent=$ac_hdr; break
fi

done
# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
if test $ac_header_dirent = dirent.h; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
printf %s "checking for library containing opendir... " >&6; }
if test ${ac_cv_search_opendir+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char opendir (void);
int
main (void)
{
return opendir ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' dir
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_opendir=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_opendir+y}
then :
  break
fi
done
if test ${ac_cv_search_opendir+y}
then :

else case e in #(
  e) ac_cv_search_opendir=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
printf "%s\n" "$ac_cv_search_opendir" >&6; }
ac_res=$ac_cv_search_opendir
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
printf %s "checking for library containing opendir... " >&6; }
if test ${ac_cv_search_opendir+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char opendir (void);
int
main (void)
{
return opendir ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' x
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_opendir=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_opendir+y}
then :
  break
fi
done
if test ${ac_cv_search_opendir+y}
then :

else case e in #(
  e) ac_cv_search_opendir=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
printf "%s\n" "$ac_cv_search_opendir" >&6; }
ac_res=$ac_cv_search_opendir
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

fi


ac_fn_c_check_header_compile "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_mkdev_h" = xyes
then :

printf "%s\n" "#define MAJOR_IN_MKDEV 1" >>confdefs.h

fi

if test $ac_cv_header_sys_mkdev_h = no; then
  ac_fn_c_check_header_compile "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_sysmacros_h" = xyes
then :

printf "%s\n" "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h

fi

fi


# On Linux, stropts.h may be empty
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5
printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; }
if test ${ac_cv_c_undeclared_builtin_options+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_save_CFLAGS=$CFLAGS
   ac_cv_c_undeclared_builtin_options='cannot detect'
   for ac_arg in '' -fno-builtin; do
     CFLAGS="$ac_save_CFLAGS $ac_arg"
     # This test program should *not* compile successfully.
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{
(void) strchr;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

else case e in #(
  e) # This test program should compile successfully.
        # No library function is consistently available on
        # freestanding implementations, so test against a dummy
        # declaration.  Include always-available headers on the
        # off chance that they somehow elicit warnings.
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <float.h>
#include <limits.h>
#include <stdarg.h>
#include <stddef.h>
extern void ac_decl (int, char *);

int
main (void)
{
(void) ac_decl (0, (char *) 0);
  (void) ac_decl;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  if test x"$ac_arg" = x
then :
  ac_cv_c_undeclared_builtin_options='none needed'
else case e in #(
  e) ac_cv_c_undeclared_builtin_options=$ac_arg ;;
esac
fi
          break
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    done
    CFLAGS=$ac_save_CFLAGS
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5
printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; }
  case $ac_cv_c_undeclared_builtin_options in #(
  'cannot detect') :
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "cannot make $CC report undeclared builtins
See 'config.log' for more details" "$LINENO" 5; } ;; #(
  'none needed') :
    ac_c_undeclared_builtin_options='' ;; #(
  *) :
    ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;;
esac

ac_fn_check_decl "$LINENO" "I_PUSH" "ac_cv_have_decl_I_PUSH" "
    #ifdef HAVE_SYS_TYPES_H
    #  include <sys/types.h>
    #endif
    #include <stropts.h>

" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_I_PUSH" = xyes
then :


printf "%s\n" "#define HAVE_STROPTS_H 1" >>confdefs.h

fi

# bluetooth/bluetooth.h has been known to not compile with -std=c99.
# http://permalink.gmane.org/gmane.linux.bluez.kernel/22294
SAVE_CFLAGS=$CFLAGS
CFLAGS="-std=c99 $CFLAGS"
ac_fn_c_check_header_compile "$LINENO" "bluetooth/bluetooth.h" "ac_cv_header_bluetooth_bluetooth_h" "$ac_includes_default"
if test "x$ac_cv_header_bluetooth_bluetooth_h" = xyes
then :
  printf "%s\n" "#define HAVE_BLUETOOTH_BLUETOOTH_H 1" >>confdefs.h

fi

CFLAGS=$SAVE_CFLAGS

# On Darwin (OS X) net/if.h requires sys/socket.h to be imported first.
ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_net_if_h" = xyes
then :
  printf "%s\n" "#define HAVE_NET_IF_H 1" >>confdefs.h

fi


# On Linux, netlink.h requires asm/types.h
# On FreeBSD, netlink.h is located in netlink/netlink.h
ac_fn_c_check_header_compile "$LINENO" "linux/netlink.h" "ac_cv_header_linux_netlink_h" "
#ifdef HAVE_ASM_TYPES_H
#include <asm/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_linux_netlink_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_NETLINK_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "netlink/netlink.h" "ac_cv_header_netlink_netlink_h" "
#ifdef HAVE_ASM_TYPES_H
#include <asm/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_netlink_netlink_h" = xyes
then :
  printf "%s\n" "#define HAVE_NETLINK_NETLINK_H 1" >>confdefs.h

fi


# On Linux, qrtr.h requires asm/types.h
ac_fn_c_check_header_compile "$LINENO" "linux/qrtr.h" "ac_cv_header_linux_qrtr_h" "
#ifdef HAVE_ASM_TYPES_H
#include <asm/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_linux_qrtr_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_QRTR_H 1" >>confdefs.h

fi


ac_fn_c_check_header_compile "$LINENO" "linux/vm_sockets.h" "ac_cv_header_linux_vm_sockets_h" "
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_linux_vm_sockets_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_VM_SOCKETS_H 1" >>confdefs.h

fi


# On Linux, can.h, can/bcm.h, can/isotp.h, can/j1939.h, can/raw.h require sys/socket.h
# On NetBSD, netcan/can.h requires sys/socket.h
ac_fn_c_check_header_compile "$LINENO" "linux/can.h" "ac_cv_header_linux_can_h" "
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_linux_can_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_CAN_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/can/bcm.h" "ac_cv_header_linux_can_bcm_h" "
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_linux_can_bcm_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_CAN_BCM_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/can/isotp.h" "ac_cv_header_linux_can_isotp_h" "
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_linux_can_isotp_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_CAN_ISOTP_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/can/j1939.h" "ac_cv_header_linux_can_j1939_h" "
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_linux_can_j1939_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_CAN_J1939_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "linux/can/raw.h" "ac_cv_header_linux_can_raw_h" "
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_linux_can_raw_h" = xyes
then :
  printf "%s\n" "#define HAVE_LINUX_CAN_RAW_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "netcan/can.h" "ac_cv_header_netcan_can_h" "
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_header_netcan_can_h" = xyes
then :
  printf "%s\n" "#define HAVE_NETCAN_CAN_H 1" >>confdefs.h

fi


# Check for clock_t in time.h.
ac_fn_c_check_type "$LINENO" "clock_t" "ac_cv_type_clock_t" "#include <time.h>
"
if test "x$ac_cv_type_clock_t" = xyes
then :

printf "%s\n" "#define HAVE_CLOCK_T 1" >>confdefs.h


else case e in #(
  e)
printf "%s\n" "#define clock_t long" >>confdefs.h
 ;;
esac
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for makedev" >&5
printf %s "checking for makedev... " >&6; }
if test ${ac_cv_func_makedev+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#if defined(MAJOR_IN_MKDEV)
#include <sys/mkdev.h>
#elif defined(MAJOR_IN_SYSMACROS)
#include <sys/sysmacros.h>
#else
#include <sys/types.h>
#endif

int
main (void)
{

  makedev(0, 0)
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_func_makedev=yes
else case e in #(
  e) ac_cv_func_makedev=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_makedev" >&5
printf "%s\n" "$ac_cv_func_makedev" >&6; }

if test "x$ac_cv_func_makedev" = xyes
then :


printf "%s\n" "#define HAVE_MAKEDEV 1" >>confdefs.h


fi

# byte swapping
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for le64toh" >&5
printf %s "checking for le64toh... " >&6; }
if test ${ac_cv_func_le64toh+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef HAVE_ENDIAN_H
#include <endian.h>
#elif defined(HAVE_SYS_ENDIAN_H)
#include <sys/endian.h>
#endif

int
main (void)
{

   le64toh(1)
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_func_le64toh=yes
else case e in #(
  e) ac_cv_func_le64toh=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_le64toh" >&5
printf "%s\n" "$ac_cv_func_le64toh" >&6; }

if test "x$ac_cv_func_le64toh" = xyes
then :


printf "%s\n" "#define HAVE_HTOLE64 1" >>confdefs.h


fi

use_lfs=yes
# Don't use largefile support for GNU/Hurd
case $ac_sys_system in GNU*)
  use_lfs=no
esac

if test "$use_lfs" = "yes"; then
# Two defines needed to enable largefile support on various platforms
# These may affect some typedefs
case $ac_sys_system/$ac_sys_release in
AIX*)

printf "%s\n" "#define _LARGE_FILES 1" >>confdefs.h

    ;;
esac

printf "%s\n" "#define _LARGEFILE_SOURCE 1" >>confdefs.h


printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h

fi

# Add some code to confdefs.h so that the test for off_t works on SCO
cat >> confdefs.h <<\EOF
#if defined(SCO_DS)
#undef _OFF_T
#endif
EOF

# Type availability checks
ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
if test "x$ac_cv_type_mode_t" = xyes
then :

else case e in #(
  e)
printf "%s\n" "#define mode_t int" >>confdefs.h
 ;;
esac
fi

ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
if test "x$ac_cv_type_off_t" = xyes
then :

else case e in #(
  e)
printf "%s\n" "#define off_t long int" >>confdefs.h
 ;;
esac
fi


  ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default
"
if test "x$ac_cv_type_pid_t" = xyes
then :

else case e in #(
  e)                                         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

          #if defined _WIN64 && !defined __CYGWIN__
          LLP64
          #endif

int
main (void)
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_pid_type='int'
else case e in #(
  e) ac_pid_type='__int64' ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h

     ;;
esac
fi



printf "%s\n" "#define RETSIGTYPE void" >>confdefs.h

ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
if test "x$ac_cv_type_size_t" = xyes
then :

else case e in #(
  e)
printf "%s\n" "#define size_t unsigned int" >>confdefs.h
 ;;
esac
fi

ac_fn_c_check_type "$LINENO" "uid_t" "ac_cv_type_uid_t" "$ac_includes_default"
if test "x$ac_cv_type_uid_t" = xyes
then :

else case e in #(
  e)
printf "%s\n" "#define uid_t int" >>confdefs.h
 ;;
esac
fi

ac_fn_c_check_type "$LINENO" "gid_t" "ac_cv_type_gid_t" "$ac_includes_default"
if test "x$ac_cv_type_gid_t" = xyes
then :

else case e in #(
  e)
printf "%s\n" "#define gid_t int" >>confdefs.h
 ;;
esac
fi


ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
if test "x$ac_cv_type_ssize_t" = xyes
then :

printf "%s\n" "#define HAVE_SSIZE_T 1" >>confdefs.h


fi

ac_fn_c_check_type "$LINENO" "__uint128_t" "ac_cv_type___uint128_t" "$ac_includes_default"
if test "x$ac_cv_type___uint128_t" = xyes
then :

printf "%s\n" "#define HAVE___UINT128_T 1" >>confdefs.h


printf "%s\n" "#define HAVE_GCC_UINT128_T 1" >>confdefs.h

fi


# Sizes and alignments of various common basic types
# ANSI C requires sizeof(char) == 1, so no need to check it
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
printf %s "checking size of int... " >&6; }
if test ${ac_cv_sizeof_int+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_int" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (int)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_int=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
printf "%s\n" "$ac_cv_sizeof_int" >&6; }



printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
printf %s "checking size of long... " >&6; }
if test ${ac_cv_sizeof_long+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_long" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_long=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
printf "%s\n" "$ac_cv_sizeof_long" >&6; }



printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler,
# see AC_CHECK_SIZEOF for more information.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of long" >&5
printf %s "checking alignment of long... " >&6; }
if test ${ac_cv_alignof_long+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long"        "$ac_includes_default
typedef struct { char x; long y; } ac__type_alignof_;"
then :

else case e in #(
  e) if test "$ac_cv_type_long" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute alignment of long
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_alignof_long=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long" >&5
printf "%s\n" "$ac_cv_alignof_long" >&6; }



printf "%s\n" "#define ALIGNOF_LONG $ac_cv_alignof_long" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
printf %s "checking size of long long... " >&6; }
if test ${ac_cv_sizeof_long_long+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_long_long" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long long)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_long_long=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
printf "%s\n" "$ac_cv_sizeof_long_long" >&6; }



printf "%s\n" "#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
printf %s "checking size of void *... " >&6; }
if test ${ac_cv_sizeof_void_p+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_void_p" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_void_p=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }



printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
printf %s "checking size of short... " >&6; }
if test ${ac_cv_sizeof_short+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_short" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (short)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_short=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
printf "%s\n" "$ac_cv_sizeof_short" >&6; }



printf "%s\n" "#define SIZEOF_SHORT $ac_cv_sizeof_short" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
printf %s "checking size of float... " >&6; }
if test ${ac_cv_sizeof_float+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_float" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (float)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_float=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5
printf "%s\n" "$ac_cv_sizeof_float" >&6; }



printf "%s\n" "#define SIZEOF_FLOAT $ac_cv_sizeof_float" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
printf %s "checking size of double... " >&6; }
if test ${ac_cv_sizeof_double+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_double" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (double)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_double=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
printf "%s\n" "$ac_cv_sizeof_double" >&6; }



printf "%s\n" "#define SIZEOF_DOUBLE $ac_cv_sizeof_double" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of fpos_t" >&5
printf %s "checking size of fpos_t... " >&6; }
if test ${ac_cv_sizeof_fpos_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fpos_t))" "ac_cv_sizeof_fpos_t"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_fpos_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (fpos_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_fpos_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_fpos_t" >&5
printf "%s\n" "$ac_cv_sizeof_fpos_t" >&6; }



printf "%s\n" "#define SIZEOF_FPOS_T $ac_cv_sizeof_fpos_t" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
printf %s "checking size of size_t... " >&6; }
if test ${ac_cv_sizeof_size_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_size_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (size_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_size_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
printf "%s\n" "$ac_cv_sizeof_size_t" >&6; }



printf "%s\n" "#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler,
# see AC_CHECK_SIZEOF for more information.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of size_t" >&5
printf %s "checking alignment of size_t... " >&6; }
if test ${ac_cv_alignof_size_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_size_t"        "$ac_includes_default
typedef struct { char x; size_t y; } ac__type_alignof_;"
then :

else case e in #(
  e) if test "$ac_cv_type_size_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute alignment of size_t
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_alignof_size_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_size_t" >&5
printf "%s\n" "$ac_cv_alignof_size_t" >&6; }



printf "%s\n" "#define ALIGNOF_SIZE_T $ac_cv_alignof_size_t" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of pid_t" >&5
printf %s "checking size of pid_t... " >&6; }
if test ${ac_cv_sizeof_pid_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pid_t))" "ac_cv_sizeof_pid_t"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_pid_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (pid_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_pid_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pid_t" >&5
printf "%s\n" "$ac_cv_sizeof_pid_t" >&6; }



printf "%s\n" "#define SIZEOF_PID_T $ac_cv_sizeof_pid_t" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of uintptr_t" >&5
printf %s "checking size of uintptr_t... " >&6; }
if test ${ac_cv_sizeof_uintptr_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (uintptr_t))" "ac_cv_sizeof_uintptr_t"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_uintptr_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (uintptr_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_uintptr_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_uintptr_t" >&5
printf "%s\n" "$ac_cv_sizeof_uintptr_t" >&6; }



printf "%s\n" "#define SIZEOF_UINTPTR_T $ac_cv_sizeof_uintptr_t" >>confdefs.h


# The cast to long int works around a bug in the HP C Compiler,
# see AC_CHECK_SIZEOF for more information.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of max_align_t" >&5
printf %s "checking alignment of max_align_t... " >&6; }
if test ${ac_cv_alignof_max_align_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_max_align_t"        "$ac_includes_default
typedef struct { char x; max_align_t y; } ac__type_alignof_;"
then :

else case e in #(
  e) if test "$ac_cv_type_max_align_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute alignment of max_align_t
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_alignof_max_align_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_max_align_t" >&5
printf "%s\n" "$ac_cv_alignof_max_align_t" >&6; }



printf "%s\n" "#define ALIGNOF_MAX_ALIGN_T $ac_cv_alignof_max_align_t" >>confdefs.h




  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for long double" >&5
printf %s "checking for long double... " >&6; }
if test ${ac_cv_type_long_double+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$GCC" = yes; then
       ac_cv_type_long_double=yes
     else
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* The Stardent Vistra knows sizeof (long double), but does
		 not support it.  */
	      long double foo = 0.0L;
int
main (void)
{
static int test_array [1 - 2 * !(/* On Ultrix 4.3 cc, long double is 4 and double is 8.  */
	      sizeof (double) <= sizeof (long double))];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_type_long_double=yes
else case e in #(
  e) ac_cv_type_long_double=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
     fi ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_double" >&5
printf "%s\n" "$ac_cv_type_long_double" >&6; }
  if test $ac_cv_type_long_double = yes; then

printf "%s\n" "#define HAVE_LONG_DOUBLE 1" >>confdefs.h

  fi

# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
printf %s "checking size of long double... " >&6; }
if test ${ac_cv_sizeof_long_double+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type_long_double" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long double)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_long_double=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5
printf "%s\n" "$ac_cv_sizeof_long_double" >&6; }



printf "%s\n" "#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double" >>confdefs.h



# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of _Bool" >&5
printf %s "checking size of _Bool... " >&6; }
if test ${ac_cv_sizeof__Bool+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (_Bool))" "ac_cv_sizeof__Bool"        "$ac_includes_default"
then :

else case e in #(
  e) if test "$ac_cv_type__Bool" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (_Bool)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof__Bool=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof__Bool" >&5
printf "%s\n" "$ac_cv_sizeof__Bool" >&6; }



printf "%s\n" "#define SIZEOF__BOOL $ac_cv_sizeof__Bool" >>confdefs.h



# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
printf %s "checking size of off_t... " >&6; }
if test ${ac_cv_sizeof_off_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t"        "
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif

"
then :

else case e in #(
  e) if test "$ac_cv_type_off_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (off_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_off_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5
printf "%s\n" "$ac_cv_sizeof_off_t" >&6; }



printf "%s\n" "#define SIZEOF_OFF_T $ac_cv_sizeof_off_t" >>confdefs.h



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable large file support" >&5
printf %s "checking whether to enable large file support... " >&6; }
if test "$ac_cv_sizeof_off_t" -gt "$ac_cv_sizeof_long" -a \
	"$ac_cv_sizeof_long_long" -ge "$ac_cv_sizeof_off_t"; then
  have_largefile_support="yes"
else
  have_largefile_support="no"
fi
if test "x$have_largefile_support" = xyes
then :


printf "%s\n" "#define HAVE_LARGEFILE_SUPPORT 1" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

else case e in #(
  e)
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
 ;;
esac
fi

# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
printf %s "checking size of time_t... " >&6; }
if test ${ac_cv_sizeof_time_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t"        "
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif

"
then :

else case e in #(
  e) if test "$ac_cv_type_time_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (time_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_time_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5
printf "%s\n" "$ac_cv_sizeof_time_t" >&6; }



printf "%s\n" "#define SIZEOF_TIME_T $ac_cv_sizeof_time_t" >>confdefs.h



# if have pthread_t then define SIZEOF_PTHREAD_T
ac_save_cc="$CC"
if test "$ac_cv_kpthread" = "yes"
then CC="$CC -Kpthread"
elif test "$ac_cv_kthread" = "yes"
then CC="$CC -Kthread"
elif test "$ac_cv_pthread" = "yes"
then CC="$CC -pthread"
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_t" >&5
printf %s "checking for pthread_t... " >&6; }
if test ${ac_cv_have_pthread_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  #include <pthread.h>
int
main (void)
{
pthread_t x; x = *(pthread_t*)0;
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_have_pthread_t=yes
else case e in #(
  e) ac_cv_have_pthread_t=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_pthread_t" >&5
printf "%s\n" "$ac_cv_have_pthread_t" >&6; }
if test "x$ac_cv_have_pthread_t" = xyes
then :

  # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of pthread_t" >&5
printf %s "checking size of pthread_t... " >&6; }
if test ${ac_cv_sizeof_pthread_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))" "ac_cv_sizeof_pthread_t"        "
#ifdef HAVE_PTHREAD_H
#include <pthread.h>
#endif

"
then :

else case e in #(
  e) if test "$ac_cv_type_pthread_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (pthread_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_pthread_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pthread_t" >&5
printf "%s\n" "$ac_cv_sizeof_pthread_t" >&6; }



printf "%s\n" "#define SIZEOF_PTHREAD_T $ac_cv_sizeof_pthread_t" >>confdefs.h



fi

# Issue #25658: POSIX hasn't defined that pthread_key_t is compatible with int.
# This checking will be unnecessary after removing deprecated TLS API.
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of pthread_key_t" >&5
printf %s "checking size of pthread_key_t... " >&6; }
if test ${ac_cv_sizeof_pthread_key_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_key_t))" "ac_cv_sizeof_pthread_key_t"        "#include <pthread.h>
"
then :

else case e in #(
  e) if test "$ac_cv_type_pthread_key_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (pthread_key_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_pthread_key_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pthread_key_t" >&5
printf "%s\n" "$ac_cv_sizeof_pthread_key_t" >&6; }



printf "%s\n" "#define SIZEOF_PTHREAD_KEY_T $ac_cv_sizeof_pthread_key_t" >>confdefs.h


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthread_key_t is compatible with int" >&5
printf %s "checking whether pthread_key_t is compatible with int... " >&6; }
if test ${ac_cv_pthread_key_t_is_arithmetic_type+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
if test "$ac_cv_sizeof_pthread_key_t" -eq "$ac_cv_sizeof_int" ; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
int
main (void)
{
pthread_key_t k; k * 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_pthread_key_t_is_arithmetic_type=yes
else case e in #(
  e) ac_cv_pthread_key_t_is_arithmetic_type=no
   ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
else
  ac_cv_pthread_key_t_is_arithmetic_type=no
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pthread_key_t_is_arithmetic_type" >&5
printf "%s\n" "$ac_cv_pthread_key_t_is_arithmetic_type" >&6; }
if test "x$ac_cv_pthread_key_t_is_arithmetic_type" = xyes
then :


printf "%s\n" "#define PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT 1" >>confdefs.h


fi

CC="$ac_save_cc"

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-framework" >&5
printf %s "checking for --enable-framework... " >&6; }
if test "$enable_framework"
then
	BASECFLAGS="$BASECFLAGS -fno-common -dynamic"
	# -F. is needed to allow linking to the framework while
	# in the build location.

printf "%s\n" "#define WITH_NEXT_FRAMEWORK 1" >>confdefs.h

	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
	if test $enable_shared = "yes"
	then
		as_fn_error $? "Specifying both --enable-shared and --enable-framework is not supported, use only --enable-framework instead" "$LINENO" 5
	fi
else
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

# Check for --with-dsymutil


DSYMUTIL=
DSYMUTIL_PATH=
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-dsymutil" >&5
printf %s "checking for --with-dsymutil... " >&6; }

# Check whether --with-dsymutil was given.
if test ${with_dsymutil+y}
then :
  withval=$with_dsymutil;
if test "$withval" != no
then
  if test "$MACHDEP" != "darwin"; then
    as_fn_error $? "dsymutil debug linking is only available in macOS." "$LINENO" 5
  fi
 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; };
  DSYMUTIL='true'
else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }; DSYMUTIL=
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi


if test "$DSYMUTIL"; then
  # Extract the first word of "dsymutil", so it can be a program name with args.
set dummy dsymutil; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_DSYMUTIL_PATH+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $DSYMUTIL_PATH in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_DSYMUTIL_PATH="$DSYMUTIL_PATH" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_DSYMUTIL_PATH="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_path_DSYMUTIL_PATH" && ac_cv_path_DSYMUTIL_PATH="not found"
  ;;
esac ;;
esac
fi
DSYMUTIL_PATH=$ac_cv_path_DSYMUTIL_PATH
if test -n "$DSYMUTIL_PATH"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL_PATH" >&5
printf "%s\n" "$DSYMUTIL_PATH" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  if test "$DSYMUTIL_PATH" = "not found"; then
      as_fn_error $? "dsymutil command not found on \$PATH" "$LINENO" 5
  fi
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dyld" >&5
printf %s "checking for dyld... " >&6; }
case $ac_sys_system/$ac_sys_release in
  Darwin/*)

printf "%s\n" "#define WITH_DYLD 1" >>confdefs.h

    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: always on for Darwin" >&5
printf "%s\n" "always on for Darwin" >&6; }
  	;;
  *)
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
	;;
esac

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-address-sanitizer" >&5
printf %s "checking for --with-address-sanitizer... " >&6; }

# Check whether --with-address_sanitizer was given.
if test ${with_address_sanitizer+y}
then :
  withval=$with_address_sanitizer;
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5
printf "%s\n" "$withval" >&6; }
BASECFLAGS="-fsanitize=address -fno-omit-frame-pointer $BASECFLAGS"
LDFLAGS="-fsanitize=address $LDFLAGS"
# ASan works by controlling memory allocation, our own malloc interferes.
with_pymalloc="no"

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-memory-sanitizer" >&5
printf %s "checking for --with-memory-sanitizer... " >&6; }

# Check whether --with-memory_sanitizer was given.
if test ${with_memory_sanitizer+y}
then :
  withval=$with_memory_sanitizer;
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5
printf "%s\n" "$withval" >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fsanitize=memory" >&5
printf %s "checking whether C compiler accepts -fsanitize=memory... " >&6; }
if test ${ax_cv_check_cflags___fsanitize_memory+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS  -fsanitize=memory"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags___fsanitize_memory=yes
else case e in #(
  e) ax_cv_check_cflags___fsanitize_memory=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fsanitize_memory" >&5
printf "%s\n" "$ax_cv_check_cflags___fsanitize_memory" >&6; }
if test "x$ax_cv_check_cflags___fsanitize_memory" = xyes
then :

BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS"
LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 $LDFLAGS"

else case e in #(
  e) as_fn_error $? "The selected compiler doesn't support memory sanitizer" "$LINENO" 5 ;;
esac
fi

# MSan works by controlling memory allocation, our own malloc interferes.
with_pymalloc="no"

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-undefined-behavior-sanitizer" >&5
printf %s "checking for --with-undefined-behavior-sanitizer... " >&6; }

# Check whether --with-undefined_behavior_sanitizer was given.
if test ${with_undefined_behavior_sanitizer+y}
then :
  withval=$with_undefined_behavior_sanitizer;
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5
printf "%s\n" "$withval" >&6; }
BASECFLAGS="-fsanitize=undefined $BASECFLAGS"
LDFLAGS="-fsanitize=undefined $LDFLAGS"
with_ubsan="yes"

else case e in #(
  e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
with_ubsan="no"
 ;;
esac
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-thread-sanitizer" >&5
printf %s "checking for --with-thread-sanitizer... " >&6; }

# Check whether --with-thread_sanitizer was given.
if test ${with_thread_sanitizer+y}
then :
  withval=$with_thread_sanitizer;
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5
printf "%s\n" "$withval" >&6; }
BASECFLAGS="-fsanitize=thread $BASECFLAGS"
LDFLAGS="-fsanitize=thread $LDFLAGS"
with_tsan="yes"

else case e in #(
  e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
with_tsan="no"
 ;;
esac
fi


# Set info about shared libraries.







# SHLIB_SUFFIX is the extension of shared libraries `(including the dot!)
# -- usually .so, .sl on HP-UX, .dll on Cygwin
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the extension of shared libraries" >&5
printf %s "checking the extension of shared libraries... " >&6; }
if test -z "$SHLIB_SUFFIX"; then
	case $ac_sys_system in
	hp*|HP*)
		case `uname -m` in
			ia64) SHLIB_SUFFIX=.so;;
	  		*)    SHLIB_SUFFIX=.sl;;
		esac
		;;
	CYGWIN*)   SHLIB_SUFFIX=.dll;;
	*)	   SHLIB_SUFFIX=.so;;
	esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SHLIB_SUFFIX" >&5
printf "%s\n" "$SHLIB_SUFFIX" >&6; }

# LDSHARED is the ld *command* used to create shared library
# -- "cc -G" on SunOS 5.x.
# (Shared libraries in this instance are shared modules to be loaded into
# Python, as opposed to building Python itself as a shared library.)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking LDSHARED" >&5
printf %s "checking LDSHARED... " >&6; }
if test -z "$LDSHARED"
then
	case $ac_sys_system/$ac_sys_release in
	AIX*)
		BLDSHARED="Modules/ld_so_aix \$(CC) -bI:Modules/python.exp"
		LDSHARED="\$(LIBPL)/ld_so_aix \$(CC) -bI:\$(LIBPL)/python.exp"
		;;
	SunOS/5*)
		if test "$ac_cv_gcc_compat" = "yes" ; then
			LDSHARED='$(CC) -shared'
			LDCXXSHARED='$(CXX) -shared'
		else
			LDSHARED='$(CC) -G'
			LDCXXSHARED='$(CXX) -G'
		fi ;;
	hp*|HP*)
		if test "$ac_cv_gcc_compat" = "yes" ; then
			LDSHARED='$(CC) -shared'
			LDCXXSHARED='$(CXX) -shared'
		else
			LDSHARED='$(CC) -b'
			LDCXXSHARED='$(CXX) -b'
		fi ;;
	Darwin/1.3*)
		LDSHARED='$(CC) -bundle'
		LDCXXSHARED='$(CXX) -bundle'
		if test "$enable_framework" ; then
			# Link against the framework. All externals should be defined.
			BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
			LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
			LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
		else
			# No framework. Ignore undefined symbols, assuming they come from Python
			LDSHARED="$LDSHARED -undefined suppress"
			LDCXXSHARED="$LDCXXSHARED -undefined suppress"
		fi ;;
	Darwin/1.4*|Darwin/5.*|Darwin/6.*)
		LDSHARED='$(CC) -bundle'
		LDCXXSHARED='$(CXX) -bundle'
		if test "$enable_framework" ; then
			# Link against the framework. All externals should be defined.
			BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
			LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
			LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
		else
			# No framework, use the Python app as bundle-loader
			BLDSHARED="$LDSHARED "'-bundle_loader $(BUILDPYTHON)'
			LDSHARED="$LDSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)'
			LDCXXSHARED="$LDCXXSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)'
		fi ;;
	Darwin/*)
		# Use -undefined dynamic_lookup whenever possible (10.3 and later).
		# This allows an extension to be used in any Python

		dep_target_major=`echo ${MACOSX_DEPLOYMENT_TARGET} | \
				sed 's/\([0-9]*\)\.\([0-9]*\).*/\1/'`
		dep_target_minor=`echo ${MACOSX_DEPLOYMENT_TARGET} | \
				sed 's/\([0-9]*\)\.\([0-9]*\).*/\2/'`
		if test ${dep_target_major} -eq 10 && \
		   test ${dep_target_minor} -le 2
		then
			# building for OS X 10.0 through 10.2
			as_fn_error $? "MACOSX_DEPLOYMENT_TARGET too old ($MACOSX_DEPLOYMENT_TARGET), only 10.3 or later is supported" "$LINENO" 5
		else
			# building for OS X 10.3 and later
			LDSHARED='$(CC) -bundle -undefined dynamic_lookup'
			LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup'
			BLDSHARED="$LDSHARED"
		fi
		;;
	iOS/*)
		LDSHARED='$(CC) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
		LDCXXSHARED='$(CXX) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
		BLDSHARED="$LDSHARED"
		;;
	Emscripten*|WASI*)
		LDSHARED='$(CC) -shared'
		LDCXXSHARED='$(CXX) -shared';;
	Linux*|GNU*|QNX*|VxWorks*|Haiku*)
		LDSHARED='$(CC) -shared'
		LDCXXSHARED='$(CXX) -shared';;
	FreeBSD*)
		if [ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]
		then
			LDSHARED='$(CC) -shared'
			LDCXXSHARED='$(CXX) -shared'
		else
			LDSHARED="ld -Bshareable"
		fi;;
	OpenBSD*)
		if [ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]
		then
				LDSHARED='$(CC) -shared $(CCSHARED)'
				LDCXXSHARED='$(CXX) -shared $(CCSHARED)'
		else
				case `uname -r` in
				[01].* | 2.[0-7] | 2.[0-7].*)
				   LDSHARED="ld -Bshareable ${LDFLAGS}"
				   ;;
				*)
				   LDSHARED='$(CC) -shared $(CCSHARED)'
				   LDCXXSHARED='$(CXX) -shared $(CCSHARED)'
				   ;;
				esac
		fi;;
	NetBSD*|DragonFly*)
		LDSHARED='$(CC) -shared'
		LDCXXSHARED='$(CXX) -shared';;
	OpenUNIX*|UnixWare*)
		if test "$ac_cv_gcc_compat" = "yes" ; then
			LDSHARED='$(CC) -shared'
			LDCXXSHARED='$(CXX) -shared'
		else
			LDSHARED='$(CC) -G'
			LDCXXSHARED='$(CXX) -G'
		fi;;
	SCO_SV*)
		LDSHARED='$(CC) -Wl,-G,-Bexport'
		LDCXXSHARED='$(CXX) -Wl,-G,-Bexport';;
	WASI*)
		if test "x$enable_wasm_dynamic_linking" = xyes
then :


fi;;
	CYGWIN*)
		LDSHARED='$(CC) -shared -Wl,--enable-auto-image-base'
		LDCXXSHARED='$(CXX) -shared -Wl,--enable-auto-image-base';;
	*)	LDSHARED="ld";;
	esac
fi

if test "$enable_wasm_dynamic_linking" = "yes" -a "$ac_sys_system" = "Emscripten"; then
  BLDSHARED='$(CC) -shared -sSIDE_MODULE=1'
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LDSHARED" >&5
printf "%s\n" "$LDSHARED" >&6; }
LDCXXSHARED=${LDCXXSHARED-$LDSHARED}

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking BLDSHARED flags" >&5
printf %s "checking BLDSHARED flags... " >&6; }
BLDSHARED=${BLDSHARED-$LDSHARED}
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BLDSHARED" >&5
printf "%s\n" "$BLDSHARED" >&6; }

# CCSHARED are the C *flags* used to create objects to go into a shared
# library (module) -- this is only needed for a few systems
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking CCSHARED" >&5
printf %s "checking CCSHARED... " >&6; }
if test -z "$CCSHARED"
then
	case $ac_sys_system/$ac_sys_release in
	SunOS*) if test "$ac_cv_gcc_compat" = "yes";
		then CCSHARED="-fPIC";
		elif test `uname -p` = sparc;
		then CCSHARED="-xcode=pic32";
		else CCSHARED="-Kpic";
		fi;;
	hp*|HP*) if test "$ac_cv_gcc_compat" = "yes";
		 then CCSHARED="-fPIC";
		 else CCSHARED="+z";
		 fi;;
	Linux*|GNU*) CCSHARED="-fPIC";;
	Emscripten*|WASI*)
		if test "x$enable_wasm_dynamic_linking" = xyes
then :

			CCSHARED="-fPIC"

fi;;
	FreeBSD*|NetBSD*|OpenBSD*|DragonFly*) CCSHARED="-fPIC";;
	Haiku*) CCSHARED="-fPIC";;
	OpenUNIX*|UnixWare*)
		if test "$ac_cv_gcc_compat" = "yes"
		then CCSHARED="-fPIC"
		else CCSHARED="-KPIC"
		fi;;
	SCO_SV*)
		if test "$ac_cv_gcc_compat" = "yes"
		then CCSHARED="-fPIC"
		else CCSHARED="-Kpic -belf"
		fi;;
	VxWorks*)
		CCSHARED="-fpic -D__SO_PICABILINUX__  -ftls-model=global-dynamic"
	esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CCSHARED" >&5
printf "%s\n" "$CCSHARED" >&6; }
# LINKFORSHARED are the flags passed to the $(CC) command that links
# the python executable -- this is only needed for a few systems
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking LINKFORSHARED" >&5
printf %s "checking LINKFORSHARED... " >&6; }
if test -z "$LINKFORSHARED"
then
	case $ac_sys_system/$ac_sys_release in
	AIX*)	LINKFORSHARED='-Wl,-bE:Modules/python.exp -lld';;
	hp*|HP*)
	    LINKFORSHARED="-Wl,-E -Wl,+s";;
#	    LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";;
	Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
	Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";;
	# -u libsys_s pulls in all symbols in libsys
	Darwin/*|iOS/*)
		LINKFORSHARED="$extra_undefs -framework CoreFoundation"

		# Issue #18075: the default maximum stack size (8MBytes) is too
		# small for the default recursion limit. Increase the stack size
		# to ensure that tests don't crash
		stack_size="1000000"  # 16 MB
		if test "$with_ubsan" = "yes"
		then
			# Undefined behavior sanitizer requires an even deeper stack
			stack_size="4000000"  # 64 MB
		fi


printf "%s\n" "#define THREAD_STACK_SIZE 0x$stack_size" >>confdefs.h


		if test $ac_sys_system = "Darwin"; then
			LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"

			if test "$enable_framework"; then
				LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
			fi
			LINKFORSHARED="$LINKFORSHARED"
		elif test $ac_sys_system = "iOS"; then
			LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"

			if test "$enable_framework"; then
				LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)'
			fi
		fi
		;;
	OpenUNIX*|UnixWare*) LINKFORSHARED="-Wl,-Bexport";;
	SCO_SV*) LINKFORSHARED="-Wl,-Bexport";;
	ReliantUNIX*) LINKFORSHARED="-W1 -Blargedynsym";;
	FreeBSD*|NetBSD*|OpenBSD*|DragonFly*)
		if [ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]
		then
			LINKFORSHARED="-Wl,--export-dynamic"
		fi;;
    SunOS/5*) if test "$ac_cv_gcc_compat" = "yes"; then
		    if $CC -Xlinker --help 2>&1 | grep export-dynamic >/dev/null
		    then
			LINKFORSHARED="-Xlinker --export-dynamic"
		    fi
        fi
		;;
	CYGWIN*)
		if test $enable_shared = "no"
		then
			LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)'
		fi;;
	QNX*)
		# -Wl,-E causes the symbols to be added to the dynamic
		# symbol table so that they can be found when a module
		# is loaded.  -N 2048K causes the stack size to be set
		# to 2048 kilobytes so that the stack doesn't overflow
		# when running test_compile.py.
		LINKFORSHARED='-Wl,-E -N 2048K';;
	VxWorks*)
		LINKFORSHARED='-Wl,-export-dynamic';;
	esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LINKFORSHARED" >&5
printf "%s\n" "$LINKFORSHARED" >&6; }



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking CFLAGSFORSHARED" >&5
printf %s "checking CFLAGSFORSHARED... " >&6; }
if test ! "$LIBRARY" = "$LDLIBRARY"
then
	case $ac_sys_system in
	CYGWIN*)
		# Cygwin needs CCSHARED when building extension DLLs
		# but not when building the interpreter DLL.
		CFLAGSFORSHARED='';;
	*)
		CFLAGSFORSHARED='$(CCSHARED)'
	esac
fi

if test "x$enable_wasm_dynamic_linking" = xyes
then :

  CFLAGSFORSHARED='$(CCSHARED)'

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CFLAGSFORSHARED" >&5
printf "%s\n" "$CFLAGSFORSHARED" >&6; }

# SHLIBS are libraries (except -lc and -lm) to link to the python shared
# library (with --enable-shared).
# For platforms on which shared libraries are not allowed to have unresolved
# symbols, this must be set to $(LIBS) (expanded by make). We do this even
# if it is not required, since it creates a dependency of the shared library
# to LIBS. This, in turn, means that applications linking the shared libpython
# don't need to link LIBS explicitly. The default should be only changed
# on systems where this approach causes problems.

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking SHLIBS" >&5
printf %s "checking SHLIBS... " >&6; }
case "$ac_sys_system" in
	*)
		SHLIBS='$(LIBS)';;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SHLIBS" >&5
printf "%s\n" "$SHLIBS" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking perf trampoline" >&5
printf %s "checking perf trampoline... " >&6; }
PERF_TRAMPOLINE_OBJ=""
case $PLATFORM_TRIPLET in #(
  x86_64-linux-gnu) :
    perf_trampoline=yes
                        PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_x86_64.o ;; #(
  x86_64-linux-musl) :
    perf_trampoline=yes
                        PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_x86_64.o ;; #(
  aarch64-linux-gnu) :
    perf_trampoline=yes
                         PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_aarch64.o ;; #(
  aarch64-linux-musl) :
    perf_trampoline=yes
                         PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_aarch64.o ;; #(
  darwin) :
    case $MACOSX_DEPLOYMENT_TARGET in #(
  10.[0-9]|10.1[0-1]) :
    perf_trampoline=no ;; #(
  *) :
    perf_trampoline=yes
                 if test "${enable_universalsdk}" && test "$UNIVERSAL_ARCHS" = "universal2"; then
                   PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_universal2.o
                 else
                   case "$host_cpu" in
                     x86_64)
                       PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_x86_64.o
                       ;;
                     aarch64|arm64)
                       PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_aarch64.o
                       ;;
                     *)
                       perf_trampoline=no
                       ;;
                   esac
                 fi
             ;;
esac ;; #(
  *) :
    perf_trampoline=no
 ;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $perf_trampoline" >&5
printf "%s\n" "$perf_trampoline" >&6; }

if test "x$perf_trampoline" = xyes
then :


printf "%s\n" "#define PY_HAVE_PERF_TRAMPOLINE 1" >>confdefs.h


fi


# checks for libraries
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sendfile in -lsendfile" >&5
printf %s "checking for sendfile in -lsendfile... " >&6; }
if test ${ac_cv_lib_sendfile_sendfile+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsendfile  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sendfile (void);
int
main (void)
{
return sendfile ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sendfile_sendfile=yes
else case e in #(
  e) ac_cv_lib_sendfile_sendfile=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sendfile_sendfile" >&5
printf "%s\n" "$ac_cv_lib_sendfile_sendfile" >&6; }
if test "x$ac_cv_lib_sendfile_sendfile" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSENDFILE 1" >>confdefs.h

  LIBS="-lsendfile $LIBS"

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
printf %s "checking for dlopen in -ldl... " >&6; }
if test ${ac_cv_lib_dl_dlopen+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen (void);
int
main (void)
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_dl_dlopen=yes
else case e in #(
  e) ac_cv_lib_dl_dlopen=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes
then :
  printf "%s\n" "#define HAVE_LIBDL 1" >>confdefs.h

  LIBS="-ldl $LIBS"

fi
       # Dynamic linking for SunOS/Solaris and SYSV
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
printf %s "checking for shl_load in -ldld... " >&6; }
if test ${ac_cv_lib_dld_shl_load+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char shl_load (void);
int
main (void)
{
return shl_load ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_dld_shl_load=yes
else case e in #(
  e) ac_cv_lib_dld_shl_load=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = xyes
then :
  printf "%s\n" "#define HAVE_LIBDLD 1" >>confdefs.h

  LIBS="-ldld $LIBS"

fi
    # Dynamic linking for HP-UX

ac_fn_c_check_header_compile "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default"
if test "x$ac_cv_header_iconv_h" = xyes
then :
  printf "%s\n" "#define HAVE_ICONV_H 1" >>confdefs.h

fi

case $ac_sys_system in #(
  Emscripten|WASI) :
    py_have_iconv=no ;; #(
  *) :
    py_have_iconv=$ac_cv_header_iconv_h ;;
esac
if test "$py_have_iconv" = yes; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
printf %s "checking for iconv... " >&6; }
if test ${ac_cv_have_iconv+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    ac_cv_have_iconv=no
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <iconv.h>

int
main (void)
{

      iconv_t cd = iconv_open("", "");
      iconv(cd, NULL, NULL, NULL, NULL);
      iconv_close(cd);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_have_iconv=yes
else case e in #(
  e)
      py_save_LIBS="$LIBS"
      LIBS="-liconv $LIBS"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <iconv.h>

int
main (void)
{

        iconv_t cd = iconv_open("", "");
        iconv(cd, NULL, NULL, NULL, NULL);
        iconv_close(cd);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_have_iconv=-liconv
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$py_save_LIBS"
     ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_iconv" >&5
printf "%s\n" "$ac_cv_have_iconv" >&6; }
  if test "$ac_cv_have_iconv" != no; then

printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h

    if test "$ac_cv_have_iconv" = -liconv; then
      LIBS="-liconv $LIBS"
    fi
  fi
fi


       for ac_header in execinfo.h link.h dlfcn.h
do :
  as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | sed "$as_sed_sh"`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"
then :
  cat >>confdefs.h <<_ACEOF
#define `printf "%s\n" "HAVE_$ac_header" | sed "$as_sed_cpp"` 1
_ACEOF


  for ac_func in backtrace dladdr1
do :
  as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"
then :
  cat >>confdefs.h <<_ACEOF
#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1
_ACEOF

    # dladdr1 requires -ldl
    ac_cv_require_ldl=yes

fi

done

fi

done

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libgcc frame registration functions" >&5
printf %s "checking for libgcc frame registration functions... " >&6; }
if test ${ac_cv_have_libgcc_eh_frame_registration+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

void __register_frame(const void *);
void __deregister_frame(const void *);

int
main (void)
{

__register_frame(0);
__deregister_frame(0);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_have_libgcc_eh_frame_registration=yes
else case e in #(
  e) ac_cv_have_libgcc_eh_frame_registration=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_libgcc_eh_frame_registration" >&5
printf "%s\n" "$ac_cv_have_libgcc_eh_frame_registration" >&6; }
if test "x$ac_cv_have_libgcc_eh_frame_registration" = xyes
then :


printf "%s\n" "#define _Py_HAVE_LIBGCC_EH_FRAME_REGISTRATION 1" >>confdefs.h


fi

if test "x$ac_cv_require_ldl" = xyes
then :

  if test "x$ac_cv_lib_dl_dlopen" = xyes
then :

else case e in #(
  e)
    as_fn_append LDFLAGS " -ldl"
   ;;
esac
fi

fi






have_uuid=missing

       for ac_header in uuid.h
do :
  ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$ac_includes_default"
if test "x$ac_cv_header_uuid_h" = xyes
then :
  printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h


  for ac_func in uuid_create uuid_enc_be
do :
  as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"
then :
  cat >>confdefs.h <<_ACEOF
#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1
_ACEOF

    have_uuid=yes
    ac_cv_have_uuid_h=yes
    LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""}
    LIBUUID_LIBS=${LIBUUID_LIBS-""}

fi

done

fi

done

if test "x$have_uuid" = xmissing
then :


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid >= 2.20" >&5
printf %s "checking for uuid >= 2.20... " >&6; }

if test -n "$LIBUUID_CFLAGS"; then
    pkg_cv_LIBUUID_CFLAGS="$LIBUUID_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uuid >= 2.20\""; } >&5
  ($PKG_CONFIG --exists --print-errors "uuid >= 2.20") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBUUID_CFLAGS=`$PKG_CONFIG --cflags "uuid >= 2.20" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$LIBUUID_LIBS"; then
    pkg_cv_LIBUUID_LIBS="$LIBUUID_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uuid >= 2.20\""; } >&5
  ($PKG_CONFIG --exists --print-errors "uuid >= 2.20") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBUUID_LIBS=`$PKG_CONFIG --libs "uuid >= 2.20" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                LIBUUID_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "uuid >= 2.20" 2>&1`
        else
                LIBUUID_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "uuid >= 2.20" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBUUID_PKG_ERRORS" >&5


      save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


        CPPFLAGS="$CPPFLAGS $LIBUUID_CFLAGS"
        LIBS="$LIBS $LIBUUID_LIBS"
               for ac_header in uuid/uuid.h
do :
  ac_fn_c_check_header_compile "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_uuid_h" "$ac_includes_default"
if test "x$ac_cv_header_uuid_uuid_h" = xyes
then :
  printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h

          ac_cv_have_uuid_uuid_h=yes
          py_check_lib_save_LIBS=$LIBS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid_generate_time in -luuid" >&5
printf %s "checking for uuid_generate_time in -luuid... " >&6; }
if test ${ac_cv_lib_uuid_uuid_generate_time+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-luuid  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char uuid_generate_time (void);
int
main (void)
{
return uuid_generate_time ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_uuid_uuid_generate_time=yes
else case e in #(
  e) ac_cv_lib_uuid_uuid_generate_time=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_uuid_uuid_generate_time" >&5
printf "%s\n" "$ac_cv_lib_uuid_uuid_generate_time" >&6; }
if test "x$ac_cv_lib_uuid_uuid_generate_time" = xyes
then :
  have_uuid=yes
fi

LIBS=$py_check_lib_save_LIBS

          py_check_lib_save_LIBS=$LIBS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid_generate_time_safe in -luuid" >&5
printf %s "checking for uuid_generate_time_safe in -luuid... " >&6; }
if test ${ac_cv_lib_uuid_uuid_generate_time_safe+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-luuid  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char uuid_generate_time_safe (void);
int
main (void)
{
return uuid_generate_time_safe ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_uuid_uuid_generate_time_safe=yes
else case e in #(
  e) ac_cv_lib_uuid_uuid_generate_time_safe=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_uuid_uuid_generate_time_safe" >&5
printf "%s\n" "$ac_cv_lib_uuid_uuid_generate_time_safe" >&6; }
if test "x$ac_cv_lib_uuid_uuid_generate_time_safe" = xyes
then :

            have_uuid=yes
            ac_cv_have_uuid_generate_time_safe=yes

fi

LIBS=$py_check_lib_save_LIBS

fi

done
        if test "x$have_uuid" = xyes
then :

          LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""}
          LIBUUID_LIBS=${LIBUUID_LIBS-"-luuid"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS




elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

      save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


        CPPFLAGS="$CPPFLAGS $LIBUUID_CFLAGS"
        LIBS="$LIBS $LIBUUID_LIBS"
               for ac_header in uuid/uuid.h
do :
  ac_fn_c_check_header_compile "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_uuid_h" "$ac_includes_default"
if test "x$ac_cv_header_uuid_uuid_h" = xyes
then :
  printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h

          ac_cv_have_uuid_uuid_h=yes
          py_check_lib_save_LIBS=$LIBS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid_generate_time in -luuid" >&5
printf %s "checking for uuid_generate_time in -luuid... " >&6; }
if test ${ac_cv_lib_uuid_uuid_generate_time+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-luuid  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char uuid_generate_time (void);
int
main (void)
{
return uuid_generate_time ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_uuid_uuid_generate_time=yes
else case e in #(
  e) ac_cv_lib_uuid_uuid_generate_time=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_uuid_uuid_generate_time" >&5
printf "%s\n" "$ac_cv_lib_uuid_uuid_generate_time" >&6; }
if test "x$ac_cv_lib_uuid_uuid_generate_time" = xyes
then :
  have_uuid=yes
fi

LIBS=$py_check_lib_save_LIBS

          py_check_lib_save_LIBS=$LIBS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid_generate_time_safe in -luuid" >&5
printf %s "checking for uuid_generate_time_safe in -luuid... " >&6; }
if test ${ac_cv_lib_uuid_uuid_generate_time_safe+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-luuid  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char uuid_generate_time_safe (void);
int
main (void)
{
return uuid_generate_time_safe ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_uuid_uuid_generate_time_safe=yes
else case e in #(
  e) ac_cv_lib_uuid_uuid_generate_time_safe=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_uuid_uuid_generate_time_safe" >&5
printf "%s\n" "$ac_cv_lib_uuid_uuid_generate_time_safe" >&6; }
if test "x$ac_cv_lib_uuid_uuid_generate_time_safe" = xyes
then :

            have_uuid=yes
            ac_cv_have_uuid_generate_time_safe=yes

fi

LIBS=$py_check_lib_save_LIBS

fi

done
        if test "x$have_uuid" = xyes
then :

          LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""}
          LIBUUID_LIBS=${LIBUUID_LIBS-"-luuid"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS




else
        LIBUUID_CFLAGS=$pkg_cv_LIBUUID_CFLAGS
        LIBUUID_LIBS=$pkg_cv_LIBUUID_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
                    have_uuid=yes
      ac_cv_have_uuid_generate_time_safe=yes
      # The uuid.h file to include may be <uuid.h> *or* <uuid/uuid.h>.
      # Since pkg-config --cflags uuid may return -I/usr/include/uuid,
      # it's possible to write '#include <uuid.h>' in _uuidmodule.c,
      # assuming that the compiler flags are properly updated.
      #
      # Ideally, we should have defined HAVE_UUID_H if and only if
      # #include <uuid.h> can be written, *without* assuming extra
      # include path.
      ac_cv_have_uuid_h=yes

fi

fi

if test "x$have_uuid" = xmissing
then :

         for ac_header in uuid/uuid.h
do :
  ac_fn_c_check_header_compile "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_uuid_h" "$ac_includes_default"
if test "x$ac_cv_header_uuid_uuid_h" = xyes
then :
  printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h

    ac_fn_c_check_func "$LINENO" "uuid_generate_time" "ac_cv_func_uuid_generate_time"
if test "x$ac_cv_func_uuid_generate_time" = xyes
then :

      have_uuid=yes
      ac_cv_have_uuid_uuid_h=yes
      LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""}
      LIBUUID_LIBS=${LIBUUID_LIBS-""}

fi


fi

done

fi

if test "x$ac_cv_have_uuid_h" = xyes
then :
  printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h

fi
if test "x$ac_cv_have_uuid_uuid_h" = xyes
then :
  printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h

fi
if test "x$ac_cv_have_uuid_generate_time_safe" = xyes
then :

  printf "%s\n" "#define HAVE_UUID_GENERATE_TIME_SAFE 1" >>confdefs.h


fi

# gh-124228: While the libuuid library is available on NetBSD and OpenBSD,
# it supports only UUID version 4.
# This restriction inhibits the proper generation of time-based UUIDs.
if test "$ac_sys_system" = "NetBSD" || test "$ac_sys_system" = "OpenBSD"; then
  have_uuid=missing
  printf "%s\n" "#define HAVE_UUID_H 0" >>confdefs.h

fi

if test "x$have_uuid" = xmissing
then :
  have_uuid=no
fi

# gh-132710: The UUID node is fetched by using libuuid when possible
# and cached. While the node is constant within the same process,
# different interpreters may have different values as libuuid may
# randomize the node value if the latter cannot be deduced.
#
# Consumers may define HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC
# to indicate that libuuid is unstable and should not be relied
# upon to deduce the MAC address.


if test "$have_uuid" = "yes" -a "$HAVE_UUID_GENERATE_TIME_SAFE" = "1"
then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if uuid_generate_time_safe() node value is stable" >&5
printf %s "checking if uuid_generate_time_safe() node value is stable... " >&6; }
  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  # Be sure to add the extra include path if we used pkg-config
  # as HAVE_UUID_H may be set even though <uuid.h> is only reachable
  # by adding extra -I flags.
  #
  # If the following script does not compile, we simply assume that
  # libuuid is missing.
  CFLAGS="$CFLAGS $LIBUUID_CFLAGS"
  LIBS="$LIBS $LIBUUID_LIBS"
  if test "$cross_compiling" = yes
then :


else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

    #include <inttypes.h>   // PRIu64
    #include <stdint.h>     // uint64_t
    #include <stdio.h>      // fopen(), fclose()

    #ifdef HAVE_UUID_H
    #include <uuid.h>
    #else
    #include <uuid/uuid.h>
    #endif

    #define ERR 1
    int main(void) {
        uuid_t uuid;  // unsigned char[16]
        (void)uuid_generate_time_safe(uuid);
        uint64_t node = 0;
        for (size_t i = 0; i < 6; i++) {
            node |= (uint64_t)uuid[15 - i] << (8 * i);
        }
        FILE *fp = fopen("conftest.out", "w");
        if (fp == NULL) {
            return ERR;
        }
        int rc = fprintf(fp, "%" PRIu64 "\n", node) >= 0;
        rc |= fclose(fp);
        return rc == 0 ? 0 : ERR;
    }
_ACEOF
if ac_fn_c_try_run "$LINENO"
then :

      py_cv_uuid_node1=`cat conftest.out`

fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS


  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  # Be sure to add the extra include path if we used pkg-config
  # as HAVE_UUID_H may be set even though <uuid.h> is only reachable
  # by adding extra -I flags.
  #
  # If the following script does not compile, we simply assume that
  # libuuid is missing.
  CFLAGS="$CFLAGS $LIBUUID_CFLAGS"
  LIBS="$LIBS $LIBUUID_LIBS"
  if test "$cross_compiling" = yes
then :


else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

    #include <inttypes.h>   // PRIu64
    #include <stdint.h>     // uint64_t
    #include <stdio.h>      // fopen(), fclose()

    #ifdef HAVE_UUID_H
    #include <uuid.h>
    #else
    #include <uuid/uuid.h>
    #endif

    #define ERR 1
    int main(void) {
        uuid_t uuid;  // unsigned char[16]
        (void)uuid_generate_time_safe(uuid);
        uint64_t node = 0;
        for (size_t i = 0; i < 6; i++) {
            node |= (uint64_t)uuid[15 - i] << (8 * i);
        }
        FILE *fp = fopen("conftest.out", "w");
        if (fp == NULL) {
            return ERR;
        }
        int rc = fprintf(fp, "%" PRIu64 "\n", node) >= 0;
        rc |= fclose(fp);
        return rc == 0 ? 0 : ERR;
    }
_ACEOF
if ac_fn_c_try_run "$LINENO"
then :

      py_cv_uuid_node2=`cat conftest.out`

fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS


  if test -n "$py_cv_uuid_node1" -a "$py_cv_uuid_node1" = "$py_cv_uuid_node2"
  then
    printf "%s\n" "#define HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC 1" >>confdefs.h

    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: stable" >&5
printf "%s\n" "stable" >&6; }
  else
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unstable" >&5
printf "%s\n" "unstable" >&6; }
  fi
fi

# 'Real Time' functions on Solaris
# posix4 on Solaris 2.6
# pthread (first!) on Linux
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing sem_init" >&5
printf %s "checking for library containing sem_init... " >&6; }
if test ${ac_cv_search_sem_init+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sem_init (void);
int
main (void)
{
return sem_init ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' pthread rt posix4
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_sem_init=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_sem_init+y}
then :
  break
fi
done
if test ${ac_cv_search_sem_init+y}
then :

else case e in #(
  e) ac_cv_search_sem_init=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sem_init" >&5
printf "%s\n" "$ac_cv_search_sem_init" >&6; }
ac_res=$ac_cv_search_sem_init
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi


# check if we need libintl for locale functions
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for textdomain in -lintl" >&5
printf %s "checking for textdomain in -lintl... " >&6; }
if test ${ac_cv_lib_intl_textdomain+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lintl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char textdomain (void);
int
main (void)
{
return textdomain ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_intl_textdomain=yes
else case e in #(
  e) ac_cv_lib_intl_textdomain=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_textdomain" >&5
printf "%s\n" "$ac_cv_lib_intl_textdomain" >&6; }
if test "x$ac_cv_lib_intl_textdomain" = xyes
then :

printf "%s\n" "#define WITH_LIBINTL 1" >>confdefs.h

        LIBS="-lintl $LIBS"
fi


# checks for system dependent C++ extensions support
case "$ac_sys_system" in
	AIX*)	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for genuine AIX C++ extensions support" >&5
printf %s "checking for genuine AIX C++ extensions support... " >&6; }
		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

		  #include <load.h>
int
main (void)
{
loadAndInit("", 0, "")
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"
then :


printf "%s\n" "#define AIX_GENUINE_CPLUSPLUS 1" >>confdefs.h

		  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

else case e in #(
  e)
		  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
		 ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
# BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the platform_tag
# of the AIX system used to build/package Python executable. This tag serves
# as a baseline for bdist module packages
               { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the system builddate" >&5
printf %s "checking for the system builddate... " >&6; }
               AIX_BUILDDATE=$(lslpp -Lcq bos.mp64 | awk -F:  '{ print $NF }')

printf "%s\n" "#define AIX_BUILDDATE $AIX_BUILDDATE" >>confdefs.h

               { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AIX_BUILDDATE" >&5
printf "%s\n" "$AIX_BUILDDATE" >&6; }
               ;;
	*) ;;
esac

# check for systems that require aligned memory access
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking aligned memory access is required" >&5
printf %s "checking aligned memory access is required... " >&6; }
if test ${ac_cv_aligned_required+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :

# "yes" changes the hash function to FNV, which causes problems with Numba
# (https://github.com/numba/numba/blob/0.59.0/numba/cpython/hashing.py#L470).
if test "$ac_sys_system" = "Linux-android"; then
  ac_cv_aligned_required=no
else
  ac_cv_aligned_required=yes
fi
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int main(void)
{
    char s[16];
    int i, *p1, *p2;
    for (i=0; i < 16; i++)
        s[i] = i;
    p1 = (int*)(s+1);
    p2 = (int*)(s+2);
    if (*p1 == *p2)
        return 1;
    return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_aligned_required=no
else case e in #(
  e) ac_cv_aligned_required=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_aligned_required" >&5
printf "%s\n" "$ac_cv_aligned_required" >&6; }
if test "$ac_cv_aligned_required" = yes ; then

printf "%s\n" "#define HAVE_ALIGNED_REQUIRED 1" >>confdefs.h

fi

# str, bytes and memoryview hash algorithm


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-hash-algorithm" >&5
printf %s "checking for --with-hash-algorithm... " >&6; }

# Check whether --with-hash_algorithm was given.
if test ${with_hash_algorithm+y}
then :
  withval=$with_hash_algorithm;
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5
printf "%s\n" "$withval" >&6; }
case "$withval" in
    siphash13)
        printf "%s\n" "#define Py_HASH_ALGORITHM 3" >>confdefs.h

        ;;
    siphash24)
        printf "%s\n" "#define Py_HASH_ALGORITHM 1" >>confdefs.h

        ;;
    fnv)
        printf "%s\n" "#define Py_HASH_ALGORITHM 2" >>confdefs.h

        ;;
    *)
        as_fn_error $? "unknown hash algorithm '$withval'" "$LINENO" 5
        ;;
esac

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: default" >&5
printf "%s\n" "default" >&6; } ;;
esac
fi


validate_tzpath() {
    # Checks that each element of the path is an absolute path
    if test -z "$1"; then
        # Empty string is allowed: it indicates no system TZPATH
        return 0
    fi

    # Bad paths are those that don't start with /
        if ( echo $1 | grep '\(^\|:\)\([^/]\|$\)' > /dev/null); then
        as_fn_error $? "--with-tzpath must contain only absolute paths, not $1" "$LINENO" 5
        return 1;
    fi
}

TZPATH="/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-tzpath" >&5
printf %s "checking for --with-tzpath... " >&6; }

# Check whether --with-tzpath was given.
if test ${with_tzpath+y}
then :
  withval=$with_tzpath;
case "$withval" in
    yes)
        as_fn_error $? "--with-tzpath requires a value" "$LINENO" 5
        ;;
    *)
        validate_tzpath "$withval"
        TZPATH="$withval"
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"$withval\"" >&5
printf "%s\n" "\"$withval\"" >&6; }
        ;;
esac

else case e in #(
  e) validate_tzpath "$TZPATH"
 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"$TZPATH\"" >&5
printf "%s\n" "\"$TZPATH\"" >&6; } ;;
esac
fi



# Most SVR4 platforms (e.g. Solaris) need -lsocket and -lnsl.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for t_open in -lnsl" >&5
printf %s "checking for t_open in -lnsl... " >&6; }
if test ${ac_cv_lib_nsl_t_open+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lnsl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char t_open (void);
int
main (void)
{
return t_open ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_nsl_t_open=yes
else case e in #(
  e) ac_cv_lib_nsl_t_open=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_t_open" >&5
printf "%s\n" "$ac_cv_lib_nsl_t_open" >&6; }
if test "x$ac_cv_lib_nsl_t_open" = xyes
then :
  LIBS="-lnsl $LIBS"
fi
 # SVR4
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
printf %s "checking for socket in -lsocket... " >&6; }
if test ${ac_cv_lib_socket_socket+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsocket $LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char socket (void);
int
main (void)
{
return socket ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_socket_socket=yes
else case e in #(
  e) ac_cv_lib_socket_socket=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
printf "%s\n" "$ac_cv_lib_socket_socket" >&6; }
if test "x$ac_cv_lib_socket_socket" = xyes
then :
  LIBS="-lsocket $LIBS"
fi
 # SVR4 sockets

case $ac_sys_system/$ac_sys_release in
    Haiku*)
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socket in -lnetwork" >&5
printf %s "checking for socket in -lnetwork... " >&6; }
if test ${ac_cv_lib_network_socket+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lnetwork $LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char socket (void);
int
main (void)
{
return socket ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_network_socket=yes
else case e in #(
  e) ac_cv_lib_network_socket=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_socket" >&5
printf "%s\n" "$ac_cv_lib_network_socket" >&6; }
if test "x$ac_cv_lib_network_socket" = xyes
then :
  LIBS="-lnetwork $LIBS"
fi

    ;;
esac

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-libs" >&5
printf %s "checking for --with-libs... " >&6; }

# Check whether --with-libs was given.
if test ${with_libs+y}
then :
  withval=$with_libs;
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5
printf "%s\n" "$withval" >&6; }
LIBS="$withval $LIBS"

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi


# Check for use of the system expat library
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-system-expat" >&5
printf %s "checking for --with-system-expat... " >&6; }

# Check whether --with-system_expat was given.
if test ${with_system_expat+y}
then :
  withval=$with_system_expat;
else case e in #(
  e) with_system_expat="no" ;;
esac
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_system_expat" >&5
printf "%s\n" "$with_system_expat" >&6; }

if test "x$with_system_expat" = xyes
then :

  LIBEXPAT_CFLAGS=${LIBEXPAT_CFLAGS-""}
  LIBEXPAT_LDFLAGS=${LIBEXPAT_LDFLAGS-"-lexpat"}
  LIBEXPAT_INTERNAL=

else case e in #(
  e)
  LIBEXPAT_CFLAGS="-I\$(srcdir)/Modules/expat"
  LIBEXPAT_LDFLAGS="-lm \$(LIBEXPAT_A)"
  LIBEXPAT_INTERNAL="\$(LIBEXPAT_HEADERS) \$(LIBEXPAT_A)"
 ;;
esac
fi




have_libffi=missing
if test "x$ac_sys_system" = xDarwin
then :

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CFLAGS="-I${SDKROOT}/usr/include/ffi $CFLAGS"
    ac_fn_c_check_header_compile "$LINENO" "ffi.h" "ac_cv_header_ffi_h" "$ac_includes_default"
if test "x$ac_cv_header_ffi_h" = xyes
then :

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffi_call in -lffi" >&5
printf %s "checking for ffi_call in -lffi... " >&6; }
if test ${ac_cv_lib_ffi_ffi_call+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lffi  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char ffi_call (void);
int
main (void)
{
return ffi_call ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_ffi_ffi_call=yes
else case e in #(
  e) ac_cv_lib_ffi_ffi_call=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ffi_ffi_call" >&5
printf "%s\n" "$ac_cv_lib_ffi_ffi_call" >&6; }
if test "x$ac_cv_lib_ffi_ffi_call" = xyes
then :

                have_libffi=yes
        LIBFFI_CFLAGS="-I${SDKROOT}/usr/include/ffi -DUSING_APPLE_OS_LIBFFI=1"
        LIBFFI_LIBS="-lffi"

fi


fi


CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



fi
if test "x$have_libffi" = xmissing
then :


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libffi" >&5
printf %s "checking for libffi... " >&6; }

if test -n "$LIBFFI_CFLAGS"; then
    pkg_cv_LIBFFI_CFLAGS="$LIBFFI_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libffi\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libffi") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBFFI_CFLAGS=`$PKG_CONFIG --cflags "libffi" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$LIBFFI_LIBS"; then
    pkg_cv_LIBFFI_LIBS="$LIBFFI_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libffi\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libffi") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBFFI_LIBS=`$PKG_CONFIG --libs "libffi" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                LIBFFI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libffi" 2>&1`
        else
                LIBFFI_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libffi" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBFFI_PKG_ERRORS" >&5


    save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


      CPPFLAGS="$CPPFLAGS $LIBFFI_CFLAGS"
      LIBS="$LIBS $LIBFFI_LIBS"
      ac_fn_c_check_header_compile "$LINENO" "ffi.h" "ac_cv_header_ffi_h" "$ac_includes_default"
if test "x$ac_cv_header_ffi_h" = xyes
then :

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffi_call in -lffi" >&5
printf %s "checking for ffi_call in -lffi... " >&6; }
if test ${ac_cv_lib_ffi_ffi_call+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lffi  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char ffi_call (void);
int
main (void)
{
return ffi_call ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_ffi_ffi_call=yes
else case e in #(
  e) ac_cv_lib_ffi_ffi_call=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ffi_ffi_call" >&5
printf "%s\n" "$ac_cv_lib_ffi_ffi_call" >&6; }
if test "x$ac_cv_lib_ffi_ffi_call" = xyes
then :

          have_libffi=yes
          LIBFFI_CFLAGS=${LIBFFI_CFLAGS-""}
          LIBFFI_LIBS=${LIBFFI_LIBS-"-lffi"}

else case e in #(
  e) have_libffi=no ;;
esac
fi


fi


CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

    save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


      CPPFLAGS="$CPPFLAGS $LIBFFI_CFLAGS"
      LIBS="$LIBS $LIBFFI_LIBS"
      ac_fn_c_check_header_compile "$LINENO" "ffi.h" "ac_cv_header_ffi_h" "$ac_includes_default"
if test "x$ac_cv_header_ffi_h" = xyes
then :

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffi_call in -lffi" >&5
printf %s "checking for ffi_call in -lffi... " >&6; }
if test ${ac_cv_lib_ffi_ffi_call+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lffi  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char ffi_call (void);
int
main (void)
{
return ffi_call ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_ffi_ffi_call=yes
else case e in #(
  e) ac_cv_lib_ffi_ffi_call=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ffi_ffi_call" >&5
printf "%s\n" "$ac_cv_lib_ffi_ffi_call" >&6; }
if test "x$ac_cv_lib_ffi_ffi_call" = xyes
then :

          have_libffi=yes
          LIBFFI_CFLAGS=${LIBFFI_CFLAGS-""}
          LIBFFI_LIBS=${LIBFFI_LIBS-"-lffi"}

else case e in #(
  e) have_libffi=no ;;
esac
fi


fi


CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



else
        LIBFFI_CFLAGS=$pkg_cv_LIBFFI_CFLAGS
        LIBFFI_LIBS=$pkg_cv_LIBFFI_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_libffi=yes
fi

fi

if test "x$have_libffi" = xyes
then :

  ctypes_malloc_closure=no
  case $ac_sys_system in #(
  Darwin) :

            ctypes_malloc_closure=yes
     ;; #(
  iOS) :

      ctypes_malloc_closure=yes
     ;; #(
  sunos5) :
    as_fn_append LIBFFI_LIBS " -mimpure-text"
   ;; #(
  *) :
     ;;
esac
  if test "x$ctypes_malloc_closure" = xyes
then :

    MODULE__CTYPES_MALLOC_CLOSURE=_ctypes/malloc_closure.c
    as_fn_append LIBFFI_CFLAGS " -DUSING_MALLOC_CLOSURE_DOT_C=1"

fi


    if test "x$ac_cv_lib_dl_dlopen" = xyes
then :
  as_fn_append LIBFFI_LIBS " -ldl"
fi

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CFLAGS="$CFLAGS $LIBFFI_CFLAGS"
    LIBS="$LIBS $LIBFFI_LIBS"



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffi_prep_cif_var" >&5
printf %s "checking for ffi_prep_cif_var... " >&6; }
if test ${ac_cv_func_ffi_prep_cif_var+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ffi.h>
int
main (void)
{
void *x=ffi_prep_cif_var
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_ffi_prep_cif_var=yes
else case e in #(
  e) ac_cv_func_ffi_prep_cif_var=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_ffi_prep_cif_var" >&5
printf "%s\n" "$ac_cv_func_ffi_prep_cif_var" >&6; }
  if test "x$ac_cv_func_ffi_prep_cif_var" = xyes
then :

printf "%s\n" "#define HAVE_FFI_PREP_CIF_VAR 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffi_prep_closure_loc" >&5
printf %s "checking for ffi_prep_closure_loc... " >&6; }
if test ${ac_cv_func_ffi_prep_closure_loc+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ffi.h>
int
main (void)
{
void *x=ffi_prep_closure_loc
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_ffi_prep_closure_loc=yes
else case e in #(
  e) ac_cv_func_ffi_prep_closure_loc=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_ffi_prep_closure_loc" >&5
printf "%s\n" "$ac_cv_func_ffi_prep_closure_loc" >&6; }
  if test "x$ac_cv_func_ffi_prep_closure_loc" = xyes
then :

printf "%s\n" "#define HAVE_FFI_PREP_CLOSURE_LOC 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffi_closure_alloc" >&5
printf %s "checking for ffi_closure_alloc... " >&6; }
if test ${ac_cv_func_ffi_closure_alloc+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ffi.h>
int
main (void)
{
void *x=ffi_closure_alloc
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_ffi_closure_alloc=yes
else case e in #(
  e) ac_cv_func_ffi_closure_alloc=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_ffi_closure_alloc" >&5
printf "%s\n" "$ac_cv_func_ffi_closure_alloc" >&6; }
  if test "x$ac_cv_func_ffi_closure_alloc" = xyes
then :

printf "%s\n" "#define HAVE_FFI_CLOSURE_ALLOC 1" >>confdefs.h

fi




CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



fi

# Check for libffi with real complex double support.
# This is a workaround, since FFI_TARGET_HAS_COMPLEX_TYPE was defined in libffi v3.2.1,
# but real support was provided only in libffi v3.3.0.
# See https://github.com/python/cpython/issues/125206 for more details.
#
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking libffi has complex type support" >&5
printf %s "checking libffi has complex type support... " >&6; }
if test ${ac_cv_ffi_complex_double_supported+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


 CPPFLAGS="$CPPFLAGS $LIBFFI_CFLAGS"
 LIBS="$LIBS $LIBFFI_LIBS"
if test "$cross_compiling" = yes
then :
  ac_cv_ffi_complex_double_supported=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <complex.h>
#include <ffi.h>
int z_is_expected(double complex z)
{
    const double complex expected = 1.25 - 0.5 * I;
    return z == expected;
}
int main(void)
{
    double complex z = 1.25 - 0.5 * I;
    ffi_type *args[1] = {&ffi_type_complex_double};
    void *values[1] = {&z};
    ffi_cif cif;
    if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
        &ffi_type_sint, args) != FFI_OK)
    {
        return 2;
    }
    ffi_arg rc;
    ffi_call(&cif, FFI_FN(z_is_expected), &rc, values);
    return !rc;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_ffi_complex_double_supported=yes
else case e in #(
  e) ac_cv_ffi_complex_double_supported=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi


CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS

 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ffi_complex_double_supported" >&5
printf "%s\n" "$ac_cv_ffi_complex_double_supported" >&6; }
if test "$ac_cv_ffi_complex_double_supported" = "yes"; then

printf "%s\n" "#define _Py_FFI_SUPPORT_C_COMPLEX 1" >>confdefs.h

fi

# Check for native half-float type (_Float16).
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _Float16 support" >&5
printf %s "checking for _Float16 support... " >&6; }
if test ${ac_cv_float16_supported+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


CFLAGS="$CFLAGS -O0"
if test "$cross_compiling" = yes
then :
  ac_cv_float16_supported=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <math.h>
int main(void)
{
    _Float16 val = 1.0f16;
    int test = isinf(val) || isnan(val); /* basic support from libm */
    double d = 3.14;
    val = d;
    return test;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_float16_supported=yes
else case e in #(
  e) ac_cv_float16_supported=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS

 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_float16_supported" >&5
printf "%s\n" "$ac_cv_float16_supported" >&6; }
if test "x$ac_cv_float16_supported" = xyes
then :

printf "%s\n" "#define HAVE_FLOAT16 1" >>confdefs.h

fi


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libmpdec >= 2.5.0" >&5
printf %s "checking for libmpdec >= 2.5.0... " >&6; }

if test -n "$LIBMPDEC_CFLAGS"; then
    pkg_cv_LIBMPDEC_CFLAGS="$LIBMPDEC_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmpdec >= 2.5.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libmpdec >= 2.5.0") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBMPDEC_CFLAGS=`$PKG_CONFIG --cflags "libmpdec >= 2.5.0" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$LIBMPDEC_LIBS"; then
    pkg_cv_LIBMPDEC_LIBS="$LIBMPDEC_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmpdec >= 2.5.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libmpdec >= 2.5.0") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBMPDEC_LIBS=`$PKG_CONFIG --libs "libmpdec >= 2.5.0" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                LIBMPDEC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libmpdec >= 2.5.0" 2>&1`
        else
                LIBMPDEC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libmpdec >= 2.5.0" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBMPDEC_PKG_ERRORS" >&5


  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $LIBMPDEC_CFLAGS"
    LIBS="$LIBS $LIBMPDEC_LIBS"
    ac_fn_c_check_header_compile "$LINENO" "mpdecimal.h" "ac_cv_header_mpdecimal_h" "$ac_includes_default"
if test "x$ac_cv_header_mpdecimal_h" = xyes
then :

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mpd_version in -lmpdec" >&5
printf %s "checking for mpd_version in -lmpdec... " >&6; }
if test ${ac_cv_lib_mpdec_mpd_version+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lmpdec  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char mpd_version (void);
int
main (void)
{
return mpd_version ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_mpdec_mpd_version=yes
else case e in #(
  e) ac_cv_lib_mpdec_mpd_version=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpdec_mpd_version" >&5
printf "%s\n" "$ac_cv_lib_mpdec_mpd_version" >&6; }
if test "x$ac_cv_lib_mpdec_mpd_version" = xyes
then :

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


            #include <mpdecimal.h>
            #if MPD_VERSION_HEX < 0x02050000
            #  error "mpdecimal 2.5.0 or higher required"
            #endif

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  have_mpdec=yes
else case e in #(
  e) have_mpdec=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

else case e in #(
  e) have_mpdec=no ;;
esac
fi


else case e in #(
  e) have_mpdec=no ;;
esac
fi


    if test "x$have_mpdec" = xyes
then :

     LIBMPDEC_CFLAGS=${LIBMPDEC_CFLAGS-""}
     LIBMPDEC_LIBS=${LIBMPDEC_LIBS-"-lmpdec -lm"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $LIBMPDEC_CFLAGS"
    LIBS="$LIBS $LIBMPDEC_LIBS"
    ac_fn_c_check_header_compile "$LINENO" "mpdecimal.h" "ac_cv_header_mpdecimal_h" "$ac_includes_default"
if test "x$ac_cv_header_mpdecimal_h" = xyes
then :

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mpd_version in -lmpdec" >&5
printf %s "checking for mpd_version in -lmpdec... " >&6; }
if test ${ac_cv_lib_mpdec_mpd_version+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lmpdec  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char mpd_version (void);
int
main (void)
{
return mpd_version ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_mpdec_mpd_version=yes
else case e in #(
  e) ac_cv_lib_mpdec_mpd_version=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpdec_mpd_version" >&5
printf "%s\n" "$ac_cv_lib_mpdec_mpd_version" >&6; }
if test "x$ac_cv_lib_mpdec_mpd_version" = xyes
then :

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


            #include <mpdecimal.h>
            #if MPD_VERSION_HEX < 0x02050000
            #  error "mpdecimal 2.5.0 or higher required"
            #endif

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  have_mpdec=yes
else case e in #(
  e) have_mpdec=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

else case e in #(
  e) have_mpdec=no ;;
esac
fi


else case e in #(
  e) have_mpdec=no ;;
esac
fi


    if test "x$have_mpdec" = xyes
then :

     LIBMPDEC_CFLAGS=${LIBMPDEC_CFLAGS-""}
     LIBMPDEC_LIBS=${LIBMPDEC_LIBS-"-lmpdec -lm"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



else
        LIBMPDEC_CFLAGS=$pkg_cv_LIBMPDEC_CFLAGS
        LIBMPDEC_LIBS=$pkg_cv_LIBMPDEC_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_mpdec=yes
fi

# Check whether _decimal should use a coroutine-local or thread-local context
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-decimal-contextvar" >&5
printf %s "checking for --with-decimal-contextvar... " >&6; }

# Check whether --with-decimal_contextvar was given.
if test ${with_decimal_contextvar+y}
then :
  withval=$with_decimal_contextvar;
else case e in #(
  e) with_decimal_contextvar="yes" ;;
esac
fi


if test "$with_decimal_contextvar" != "no"
then

printf "%s\n" "#define WITH_DECIMAL_CONTEXTVAR 1" >>confdefs.h

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_decimal_contextvar" >&5
printf "%s\n" "$with_decimal_contextvar" >&6; }




  if test "$ac_sys_system" = "Emscripten" -a -z "$LIBSQLITE3_CFLAGS" -a -z "$LIBSQLITE3_LIBS"
then :

    LIBSQLITE3_CFLAGS="-sUSE_SQLITE3"
    LIBSQLITE3_LIBS="-sUSE_SQLITE3"

fi





pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3 >= 3.15.2" >&5
printf %s "checking for sqlite3 >= 3.15.2... " >&6; }

if test -n "$LIBSQLITE3_CFLAGS"; then
    pkg_cv_LIBSQLITE3_CFLAGS="$LIBSQLITE3_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sqlite3 >= 3.15.2\""; } >&5
  ($PKG_CONFIG --exists --print-errors "sqlite3 >= 3.15.2") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBSQLITE3_CFLAGS=`$PKG_CONFIG --cflags "sqlite3 >= 3.15.2" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$LIBSQLITE3_LIBS"; then
    pkg_cv_LIBSQLITE3_LIBS="$LIBSQLITE3_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sqlite3 >= 3.15.2\""; } >&5
  ($PKG_CONFIG --exists --print-errors "sqlite3 >= 3.15.2") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBSQLITE3_LIBS=`$PKG_CONFIG --libs "sqlite3 >= 3.15.2" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                LIBSQLITE3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sqlite3 >= 3.15.2" 2>&1`
        else
                LIBSQLITE3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sqlite3 >= 3.15.2" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBSQLITE3_PKG_ERRORS" >&5


    LIBSQLITE3_CFLAGS=${LIBSQLITE3_CFLAGS-""}
    LIBSQLITE3_LIBS=${LIBSQLITE3_LIBS-"-lsqlite3"}


elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

    LIBSQLITE3_CFLAGS=${LIBSQLITE3_CFLAGS-""}
    LIBSQLITE3_LIBS=${LIBSQLITE3_LIBS-"-lsqlite3"}


else
        LIBSQLITE3_CFLAGS=$pkg_cv_LIBSQLITE3_CFLAGS
        LIBSQLITE3_LIBS=$pkg_cv_LIBSQLITE3_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

fi
as_fn_append LIBSQLITE3_CFLAGS ' -I$(srcdir)/Modules/_sqlite'



save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  CPPFLAGS="$CPPFLAGS $LIBSQLITE3_CFLAGS"
  LIBS="$LIBS $LIBSQLITE3_LIBS"

  ac_fn_c_check_header_compile "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default"
if test "x$ac_cv_header_sqlite3_h" = xyes
then :

    have_sqlite3=yes

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


        #include <sqlite3.h>
        #if SQLITE_VERSION_NUMBER < 3015002
        #  error "SQLite 3.15.2 or higher required"
        #endif

int
main (void)
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

      have_supported_sqlite3=yes

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_bind_double in -lsqlite3" >&5
printf %s "checking for sqlite3_bind_double in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_bind_double+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_bind_double (void);
int
main (void)
{
return sqlite3_bind_double ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_bind_double=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_bind_double=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_bind_double" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_bind_double" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_bind_double" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_column_decltype in -lsqlite3" >&5
printf %s "checking for sqlite3_column_decltype in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_column_decltype+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_column_decltype (void);
int
main (void)
{
return sqlite3_column_decltype ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_column_decltype=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_column_decltype=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_column_decltype" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_column_decltype" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_column_decltype" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_column_double in -lsqlite3" >&5
printf %s "checking for sqlite3_column_double in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_column_double+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_column_double (void);
int
main (void)
{
return sqlite3_column_double ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_column_double=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_column_double=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_column_double" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_column_double" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_column_double" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_complete in -lsqlite3" >&5
printf %s "checking for sqlite3_complete in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_complete+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_complete (void);
int
main (void)
{
return sqlite3_complete ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_complete=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_complete=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_complete" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_complete" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_complete" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_progress_handler in -lsqlite3" >&5
printf %s "checking for sqlite3_progress_handler in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_progress_handler+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_progress_handler (void);
int
main (void)
{
return sqlite3_progress_handler ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_progress_handler=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_progress_handler=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_progress_handler" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_progress_handler" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_progress_handler" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_result_double in -lsqlite3" >&5
printf %s "checking for sqlite3_result_double in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_result_double+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_result_double (void);
int
main (void)
{
return sqlite3_result_double ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_result_double=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_result_double=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_result_double" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_result_double" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_result_double" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_set_authorizer in -lsqlite3" >&5
printf %s "checking for sqlite3_set_authorizer in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_set_authorizer+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_set_authorizer (void);
int
main (void)
{
return sqlite3_set_authorizer ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_set_authorizer=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_set_authorizer=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_set_authorizer" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_set_authorizer" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_set_authorizer" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_trace_v2 in -lsqlite3" >&5
printf %s "checking for sqlite3_trace_v2 in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_trace_v2+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_trace_v2 (void);
int
main (void)
{
return sqlite3_trace_v2 ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_trace_v2=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_trace_v2=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_trace_v2" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_trace_v2" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_trace_v2" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_trace in -lsqlite3" >&5
printf %s "checking for sqlite3_trace in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_trace+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_trace (void);
int
main (void)
{
return sqlite3_trace ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_trace=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_trace=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_trace" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_trace" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_trace" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi



   ;;
esac
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_value_double in -lsqlite3" >&5
printf %s "checking for sqlite3_value_double in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_value_double+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_value_double (void);
int
main (void)
{
return sqlite3_value_double ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_value_double=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_value_double=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_value_double" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_value_double" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_value_double" = xyes
then :
  printf "%s\n" "#define HAVE_LIBSQLITE3 1" >>confdefs.h

  LIBS="-lsqlite3 $LIBS"

else case e in #(
  e)
    have_supported_sqlite3=no
   ;;
esac
fi


      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_load_extension in -lsqlite3" >&5
printf %s "checking for sqlite3_load_extension in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_load_extension+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_load_extension (void);
int
main (void)
{
return sqlite3_load_extension ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_load_extension=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_load_extension=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_load_extension" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_load_extension" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_load_extension" = xyes
then :
  have_sqlite3_load_extension=yes
else case e in #(
  e) have_sqlite3_load_extension=no
       ;;
esac
fi

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3_serialize in -lsqlite3" >&5
printf %s "checking for sqlite3_serialize in -lsqlite3... " >&6; }
if test ${ac_cv_lib_sqlite3_sqlite3_serialize+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char sqlite3_serialize (void);
int
main (void)
{
return sqlite3_serialize ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_sqlite3_sqlite3_serialize=yes
else case e in #(
  e) ac_cv_lib_sqlite3_sqlite3_serialize=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_serialize" >&5
printf "%s\n" "$ac_cv_lib_sqlite3_sqlite3_serialize" >&6; }
if test "x$ac_cv_lib_sqlite3_sqlite3_serialize" = xyes
then :


printf "%s\n" "#define PY_SQLITE_HAVE_SERIALIZE 1" >>confdefs.h


fi


else case e in #(
  e)
      have_supported_sqlite3=no
     ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

fi


CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-loadable-sqlite-extensions" >&5
printf %s "checking for --enable-loadable-sqlite-extensions... " >&6; }
# Check whether --enable-loadable-sqlite-extensions was given.
if test ${enable_loadable_sqlite_extensions+y}
then :
  enableval=$enable_loadable_sqlite_extensions;
    if test "x$have_sqlite3_load_extension" = xno
then :

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: n/a" >&5
printf "%s\n" "n/a" >&6; }
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Your version of SQLite does not support loadable extensions" >&5
printf "%s\n" "$as_me: WARNING: Your version of SQLite does not support loadable extensions" >&2;}

else case e in #(
  e)
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define PY_SQLITE_ENABLE_LOAD_EXTENSION 1" >>confdefs.h

     ;;
esac
fi

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

 ;;
esac
fi


found_tcltk=no
for _QUERY in \
  "tcl >= 8.5.12 tk >= 8.5.12" \
  "tcl8.6 tk8.6" \
  "tcl86 tk86" \
  "tcl8.5 >= 8.5.12 tk8.5 >= 8.5.12" \
  "tcl85 >= 8.5.12 tk85 >= 8.5.12" \
; do
  if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$_QUERY\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$_QUERY") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $_QUERY" >&5
printf %s "checking for $_QUERY... " >&6; }

if test -n "$TCLTK_CFLAGS"; then
    pkg_cv_TCLTK_CFLAGS="$TCLTK_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$_QUERY\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$_QUERY") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_TCLTK_CFLAGS=`$PKG_CONFIG --cflags "$_QUERY" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$TCLTK_LIBS"; then
    pkg_cv_TCLTK_LIBS="$TCLTK_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$_QUERY\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$_QUERY") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_TCLTK_LIBS=`$PKG_CONFIG --libs "$_QUERY" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                TCLTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$_QUERY" 2>&1`
        else
                TCLTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$_QUERY" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$TCLTK_PKG_ERRORS" >&5

        found_tcltk=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        found_tcltk=no
else
        TCLTK_CFLAGS=$pkg_cv_TCLTK_CFLAGS
        TCLTK_LIBS=$pkg_cv_TCLTK_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        found_tcltk=yes
fi

fi
  if test "x$found_tcltk" = xyes
then :
  break
fi
done

if test "x$found_tcltk" = xno
then :

  TCLTK_CFLAGS=${TCLTK_CFLAGS-""}
  TCLTK_LIBS=${TCLTK_LIBS-""}

fi

case $ac_sys_system in #(
  FreeBSD*) :

    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5
  ($PKG_CONFIG --exists --print-errors "x11") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for x11" >&5
printf %s "checking for x11... " >&6; }

if test -n "$X11_CFLAGS"; then
    pkg_cv_X11_CFLAGS="$X11_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5
  ($PKG_CONFIG --exists --print-errors "x11") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_X11_CFLAGS=`$PKG_CONFIG --cflags "x11" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$X11_LIBS"; then
    pkg_cv_X11_LIBS="$X11_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5
  ($PKG_CONFIG --exists --print-errors "x11") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_X11_LIBS=`$PKG_CONFIG --libs "x11" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "x11" 2>&1`
        else
                X11_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "x11" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$X11_PKG_ERRORS" >&5

        as_fn_error $? "Package requirements (x11) were not met:

$X11_PKG_ERRORS

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables X11_CFLAGS
and X11_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details." "$LINENO" 5
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.

Alternatively, you may set the environment variables X11_CFLAGS
and X11_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

To get pkg-config, see <http://pkg-config.freedesktop.org/>.
See 'config.log' for more details" "$LINENO" 5; }
else
        X11_CFLAGS=$pkg_cv_X11_CFLAGS
        X11_LIBS=$pkg_cv_X11_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

        TCLTK_CFLAGS="$TCLTK_CFLAGS $X11_CFLAGS"
        TCLTK_LIBS="$TCLTK_LIBS $X11_LIBS"

fi

fi

 ;; #(
  *) :
     ;;
esac

save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  CPPFLAGS="$CPPFLAGS $TCLTK_CFLAGS"
  LIBS="$LIBS $TCLTK_LIBS"

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


      #include <tcl.h>
      #include <tk.h>
      #if defined(TK_HEX_VERSION)
      #  if TK_HEX_VERSION < 0x0805020c
      #    error "Tk older than 8.5.12 not supported"
      #  endif
      #endif
      #if (TCL_MAJOR_VERSION < 8) || \
          ((TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION < 5)) || \
          ((TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION == 5) && (TCL_RELEASE_SERIAL < 12))
      #  error "Tcl older than 8.5.12 not supported"
      #endif
      #if (TK_MAJOR_VERSION < 8) || \
          ((TK_MAJOR_VERSION == 8) && (TK_MINOR_VERSION < 5)) || \
          ((TK_MAJOR_VERSION == 8) && (TK_MINOR_VERSION == 5) && (TK_RELEASE_SERIAL < 12))
      #  error "Tk older than 8.5.12 not supported"
      #endif

int
main (void)
{

      Tcl_Init(NULL);
      Tk_Init(NULL);

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"
then :

    have_tcltk=yes
                as_fn_append TCLTK_CFLAGS " -Wno-strict-prototypes -DWITH_APPINIT=1"

else case e in #(
  e)
    have_tcltk=no
   ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS





save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  CPPFLAGS="$CPPFLAGS $GDBM_CFLAGS"
  LIBS="$LIBS $GDBM_LIBS"
         for ac_header in gdbm.h
do :
  ac_fn_c_check_header_compile "$LINENO" "gdbm.h" "ac_cv_header_gdbm_h" "$ac_includes_default"
if test "x$ac_cv_header_gdbm_h" = xyes
then :
  printf "%s\n" "#define HAVE_GDBM_H 1" >>confdefs.h

    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm" >&5
printf %s "checking for gdbm_open in -lgdbm... " >&6; }
if test ${ac_cv_lib_gdbm_gdbm_open+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lgdbm  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char gdbm_open (void);
int
main (void)
{
return gdbm_open ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_gdbm_gdbm_open=yes
else case e in #(
  e) ac_cv_lib_gdbm_gdbm_open=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gdbm_gdbm_open" >&5
printf "%s\n" "$ac_cv_lib_gdbm_gdbm_open" >&6; }
if test "x$ac_cv_lib_gdbm_gdbm_open" = xyes
then :

      have_gdbm=yes
      GDBM_LIBS=${GDBM_LIBS-"-lgdbm"}

else case e in #(
  e) have_gdbm=no ;;
esac
fi


else case e in #(
  e) have_gdbm=no ;;
esac
fi

done

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



       for ac_header in ndbm.h
do :
  ac_fn_c_check_header_compile "$LINENO" "ndbm.h" "ac_cv_header_ndbm_h" "$ac_includes_default"
if test "x$ac_cv_header_ndbm_h" = xyes
then :
  printf "%s\n" "#define HAVE_NDBM_H 1" >>confdefs.h

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dbm_open" >&5
printf %s "checking for library containing dbm_open... " >&6; }
if test ${ac_cv_search_dbm_open+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char dbm_open (void);
int
main (void)
{
return dbm_open ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' ndbm gdbm_compat
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_dbm_open=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_dbm_open+y}
then :
  break
fi
done
if test ${ac_cv_search_dbm_open+y}
then :

else case e in #(
  e) ac_cv_search_dbm_open=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dbm_open" >&5
printf "%s\n" "$ac_cv_search_dbm_open" >&6; }
ac_res=$ac_cv_search_dbm_open
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi


CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



fi

done

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ndbm presence and linker args" >&5
printf %s "checking for ndbm presence and linker args... " >&6; }
case $ac_cv_search_dbm_open in #(
  *ndbm*|*gdbm_compat*) :

    dbm_ndbm="$ac_cv_search_dbm_open"
    have_ndbm=yes
   ;; #(
  none*) :

    dbm_ndbm=""
    have_ndbm=yes
   ;; #(
  no) :
    have_ndbm=no
 ;; #(
  *) :
     ;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_ndbm ($dbm_ndbm)" >&5
printf "%s\n" "$have_ndbm ($dbm_ndbm)" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gdbm/ndbm.h" >&5
printf %s "checking for gdbm/ndbm.h... " >&6; }
if test ${ac_cv_header_gdbm_slash_ndbm_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <gdbm/ndbm.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"
then :
  ac_cv_header_gdbm_slash_ndbm_h=yes
else case e in #(
  e) ac_cv_header_gdbm_slash_ndbm_h=no ;;
esac
fi
rm -f conftest.err conftest.i conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_gdbm_slash_ndbm_h" >&5
printf "%s\n" "$ac_cv_header_gdbm_slash_ndbm_h" >&6; }
if test "x$ac_cv_header_gdbm_slash_ndbm_h" = xyes
then :


printf "%s\n" "#define HAVE_GDBM_NDBM_H 1" >>confdefs.h


fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gdbm-ndbm.h" >&5
printf %s "checking for gdbm-ndbm.h... " >&6; }
if test ${ac_cv_header_gdbm_dash_ndbm_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <gdbm-ndbm.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"
then :
  ac_cv_header_gdbm_dash_ndbm_h=yes
else case e in #(
  e) ac_cv_header_gdbm_dash_ndbm_h=no ;;
esac
fi
rm -f conftest.err conftest.i conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_gdbm_dash_ndbm_h" >&5
printf "%s\n" "$ac_cv_header_gdbm_dash_ndbm_h" >&6; }
if test "x$ac_cv_header_gdbm_dash_ndbm_h" = xyes
then :


printf "%s\n" "#define HAVE_GDBM_DASH_NDBM_H 1" >>confdefs.h


fi

if test "$ac_cv_header_gdbm_slash_ndbm_h" = yes -o "$ac_cv_header_gdbm_dash_ndbm_h" = yes; then
  { ac_cv_search_dbm_open=; unset ac_cv_search_dbm_open;}
  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dbm_open" >&5
printf %s "checking for library containing dbm_open... " >&6; }
if test ${ac_cv_search_dbm_open+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char dbm_open (void);
int
main (void)
{
return dbm_open ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' gdbm_compat
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_dbm_open=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_dbm_open+y}
then :
  break
fi
done
if test ${ac_cv_search_dbm_open+y}
then :

else case e in #(
  e) ac_cv_search_dbm_open=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dbm_open" >&5
printf "%s\n" "$ac_cv_search_dbm_open" >&6; }
ac_res=$ac_cv_search_dbm_open
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
  have_gdbm_compat=yes
else case e in #(
  e) have_gdbm_compat=no ;;
esac
fi


CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS


fi

# Check for libdb >= 5 with dbm_open()
# db.h re-defines the name of the function
       for ac_header in db.h
do :
  ac_fn_c_check_header_compile "$LINENO" "db.h" "ac_cv_header_db_h" "$ac_includes_default"
if test "x$ac_cv_header_db_h" = xyes
then :
  printf "%s\n" "#define HAVE_DB_H 1" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libdb" >&5
printf %s "checking for libdb... " >&6; }
if test ${ac_cv_have_libdb+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


      LIBS="$LIBS -ldb"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

        #define DB_DBM_HSEARCH 1
        #include <db.h>
        #if DB_VERSION_MAJOR < 5
          #error "dh.h: DB_VERSION_MAJOR < 5 is not supported."
        #endif

int
main (void)
{
DBM *dbm = dbm_open(NULL, 0, 0)
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_have_libdb=yes
else case e in #(
  e) ac_cv_have_libdb=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS


   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_libdb" >&5
printf "%s\n" "$ac_cv_have_libdb" >&6; }
  if test "x$ac_cv_have_libdb" = xyes
then :


printf "%s\n" "#define HAVE_LIBDB 1" >>confdefs.h


fi

fi

done

# Check for --with-dbmliborder
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-dbmliborder" >&5
printf %s "checking for --with-dbmliborder... " >&6; }

# Check whether --with-dbmliborder was given.
if test ${with_dbmliborder+y}
then :
  withval=$with_dbmliborder;
else case e in #(
  e) with_dbmliborder=gdbm:ndbm:bdb ;;
esac
fi


have_gdbm_dbmliborder=no
as_save_IFS=$IFS
IFS=:
for db in $with_dbmliborder; do
    case $db in #(
  ndbm) :
     ;; #(
  gdbm) :
    have_gdbm_dbmliborder=yes ;; #(
  bdb) :
     ;; #(
  *) :
    with_dbmliborder=error
     ;;
esac
done
IFS=$as_save_IFS
if test "x$with_dbmliborder" = xerror
then :

  as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:... (gdbm:ndbm:bdb)" "$LINENO" 5

fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_dbmliborder" >&5
printf "%s\n" "$with_dbmliborder" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _dbm module CFLAGS and LIBS" >&5
printf %s "checking for _dbm module CFLAGS and LIBS... " >&6; }
have_dbm=no
as_save_IFS=$IFS
IFS=:
for db in $with_dbmliborder; do
  case "$db" in
    ndbm)
      if test "$have_ndbm" = yes; then
        DBM_CFLAGS="-DUSE_NDBM"
        DBM_LIBS="$dbm_ndbm"
        have_dbm=yes
        break
      fi
      ;;
    gdbm)
      if test "$have_gdbm_compat" = yes; then
        DBM_CFLAGS="-DUSE_GDBM_COMPAT"
        DBM_LIBS="-lgdbm_compat"
        have_dbm=yes
        break
      fi
      ;;
    bdb)
      if test "$ac_cv_have_libdb" = yes; then
        DBM_CFLAGS="-DUSE_BERKDB"
        DBM_LIBS="-ldb"
        have_dbm=yes
        break
      fi
     ;;
  esac
done
IFS=$as_save_IFS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DBM_CFLAGS $DBM_LIBS" >&5
printf "%s\n" "$DBM_CFLAGS $DBM_LIBS" >&6; }

# Templates for things AC_DEFINEd more than once.
# For a single AC_DEFINE, no template is needed.


if test "$ac_cv_pthread_is_default" = yes
then
    # Defining _REENTRANT on system with POSIX threads should not hurt.
    printf "%s\n" "#define _REENTRANT 1" >>confdefs.h

    posix_threads=yes
    if test "$ac_sys_system" = "SunOS"; then
        CFLAGS="$CFLAGS -D_REENTRANT"
    fi
elif test "$ac_cv_kpthread" = "yes"
then
    CC="$CC -Kpthread"
    if test "$ac_cv_cxx_thread" = "yes"; then
        CXX="$CXX -Kpthread"
    fi
    posix_threads=yes
elif test "$ac_cv_kthread" = "yes"
then
    CC="$CC -Kthread"
    if test "$ac_cv_cxx_thread" = "yes"; then
        CXX="$CXX -Kthread"
    fi
    posix_threads=yes
elif test "$ac_cv_pthread" = "yes"
then
    CC="$CC -pthread"
    if test "$ac_cv_cxx_thread" = "yes"; then
        CXX="$CXX -pthread"
    fi
    posix_threads=yes
else
    if test ! -z "$withval" -a -d "$withval"
    then LDFLAGS="$LDFLAGS -L$withval"
    fi

    # According to the POSIX spec, a pthreads implementation must
    # define _POSIX_THREADS in unistd.h. Some apparently don't
    # (e.g. gnu pth with pthread emulation)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _POSIX_THREADS in unistd.h" >&5
printf %s "checking for _POSIX_THREADS in unistd.h... " >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _POSIX_THREADS defined in unistd.h" >&5
printf %s "checking for _POSIX_THREADS defined in unistd.h... " >&6; }
if test ${ac_cv_defined__POSIX_THREADS_unistd_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{

  #ifdef _POSIX_THREADS
  int ok;
  (void)ok;
  #else
  choke me
  #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_defined__POSIX_THREADS_unistd_h=yes
else case e in #(
  e) ac_cv_defined__POSIX_THREADS_unistd_h=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined__POSIX_THREADS_unistd_h" >&5
printf "%s\n" "$ac_cv_defined__POSIX_THREADS_unistd_h" >&6; }
if test $ac_cv_defined__POSIX_THREADS_unistd_h != "no"
then :
  unistd_defines_pthreads=yes
else case e in #(
  e) unistd_defines_pthreads=no ;;
esac
fi
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $unistd_defines_pthreads" >&5
printf "%s\n" "$unistd_defines_pthreads" >&6; }

    printf "%s\n" "#define _REENTRANT 1" >>confdefs.h

    # Just looking for pthread_create in libpthread is not enough:
    # on HP/UX, pthread.h renames pthread_create to a different symbol name.
    # So we really have to include pthread.h, and then link.
    _libs=$LIBS
    LIBS="$LIBS -lpthread"
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
printf %s "checking for pthread_create in -lpthread... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void * start_routine (void *arg) { exit (0); }
int
main (void)
{

pthread_create (NULL, NULL, start_routine, NULL)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :

    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
    posix_threads=yes

else case e in #(
  e)
    LIBS=$_libs
    ac_fn_c_check_func "$LINENO" "pthread_detach" "ac_cv_func_pthread_detach"
if test "x$ac_cv_func_pthread_detach" = xyes
then :

    posix_threads=yes

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthreads" >&5
printf %s "checking for pthread_create in -lpthreads... " >&6; }
if test ${ac_cv_lib_pthreads_pthread_create+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthreads  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char pthread_create (void);
int
main (void)
{
return pthread_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_pthreads_pthread_create=yes
else case e in #(
  e) ac_cv_lib_pthreads_pthread_create=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_create" >&5
printf "%s\n" "$ac_cv_lib_pthreads_pthread_create" >&6; }
if test "x$ac_cv_lib_pthreads_pthread_create" = xyes
then :

    posix_threads=yes
    LIBS="$LIBS -lpthreads"

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
printf %s "checking for pthread_create in -lc_r... " >&6; }
if test ${ac_cv_lib_c_r_pthread_create+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc_r  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char pthread_create (void);
int
main (void)
{
return pthread_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_c_r_pthread_create=yes
else case e in #(
  e) ac_cv_lib_c_r_pthread_create=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
printf "%s\n" "$ac_cv_lib_c_r_pthread_create" >&6; }
if test "x$ac_cv_lib_c_r_pthread_create" = xyes
then :

    posix_threads=yes
    LIBS="$LIBS -lc_r"

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __pthread_create_system in -lpthread" >&5
printf %s "checking for __pthread_create_system in -lpthread... " >&6; }
if test ${ac_cv_lib_pthread___pthread_create_system+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char __pthread_create_system (void);
int
main (void)
{
return __pthread_create_system ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_pthread___pthread_create_system=yes
else case e in #(
  e) ac_cv_lib_pthread___pthread_create_system=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_create_system" >&5
printf "%s\n" "$ac_cv_lib_pthread___pthread_create_system" >&6; }
if test "x$ac_cv_lib_pthread___pthread_create_system" = xyes
then :

    posix_threads=yes
    LIBS="$LIBS -lpthread"

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lcma" >&5
printf %s "checking for pthread_create in -lcma... " >&6; }
if test ${ac_cv_lib_cma_pthread_create+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lcma  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char pthread_create (void);
int
main (void)
{
return pthread_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_cma_pthread_create=yes
else case e in #(
  e) ac_cv_lib_cma_pthread_create=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cma_pthread_create" >&5
printf "%s\n" "$ac_cv_lib_cma_pthread_create" >&6; }
if test "x$ac_cv_lib_cma_pthread_create" = xyes
then :

    posix_threads=yes
    LIBS="$LIBS -lcma"

else case e in #(
  e)
    case $ac_sys_system in #(
  WASI) :
    posix_threads=stub ;; #(
  *) :
    as_fn_error $? "could not find pthreads on your system" "$LINENO" 5
     ;;
esac
     ;;
esac
fi
 ;;
esac
fi
 ;;
esac
fi
 ;;
esac
fi
 ;;
esac
fi
 ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext

    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for usconfig in -lmpc" >&5
printf %s "checking for usconfig in -lmpc... " >&6; }
if test ${ac_cv_lib_mpc_usconfig+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lmpc  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char usconfig (void);
int
main (void)
{
return usconfig ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_mpc_usconfig=yes
else case e in #(
  e) ac_cv_lib_mpc_usconfig=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpc_usconfig" >&5
printf "%s\n" "$ac_cv_lib_mpc_usconfig" >&6; }
if test "x$ac_cv_lib_mpc_usconfig" = xyes
then :

    LIBS="$LIBS -lmpc"

fi


fi

if test "$posix_threads" = "yes"; then
      if test "$unistd_defines_pthreads" = "no"; then

printf "%s\n" "#define _POSIX_THREADS 1" >>confdefs.h

      fi

      # Bug 662787: Using semaphores causes unexplicable hangs on Solaris 8.
      case  $ac_sys_system/$ac_sys_release in
      SunOS/5.6)
printf "%s\n" "#define HAVE_PTHREAD_DESTRUCTOR 1" >>confdefs.h

		       ;;
      SunOS/5.8)
printf "%s\n" "#define HAVE_BROKEN_POSIX_SEMAPHORES 1" >>confdefs.h

		       ;;
      AIX/*)
printf "%s\n" "#define HAVE_BROKEN_POSIX_SEMAPHORES 1" >>confdefs.h

		       ;;
      NetBSD/*)
printf "%s\n" "#define HAVE_BROKEN_POSIX_SEMAPHORES 1" >>confdefs.h

		       ;;
      esac

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if PTHREAD_SCOPE_SYSTEM is supported" >&5
printf %s "checking if PTHREAD_SCOPE_SYSTEM is supported... " >&6; }
if test ${ac_cv_pthread_system_supported+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  ac_cv_pthread_system_supported=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <stdio.h>
      #include <pthread.h>
      void *foo(void *parm) {
        return NULL;
      }
      int main(void) {
        pthread_attr_t attr;
        pthread_t id;
        if (pthread_attr_init(&attr)) return (-1);
        if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) return (-1);
        if (pthread_create(&id, &attr, foo, NULL)) return (-1);
        if (pthread_join(id, NULL)) return (-1);
        return (0);
      }
_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_pthread_system_supported=yes
else case e in #(
  e) ac_cv_pthread_system_supported=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

       ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pthread_system_supported" >&5
printf "%s\n" "$ac_cv_pthread_system_supported" >&6; }
      if test "$ac_cv_pthread_system_supported" = "yes"; then

printf "%s\n" "#define PTHREAD_SYSTEM_SCHED_SUPPORTED 1" >>confdefs.h

      fi

  for ac_func in pthread_sigmask
do :
  ac_fn_c_check_func "$LINENO" "pthread_sigmask" "ac_cv_func_pthread_sigmask"
if test "x$ac_cv_func_pthread_sigmask" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_SIGMASK 1" >>confdefs.h
 case $ac_sys_system in
        CYGWIN*)

printf "%s\n" "#define HAVE_BROKEN_PTHREAD_SIGMASK 1" >>confdefs.h

            ;;
        esac
fi

done
      ac_fn_c_check_func "$LINENO" "pthread_getcpuclockid" "ac_cv_func_pthread_getcpuclockid"
if test "x$ac_cv_func_pthread_getcpuclockid" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_GETCPUCLOCKID 1" >>confdefs.h

fi

fi

if test "x$posix_threads" = xstub
then :


printf "%s\n" "#define HAVE_PTHREAD_STUBS 1" >>confdefs.h


fi

# Check for enable-ipv6

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if --enable-ipv6 is specified" >&5
printf %s "checking if --enable-ipv6 is specified... " >&6; }
# Check whether --enable-ipv6 was given.
if test ${enable_ipv6+y}
then :
  enableval=$enable_ipv6;  case "$enableval" in
  no)
       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
       ipv6=no
       ;;
  *)   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
       printf "%s\n" "#define ENABLE_IPV6 1" >>confdefs.h

       ipv6=yes
       ;;
  esac
else case e in #(
  e)
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 /* AF_INET6 available check */
#include <sys/types.h>
#include <sys/socket.h>
int
main (void)
{
int domain = AF_INET6;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

  ipv6=yes

else case e in #(
  e)
  ipv6=no
 ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

case $ac_sys_system in #(
  WASI) :
    ipv6=no
 ;; #(
  *) :
     ;;
esac

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ipv6" >&5
printf "%s\n" "$ipv6" >&6; }

if test "$ipv6" = "yes"; then
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if RFC2553 API is available" >&5
printf %s "checking if RFC2553 API is available... " >&6; }
	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

	  #include <sys/types.h>
#include <netinet/in.h>
int
main (void)
{
struct sockaddr_in6 x;
			    x.sin6_scope_id;
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
	  ipv6=yes

else case e in #(
  e)
	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
	  ipv6=no
	 ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

if test "$ipv6" = "yes"; then
	printf "%s\n" "#define ENABLE_IPV6 1" >>confdefs.h

fi
 ;;
esac
fi


ipv6type=unknown
ipv6lib=none
ipv6trylibc=no

if test "$ipv6" = yes -a "$cross_compiling" = no; then
	for i in inria kame linux-glibc linux-inet6 solaris toshiba v6d zeta;
	do
		case $i in
		inria)

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IPV6_INRIA_VERSION defined in netinet/in.h" >&5
printf %s "checking for IPV6_INRIA_VERSION defined in netinet/in.h... " >&6; }
if test ${ac_cv_defined_IPV6_INRIA_VERSION_netinet_in_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netinet/in.h>
int
main (void)
{

  #ifdef IPV6_INRIA_VERSION
  int ok;
  (void)ok;
  #else
  choke me
  #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_defined_IPV6_INRIA_VERSION_netinet_in_h=yes
else case e in #(
  e) ac_cv_defined_IPV6_INRIA_VERSION_netinet_in_h=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined_IPV6_INRIA_VERSION_netinet_in_h" >&5
printf "%s\n" "$ac_cv_defined_IPV6_INRIA_VERSION_netinet_in_h" >&6; }
if test $ac_cv_defined_IPV6_INRIA_VERSION_netinet_in_h != "no"
then :
  ipv6type=$i
fi
			;;
		kame)

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __KAME__ defined in netinet/in.h" >&5
printf %s "checking for __KAME__ defined in netinet/in.h... " >&6; }
if test ${ac_cv_defined___KAME___netinet_in_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netinet/in.h>
int
main (void)
{

  #ifdef __KAME__
  int ok;
  (void)ok;
  #else
  choke me
  #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_defined___KAME___netinet_in_h=yes
else case e in #(
  e) ac_cv_defined___KAME___netinet_in_h=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined___KAME___netinet_in_h" >&5
printf "%s\n" "$ac_cv_defined___KAME___netinet_in_h" >&6; }
if test $ac_cv_defined___KAME___netinet_in_h != "no"
then :
  ipv6type=$i
                             ipv6lib=inet6
                             ipv6libdir=/usr/local/v6/lib
                             ipv6trylibc=yes
fi
			;;
		linux-glibc)

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __GLIBC__ defined in features.h" >&5
printf %s "checking for __GLIBC__ defined in features.h... " >&6; }
if test ${ac_cv_defined___GLIBC___features_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <features.h>
int
main (void)
{

  #ifdef __GLIBC__
  int ok;
  (void)ok;
  #else
  choke me
  #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_defined___GLIBC___features_h=yes
else case e in #(
  e) ac_cv_defined___GLIBC___features_h=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined___GLIBC___features_h" >&5
printf "%s\n" "$ac_cv_defined___GLIBC___features_h" >&6; }
if test $ac_cv_defined___GLIBC___features_h != "no"
then :
  ipv6type=$i
                             ipv6trylibc=yes
fi
			;;
		linux-inet6)
						if test -d /usr/inet6; then
				ipv6type=$i
				ipv6lib=inet6
				ipv6libdir=/usr/inet6/lib
				BASECFLAGS="-I/usr/inet6/include $BASECFLAGS"
			fi
			;;
		solaris)
			if test -f /etc/netconfig; then
                          if $GREP -q tcp6 /etc/netconfig; then
				ipv6type=$i
				ipv6trylibc=yes
                          fi
                        fi
			;;
		toshiba)

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _TOSHIBA_INET6 defined in sys/param.h" >&5
printf %s "checking for _TOSHIBA_INET6 defined in sys/param.h... " >&6; }
if test ${ac_cv_defined__TOSHIBA_INET6_sys_param_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/param.h>
int
main (void)
{

  #ifdef _TOSHIBA_INET6
  int ok;
  (void)ok;
  #else
  choke me
  #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_defined__TOSHIBA_INET6_sys_param_h=yes
else case e in #(
  e) ac_cv_defined__TOSHIBA_INET6_sys_param_h=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined__TOSHIBA_INET6_sys_param_h" >&5
printf "%s\n" "$ac_cv_defined__TOSHIBA_INET6_sys_param_h" >&6; }
if test $ac_cv_defined__TOSHIBA_INET6_sys_param_h != "no"
then :
  ipv6type=$i
                             ipv6lib=inet6
                             ipv6libdir=/usr/local/v6/lib
fi
			;;
		v6d)

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __V6D__ defined in /usr/local/v6/include/sys/v6config.h" >&5
printf %s "checking for __V6D__ defined in /usr/local/v6/include/sys/v6config.h... " >&6; }
if test ${ac_cv_defined___V6D____usr_local_v6_include_sys_v6config_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include </usr/local/v6/include/sys/v6config.h>
int
main (void)
{

  #ifdef __V6D__
  int ok;
  (void)ok;
  #else
  choke me
  #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_defined___V6D____usr_local_v6_include_sys_v6config_h=yes
else case e in #(
  e) ac_cv_defined___V6D____usr_local_v6_include_sys_v6config_h=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined___V6D____usr_local_v6_include_sys_v6config_h" >&5
printf "%s\n" "$ac_cv_defined___V6D____usr_local_v6_include_sys_v6config_h" >&6; }
if test $ac_cv_defined___V6D____usr_local_v6_include_sys_v6config_h != "no"
then :
  ipv6type=$i
                             ipv6lib=v6
                             ipv6libdir=/usr/local/v6/lib
                             BASECFLAGS="-I/usr/local/v6/include $BASECFLAGS"
fi
			;;
		zeta)

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _ZETA_MINAMI_INET6 defined in sys/param.h" >&5
printf %s "checking for _ZETA_MINAMI_INET6 defined in sys/param.h... " >&6; }
if test ${ac_cv_defined__ZETA_MINAMI_INET6_sys_param_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/param.h>
int
main (void)
{

  #ifdef _ZETA_MINAMI_INET6
  int ok;
  (void)ok;
  #else
  choke me
  #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_defined__ZETA_MINAMI_INET6_sys_param_h=yes
else case e in #(
  e) ac_cv_defined__ZETA_MINAMI_INET6_sys_param_h=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined__ZETA_MINAMI_INET6_sys_param_h" >&5
printf "%s\n" "$ac_cv_defined__ZETA_MINAMI_INET6_sys_param_h" >&6; }
if test $ac_cv_defined__ZETA_MINAMI_INET6_sys_param_h != "no"
then :
  ipv6type=$i
                             ipv6lib=inet6
                             ipv6libdir=/usr/local/v6/lib
fi
			;;
		esac
		if test "$ipv6type" != "unknown"; then
			break
		fi
	done
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking ipv6 stack type" >&5
printf %s "checking ipv6 stack type... " >&6; }
	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ipv6type" >&5
printf "%s\n" "$ipv6type" >&6; }
fi

if test "$ipv6" = "yes" -a "$ipv6lib" != "none"; then
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking ipv6 library" >&5
printf %s "checking ipv6 library... " >&6; }
	if test -d $ipv6libdir -a -f $ipv6libdir/lib$ipv6lib.a; then
		LIBS="-L$ipv6libdir -l$ipv6lib $LIBS"
		{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: lib$ipv6lib" >&5
printf "%s\n" "lib$ipv6lib" >&6; }
	else
    if test "x$ipv6trylibc" = xyes
then :

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: libc" >&5
printf "%s\n" "libc" >&6; }

else case e in #(
  e)
      as_fn_error $? "No $ipv6lib library found; cannot continue. You need to fetch lib$ipv6lib.a from appropriate ipv6 kit and compile beforehand." "$LINENO" 5
     ;;
esac
fi
	fi
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking CAN_RAW_FD_FRAMES" >&5
printf %s "checking CAN_RAW_FD_FRAMES... " >&6; }
if test ${ac_cv_can_raw_fd_frames+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 /* CAN_RAW_FD_FRAMES available check */
#include <linux/can/raw.h>
int
main (void)
{
int can_raw_fd_frames = CAN_RAW_FD_FRAMES;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_can_raw_fd_frames=yes
else case e in #(
  e) ac_cv_can_raw_fd_frames=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_can_raw_fd_frames" >&5
printf "%s\n" "$ac_cv_can_raw_fd_frames" >&6; }
if test "x$ac_cv_can_raw_fd_frames" = xyes
then :


printf "%s\n" "#define HAVE_LINUX_CAN_RAW_FD_FRAMES 1" >>confdefs.h


fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CAN_RAW_JOIN_FILTERS" >&5
printf %s "checking for CAN_RAW_JOIN_FILTERS... " >&6; }
if test ${ac_cv_can_raw_join_filters+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <linux/can/raw.h>
int
main (void)
{
int can_raw_join_filters = CAN_RAW_JOIN_FILTERS;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_can_raw_join_filters=yes
else case e in #(
  e) ac_cv_can_raw_join_filters=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_can_raw_join_filters" >&5
printf "%s\n" "$ac_cv_can_raw_join_filters" >&6; }
if test "x$ac_cv_can_raw_join_filters" = xyes
then :


printf "%s\n" "#define HAVE_LINUX_CAN_RAW_JOIN_FILTERS 1" >>confdefs.h


fi

# Check for --with-doc-strings
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-doc-strings" >&5
printf %s "checking for --with-doc-strings... " >&6; }

# Check whether --with-doc-strings was given.
if test ${with_doc_strings+y}
then :
  withval=$with_doc_strings;
fi


if test -z "$with_doc_strings"
then with_doc_strings="yes"
fi
if test "$with_doc_strings" != "no"
then

printf "%s\n" "#define WITH_DOC_STRINGS 1" >>confdefs.h

fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_doc_strings" >&5
printf "%s\n" "$with_doc_strings" >&6; }

# Check for stdatomic.h, required for mimalloc.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdatomic.h" >&5
printf %s "checking for stdatomic.h... " >&6; }
if test ${ac_cv_header_stdatomic_h+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


    #include <stdatomic.h>
    atomic_int int_var;
    atomic_uintptr_t uintptr_var;
    int main() {
      atomic_store_explicit(&int_var, 5, memory_order_relaxed);
      atomic_store_explicit(&uintptr_var, 0, memory_order_relaxed);
      int loaded_value = atomic_load_explicit(&int_var, memory_order_seq_cst);
      return 0;
    }


_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_header_stdatomic_h=yes
else case e in #(
  e) ac_cv_header_stdatomic_h=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdatomic_h" >&5
printf "%s\n" "$ac_cv_header_stdatomic_h" >&6; }

if test "x$ac_cv_header_stdatomic_h" = xyes
then :


printf "%s\n" "#define HAVE_STD_ATOMIC 1" >>confdefs.h


fi

# Check for GCC >= 4.7 and clang __atomic builtin functions
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for builtin __atomic_load_n and __atomic_store_n functions" >&5
printf %s "checking for builtin __atomic_load_n and __atomic_store_n functions... " >&6; }
if test ${ac_cv_builtin_atomic+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


    int val;
    int main() {
      __atomic_store_n(&val, 1, __ATOMIC_SEQ_CST);
      (void)__atomic_load_n(&val, __ATOMIC_SEQ_CST);
      return 0;
    }


_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_builtin_atomic=yes
else case e in #(
  e) ac_cv_builtin_atomic=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_builtin_atomic" >&5
printf "%s\n" "$ac_cv_builtin_atomic" >&6; }

if test "x$ac_cv_builtin_atomic" = xyes
then :


printf "%s\n" "#define HAVE_BUILTIN_ATOMIC 1" >>confdefs.h


fi

# Check for __builtin_shufflevector with 128-bit vector support on an
# architecture where it compiles to worthwhile native SIMD instructions.
# Used for SIMD-accelerated bytes.hex() in Python/pystrhex.c.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_shufflevector" >&5
printf %s "checking for __builtin_shufflevector... " >&6; }
if test ${ac_cv_efficient_builtin_shufflevector+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


    /* __builtin_shufflevector is available on many platforms, but 128-bit
       vector code is only worthwhile on architectures with native SIMD:
       x86-64 (SSE2, always available), ARM64 (NEON, always available),
       or ARM32 when NEON is enabled via compiler flags (e.g. -march=native
       on RPi3+).  On ARM32 without NEON (e.g. armv6 builds), the compiler
       has the builtin but generates slow scalar code instead. */
    #if !defined(__x86_64__) && !defined(__aarch64__) && \
        !(defined(__arm__) && defined(__ARM_NEON))
    #  error "128-bit vector SIMD not worthwhile on this architecture"
    #endif
    typedef unsigned char v16u8 __attribute__((vector_size(16)));

int
main (void)
{

    v16u8 a = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    v16u8 b = {16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
    v16u8 c = __builtin_shufflevector(a, b,
        0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23);
    (void)c;
    return 0;

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_efficient_builtin_shufflevector=yes
else case e in #(
  e) ac_cv_efficient_builtin_shufflevector=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_efficient_builtin_shufflevector" >&5
printf "%s\n" "$ac_cv_efficient_builtin_shufflevector" >&6; }

if test "x$ac_cv_efficient_builtin_shufflevector" = xyes
then :


printf "%s\n" "#define _Py_HAVE_EFFICIENT_BUILTIN_SHUFFLEVECTOR 1" >>confdefs.h


fi

# --with-mimalloc
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-mimalloc" >&5
printf %s "checking for --with-mimalloc... " >&6; }

# Check whether --with-mimalloc was given.
if test ${with_mimalloc+y}
then :
  withval=$with_mimalloc;
else case e in #(
  e) with_mimalloc="$ac_cv_header_stdatomic_h"
 ;;
esac
fi


if test "$with_mimalloc" != no; then
  if test "$ac_cv_header_stdatomic_h" != yes; then
    # mimalloc-atomic.h wants C11 stdatomic.h on POSIX
    as_fn_error $? "mimalloc requires stdatomic.h, use --without-mimalloc to disable mimalloc." "$LINENO" 5
  fi
  with_mimalloc=yes

printf "%s\n" "#define WITH_MIMALLOC 1" >>confdefs.h

  MIMALLOC_HEADERS='$(MIMALLOC_HEADERS)'

elif test "$disable_gil" = "yes"; then
  as_fn_error $? "--disable-gil requires mimalloc memory allocator (--with-mimalloc)." "$LINENO" 5
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_mimalloc" >&5
printf "%s\n" "$with_mimalloc" >&6; }
INSTALL_MIMALLOC=$with_mimalloc



# Check for Python-specific malloc support
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc" >&5
printf %s "checking for --with-pymalloc... " >&6; }

# Check whether --with-pymalloc was given.
if test ${with_pymalloc+y}
then :
  withval=$with_pymalloc;
fi


if test -z "$with_pymalloc"
then
    case $ac_sys_system in #(
  Emscripten) :
    with_pymalloc="no" ;; #(
  WASI) :
    with_pymalloc="no" ;; #(
  *) :
    with_pymalloc="yes"
   ;;
esac
fi
if test "$with_pymalloc" != "no"
then

printf "%s\n" "#define WITH_PYMALLOC 1" >>confdefs.h

fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_pymalloc" >&5
printf "%s\n" "$with_pymalloc" >&6; }

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc-hugepages" >&5
printf %s "checking for --with-pymalloc-hugepages... " >&6; }

# Check whether --with-pymalloc-hugepages was given.
if test ${with_pymalloc_hugepages+y}
then :
  withval=$with_pymalloc_hugepages;
fi

if test "$with_pymalloc_hugepages" = "yes"
then
            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/mman.h>

int
main (void)
{

int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB;
(void)flags;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

printf "%s\n" "#define PYMALLOC_USE_HUGEPAGES 1" >>confdefs.h

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --with-pymalloc-hugepages requested but MAP_HUGETLB not found" >&5
printf "%s\n" "$as_me: WARNING: --with-pymalloc-hugepages requested but MAP_HUGETLB not found" >&2;}
       with_pymalloc_hugepages=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${with_pymalloc_hugepages:-no}" >&5
printf "%s\n" "${with_pymalloc_hugepages:-no}" >&6; }

# Check for --with-c-locale-coercion
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-c-locale-coercion" >&5
printf %s "checking for --with-c-locale-coercion... " >&6; }

# Check whether --with-c-locale-coercion was given.
if test ${with_c_locale_coercion+y}
then :
  withval=$with_c_locale_coercion;
fi


if test -z "$with_c_locale_coercion"
then
    with_c_locale_coercion="yes"
fi
if test "$with_c_locale_coercion" != "no"
then

printf "%s\n" "#define PY_COERCE_C_LOCALE 1" >>confdefs.h

fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_c_locale_coercion" >&5
printf "%s\n" "$with_c_locale_coercion" >&6; }

# Check for Valgrind support
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-valgrind" >&5
printf %s "checking for --with-valgrind... " >&6; }

# Check whether --with-valgrind was given.
if test ${with_valgrind+y}
then :
  withval=$with_valgrind;
else case e in #(
  e) with_valgrind=no
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_valgrind" >&5
printf "%s\n" "$with_valgrind" >&6; }
if test "$with_valgrind" != no; then
    ac_fn_c_check_header_compile "$LINENO" "valgrind/valgrind.h" "ac_cv_header_valgrind_valgrind_h" "$ac_includes_default"
if test "x$ac_cv_header_valgrind_valgrind_h" = xyes
then :

printf "%s\n" "#define WITH_VALGRIND 1" >>confdefs.h

else case e in #(
  e) as_fn_error $? "Valgrind support requested but headers not available" "$LINENO" 5
     ;;
esac
fi

    OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi

# Check for DTrace support
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-dtrace" >&5
printf %s "checking for --with-dtrace... " >&6; }

# Check whether --with-dtrace was given.
if test ${with_dtrace+y}
then :
  withval=$with_dtrace;
else case e in #(
  e) with_dtrace=no ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_dtrace" >&5
printf "%s\n" "$with_dtrace" >&6; }





DTRACE=
DTRACE_HEADERS=
DTRACE_OBJS=

if test "$with_dtrace" = "yes"
then
    # Extract the first word of "dtrace", so it can be a program name with args.
set dummy dtrace; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_DTRACE+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) case $DTRACE in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_DTRACE="$DTRACE" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_path_DTRACE="$as_dir$ac_word$ac_exec_ext"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_path_DTRACE" && ac_cv_path_DTRACE="not found"
  ;;
esac ;;
esac
fi
DTRACE=$ac_cv_path_DTRACE
if test -n "$DTRACE"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DTRACE" >&5
printf "%s\n" "$DTRACE" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


    if test "$DTRACE" = "not found"; then
        as_fn_error $? "dtrace command not found on \$PATH" "$LINENO" 5
    fi

printf "%s\n" "#define WITH_DTRACE 1" >>confdefs.h

    DTRACE_HEADERS="Include/pydtrace_probes.h"

    # On OS X, DTrace providers do not need to be explicitly compiled and
    # linked into the binary. Correspondingly, dtrace(1) is missing the ELF
    # generation flag '-G'. We check for presence of this flag, rather than
    # hardcoding support by OS, in the interest of robustness.
    #
    # NetBSD DTrace requires the -x nolibs flag to avoid system library conflicts
    # and uses header generation for testing instead of object generation.
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether DTrace probes require linking" >&5
printf %s "checking whether DTrace probes require linking... " >&6; }
if test ${ac_cv_dtrace_link+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
            ac_cv_dtrace_link=no
            echo 'BEGIN{}' > conftest.d
            case $host in
                *netbsd*)
                    DTRACE_TEST_FLAGS="-x nolibs -h"
                    ;;
                *)
                    DTRACE_TEST_FLAGS="-G"
                    ;;
            esac
            "$DTRACE" $DFLAGS $DTRACE_TEST_FLAGS -s conftest.d -o conftest.o > /dev/null 2>&1 && \
                ac_cv_dtrace_link=yes
       ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_dtrace_link" >&5
printf "%s\n" "$ac_cv_dtrace_link" >&6; }
    if test "$ac_cv_dtrace_link" = "yes"; then
        DTRACE_OBJS="Python/pydtrace.o"
    fi
    # Set NetBSD-specific DTrace flags in DFLAGS
    case $host in
        *netbsd*)
            DFLAGS="$DFLAGS -x nolibs"
            ;;
    esac
fi

PLATFORM_HEADERS=
PLATFORM_OBJS=

case $ac_sys_system in #(
  Emscripten) :

    as_fn_append PLATFORM_OBJS ' Python/emscripten_signal.o Python/emscripten_trampoline.o Python/emscripten_trampoline_wasm.o'
    if test "x$enable_emscripten_syscalls" = xyes
then :

      as_fn_append PLATFORM_OBJS ' Python/emscripten_syscalls.o'

fi
    as_fn_append PLATFORM_HEADERS ' $(srcdir)/Include/internal/pycore_emscripten_signal.h $(srcdir)/Include/internal/pycore_emscripten_trampoline.h'
   ;; #(
  *) :
     ;;
esac



# -I${DLINCLDIR} is added to the compile rule for importdl.o

DLINCLDIR=.

# the dlopen() function means we might want to use dynload_shlib.o. some
# platforms have dlopen(), but don't want to use it.
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = xyes
then :
  printf "%s\n" "#define HAVE_DLOPEN 1" >>confdefs.h

fi


# Used by ctypes.util.dllist().
ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
if test "x$ac_cv_func_dl_iterate_phdr" = xyes
then :
  printf "%s\n" "#define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h

fi


# DYNLOADFILE specifies which dynload_*.o file we will use for dynamic
# loading of modules.

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking DYNLOADFILE" >&5
printf %s "checking DYNLOADFILE... " >&6; }
if test -z "$DYNLOADFILE"
then
	case $ac_sys_system/$ac_sys_release in
	hp*|HP*) DYNLOADFILE="dynload_hpux.o";;
	*)
	# use dynload_shlib.c and dlopen() if we have it; otherwise stub
	# out any dynamic loading
	if test "$ac_cv_func_dlopen" = yes
	then DYNLOADFILE="dynload_shlib.o"
	else DYNLOADFILE="dynload_stub.o"
	fi
	;;
	esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DYNLOADFILE" >&5
printf "%s\n" "$DYNLOADFILE" >&6; }
if test "$DYNLOADFILE" != "dynload_stub.o"
then

printf "%s\n" "#define HAVE_DYNAMIC_LOADING 1" >>confdefs.h

fi

# MACHDEP_OBJS can be set to platform-specific object files needed by Python


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking MACHDEP_OBJS" >&5
printf %s "checking MACHDEP_OBJS... " >&6; }
if test -z "$MACHDEP_OBJS"
then
	MACHDEP_OBJS=$extra_machdep_objs
else
	MACHDEP_OBJS="$MACHDEP_OBJS $extra_machdep_objs"
fi
if test -z "$MACHDEP_OBJS"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
printf "%s\n" "none" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MACHDEP_OBJS" >&5
printf "%s\n" "$MACHDEP_OBJS" >&6; }
fi

if test "$ac_sys_system" = "Linux-android"; then
  # These functions are unimplemented and always return an error
  # (https://android.googlesource.com/platform/system/sepolicy/+/refs/heads/android13-release/public/domain.te#1044)
  blocked_funcs="sem_open sem_unlink"

  # Before API level 23, when fchmodat is called with the unimplemented flag
  # AT_SYMLINK_NOFOLLOW, instead of returning ENOTSUP as it should, it actually
  # follows the symlink.
  if test "$ANDROID_API_LEVEL" -lt 23; then
    blocked_funcs="$blocked_funcs fchmodat"
  fi

  for name in $blocked_funcs; do
    as_func_var=`printf "%s\n" "ac_cv_func_$name" | sed "$as_sed_sh"`

    eval "$as_func_var=no"

  done
fi

# checks for library functions
ac_fn_c_check_func "$LINENO" "accept4" "ac_cv_func_accept4"
if test "x$ac_cv_func_accept4" = xyes
then :
  printf "%s\n" "#define HAVE_ACCEPT4 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "alarm" "ac_cv_func_alarm"
if test "x$ac_cv_func_alarm" = xyes
then :
  printf "%s\n" "#define HAVE_ALARM 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset"
if test "x$ac_cv_func_bind_textdomain_codeset" = xyes
then :
  printf "%s\n" "#define HAVE_BIND_TEXTDOMAIN_CODESET 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "chmod" "ac_cv_func_chmod"
if test "x$ac_cv_func_chmod" = xyes
then :
  printf "%s\n" "#define HAVE_CHMOD 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "chown" "ac_cv_func_chown"
if test "x$ac_cv_func_chown" = xyes
then :
  printf "%s\n" "#define HAVE_CHOWN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "clearenv" "ac_cv_func_clearenv"
if test "x$ac_cv_func_clearenv" = xyes
then :
  printf "%s\n" "#define HAVE_CLEARENV 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "clock" "ac_cv_func_clock"
if test "x$ac_cv_func_clock" = xyes
then :
  printf "%s\n" "#define HAVE_CLOCK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "closefrom" "ac_cv_func_closefrom"
if test "x$ac_cv_func_closefrom" = xyes
then :
  printf "%s\n" "#define HAVE_CLOSEFROM 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "close_range" "ac_cv_func_close_range"
if test "x$ac_cv_func_close_range" = xyes
then :
  printf "%s\n" "#define HAVE_CLOSE_RANGE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "confstr" "ac_cv_func_confstr"
if test "x$ac_cv_func_confstr" = xyes
then :
  printf "%s\n" "#define HAVE_CONFSTR 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "copy_file_range" "ac_cv_func_copy_file_range"
if test "x$ac_cv_func_copy_file_range" = xyes
then :
  printf "%s\n" "#define HAVE_COPY_FILE_RANGE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ctermid" "ac_cv_func_ctermid"
if test "x$ac_cv_func_ctermid" = xyes
then :
  printf "%s\n" "#define HAVE_CTERMID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "dladdr" "ac_cv_func_dladdr"
if test "x$ac_cv_func_dladdr" = xyes
then :
  printf "%s\n" "#define HAVE_DLADDR 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "dup" "ac_cv_func_dup"
if test "x$ac_cv_func_dup" = xyes
then :
  printf "%s\n" "#define HAVE_DUP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "execv" "ac_cv_func_execv"
if test "x$ac_cv_func_execv" = xyes
then :
  printf "%s\n" "#define HAVE_EXECV 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "explicit_bzero" "ac_cv_func_explicit_bzero"
if test "x$ac_cv_func_explicit_bzero" = xyes
then :
  printf "%s\n" "#define HAVE_EXPLICIT_BZERO 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "explicit_memset" "ac_cv_func_explicit_memset"
if test "x$ac_cv_func_explicit_memset" = xyes
then :
  printf "%s\n" "#define HAVE_EXPLICIT_MEMSET 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "faccessat" "ac_cv_func_faccessat"
if test "x$ac_cv_func_faccessat" = xyes
then :
  printf "%s\n" "#define HAVE_FACCESSAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fchmod" "ac_cv_func_fchmod"
if test "x$ac_cv_func_fchmod" = xyes
then :
  printf "%s\n" "#define HAVE_FCHMOD 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fchmodat" "ac_cv_func_fchmodat"
if test "x$ac_cv_func_fchmodat" = xyes
then :
  printf "%s\n" "#define HAVE_FCHMODAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fchown" "ac_cv_func_fchown"
if test "x$ac_cv_func_fchown" = xyes
then :
  printf "%s\n" "#define HAVE_FCHOWN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fchownat" "ac_cv_func_fchownat"
if test "x$ac_cv_func_fchownat" = xyes
then :
  printf "%s\n" "#define HAVE_FCHOWNAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fdopendir" "ac_cv_func_fdopendir"
if test "x$ac_cv_func_fdopendir" = xyes
then :
  printf "%s\n" "#define HAVE_FDOPENDIR 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fdwalk" "ac_cv_func_fdwalk"
if test "x$ac_cv_func_fdwalk" = xyes
then :
  printf "%s\n" "#define HAVE_FDWALK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fexecve" "ac_cv_func_fexecve"
if test "x$ac_cv_func_fexecve" = xyes
then :
  printf "%s\n" "#define HAVE_FEXECVE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fork" "ac_cv_func_fork"
if test "x$ac_cv_func_fork" = xyes
then :
  printf "%s\n" "#define HAVE_FORK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fork1" "ac_cv_func_fork1"
if test "x$ac_cv_func_fork1" = xyes
then :
  printf "%s\n" "#define HAVE_FORK1 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fpathconf" "ac_cv_func_fpathconf"
if test "x$ac_cv_func_fpathconf" = xyes
then :
  printf "%s\n" "#define HAVE_FPATHCONF 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fstatat" "ac_cv_func_fstatat"
if test "x$ac_cv_func_fstatat" = xyes
then :
  printf "%s\n" "#define HAVE_FSTATAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ftime" "ac_cv_func_ftime"
if test "x$ac_cv_func_ftime" = xyes
then :
  printf "%s\n" "#define HAVE_FTIME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ftruncate" "ac_cv_func_ftruncate"
if test "x$ac_cv_func_ftruncate" = xyes
then :
  printf "%s\n" "#define HAVE_FTRUNCATE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "futimens" "ac_cv_func_futimens"
if test "x$ac_cv_func_futimens" = xyes
then :
  printf "%s\n" "#define HAVE_FUTIMENS 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "futimes" "ac_cv_func_futimes"
if test "x$ac_cv_func_futimes" = xyes
then :
  printf "%s\n" "#define HAVE_FUTIMES 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "futimesat" "ac_cv_func_futimesat"
if test "x$ac_cv_func_futimesat" = xyes
then :
  printf "%s\n" "#define HAVE_FUTIMESAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "gai_strerror" "ac_cv_func_gai_strerror"
if test "x$ac_cv_func_gai_strerror" = xyes
then :
  printf "%s\n" "#define HAVE_GAI_STRERROR 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getdents64" "ac_cv_func_getdents64"
if test "x$ac_cv_func_getdents64" = xyes
then :
  printf "%s\n" "#define HAVE_GETDENTS64 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getegid" "ac_cv_func_getegid"
if test "x$ac_cv_func_getegid" = xyes
then :
  printf "%s\n" "#define HAVE_GETEGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "geteuid" "ac_cv_func_geteuid"
if test "x$ac_cv_func_geteuid" = xyes
then :
  printf "%s\n" "#define HAVE_GETEUID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getgid" "ac_cv_func_getgid"
if test "x$ac_cv_func_getgid" = xyes
then :
  printf "%s\n" "#define HAVE_GETGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getgrent" "ac_cv_func_getgrent"
if test "x$ac_cv_func_getgrent" = xyes
then :
  printf "%s\n" "#define HAVE_GETGRENT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getgrgid" "ac_cv_func_getgrgid"
if test "x$ac_cv_func_getgrgid" = xyes
then :
  printf "%s\n" "#define HAVE_GETGRGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getgrgid_r" "ac_cv_func_getgrgid_r"
if test "x$ac_cv_func_getgrgid_r" = xyes
then :
  printf "%s\n" "#define HAVE_GETGRGID_R 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getgrnam_r" "ac_cv_func_getgrnam_r"
if test "x$ac_cv_func_getgrnam_r" = xyes
then :
  printf "%s\n" "#define HAVE_GETGRNAM_R 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getgrouplist" "ac_cv_func_getgrouplist"
if test "x$ac_cv_func_getgrouplist" = xyes
then :
  printf "%s\n" "#define HAVE_GETGROUPLIST 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname"
if test "x$ac_cv_func_gethostname" = xyes
then :
  printf "%s\n" "#define HAVE_GETHOSTNAME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getitimer" "ac_cv_func_getitimer"
if test "x$ac_cv_func_getitimer" = xyes
then :
  printf "%s\n" "#define HAVE_GETITIMER 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg"
if test "x$ac_cv_func_getloadavg" = xyes
then :
  printf "%s\n" "#define HAVE_GETLOADAVG 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getlogin" "ac_cv_func_getlogin"
if test "x$ac_cv_func_getlogin" = xyes
then :
  printf "%s\n" "#define HAVE_GETLOGIN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getlogin_r" "ac_cv_func_getlogin_r"
if test "x$ac_cv_func_getlogin_r" = xyes
then :
  printf "%s\n" "#define HAVE_GETLOGIN_R 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getpeername" "ac_cv_func_getpeername"
if test "x$ac_cv_func_getpeername" = xyes
then :
  printf "%s\n" "#define HAVE_GETPEERNAME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getpgid" "ac_cv_func_getpgid"
if test "x$ac_cv_func_getpgid" = xyes
then :
  printf "%s\n" "#define HAVE_GETPGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getpid" "ac_cv_func_getpid"
if test "x$ac_cv_func_getpid" = xyes
then :
  printf "%s\n" "#define HAVE_GETPID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getppid" "ac_cv_func_getppid"
if test "x$ac_cv_func_getppid" = xyes
then :
  printf "%s\n" "#define HAVE_GETPPID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getpriority" "ac_cv_func_getpriority"
if test "x$ac_cv_func_getpriority" = xyes
then :
  printf "%s\n" "#define HAVE_GETPRIORITY 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "_getpty" "ac_cv_func__getpty"
if test "x$ac_cv_func__getpty" = xyes
then :
  printf "%s\n" "#define HAVE__GETPTY 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getpwent" "ac_cv_func_getpwent"
if test "x$ac_cv_func_getpwent" = xyes
then :
  printf "%s\n" "#define HAVE_GETPWENT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getpwnam_r" "ac_cv_func_getpwnam_r"
if test "x$ac_cv_func_getpwnam_r" = xyes
then :
  printf "%s\n" "#define HAVE_GETPWNAM_R 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getpwuid" "ac_cv_func_getpwuid"
if test "x$ac_cv_func_getpwuid" = xyes
then :
  printf "%s\n" "#define HAVE_GETPWUID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getpwuid_r" "ac_cv_func_getpwuid_r"
if test "x$ac_cv_func_getpwuid_r" = xyes
then :
  printf "%s\n" "#define HAVE_GETPWUID_R 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getresgid" "ac_cv_func_getresgid"
if test "x$ac_cv_func_getresgid" = xyes
then :
  printf "%s\n" "#define HAVE_GETRESGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getresuid" "ac_cv_func_getresuid"
if test "x$ac_cv_func_getresuid" = xyes
then :
  printf "%s\n" "#define HAVE_GETRESUID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage"
if test "x$ac_cv_func_getrusage" = xyes
then :
  printf "%s\n" "#define HAVE_GETRUSAGE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getsid" "ac_cv_func_getsid"
if test "x$ac_cv_func_getsid" = xyes
then :
  printf "%s\n" "#define HAVE_GETSID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getspent" "ac_cv_func_getspent"
if test "x$ac_cv_func_getspent" = xyes
then :
  printf "%s\n" "#define HAVE_GETSPENT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getspnam" "ac_cv_func_getspnam"
if test "x$ac_cv_func_getspnam" = xyes
then :
  printf "%s\n" "#define HAVE_GETSPNAM 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "gettid" "ac_cv_func_gettid"
if test "x$ac_cv_func_gettid" = xyes
then :
  printf "%s\n" "#define HAVE_GETTID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getuid" "ac_cv_func_getuid"
if test "x$ac_cv_func_getuid" = xyes
then :
  printf "%s\n" "#define HAVE_GETUID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getwd" "ac_cv_func_getwd"
if test "x$ac_cv_func_getwd" = xyes
then :
  printf "%s\n" "#define HAVE_GETWD 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "grantpt" "ac_cv_func_grantpt"
if test "x$ac_cv_func_grantpt" = xyes
then :
  printf "%s\n" "#define HAVE_GRANTPT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "if_indextoname" "ac_cv_func_if_indextoname"
if test "x$ac_cv_func_if_indextoname" = xyes
then :
  printf "%s\n" "#define HAVE_IF_INDEXTONAME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "if_nameindex" "ac_cv_func_if_nameindex"
if test "x$ac_cv_func_if_nameindex" = xyes
then :
  printf "%s\n" "#define HAVE_IF_NAMEINDEX 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "if_nametoindex" "ac_cv_func_if_nametoindex"
if test "x$ac_cv_func_if_nametoindex" = xyes
then :
  printf "%s\n" "#define HAVE_IF_NAMETOINDEX 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "initgroups" "ac_cv_func_initgroups"
if test "x$ac_cv_func_initgroups" = xyes
then :
  printf "%s\n" "#define HAVE_INITGROUPS 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "kill" "ac_cv_func_kill"
if test "x$ac_cv_func_kill" = xyes
then :
  printf "%s\n" "#define HAVE_KILL 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "killpg" "ac_cv_func_killpg"
if test "x$ac_cv_func_killpg" = xyes
then :
  printf "%s\n" "#define HAVE_KILLPG 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "lchown" "ac_cv_func_lchown"
if test "x$ac_cv_func_lchown" = xyes
then :
  printf "%s\n" "#define HAVE_LCHOWN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "linkat" "ac_cv_func_linkat"
if test "x$ac_cv_func_linkat" = xyes
then :
  printf "%s\n" "#define HAVE_LINKAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "lockf" "ac_cv_func_lockf"
if test "x$ac_cv_func_lockf" = xyes
then :
  printf "%s\n" "#define HAVE_LOCKF 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat"
if test "x$ac_cv_func_lstat" = xyes
then :
  printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "lutimes" "ac_cv_func_lutimes"
if test "x$ac_cv_func_lutimes" = xyes
then :
  printf "%s\n" "#define HAVE_LUTIMES 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "madvise" "ac_cv_func_madvise"
if test "x$ac_cv_func_madvise" = xyes
then :
  printf "%s\n" "#define HAVE_MADVISE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mbrtowc" "ac_cv_func_mbrtowc"
if test "x$ac_cv_func_mbrtowc" = xyes
then :
  printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr"
if test "x$ac_cv_func_memrchr" = xyes
then :
  printf "%s\n" "#define HAVE_MEMRCHR 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mkdirat" "ac_cv_func_mkdirat"
if test "x$ac_cv_func_mkdirat" = xyes
then :
  printf "%s\n" "#define HAVE_MKDIRAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mkfifo" "ac_cv_func_mkfifo"
if test "x$ac_cv_func_mkfifo" = xyes
then :
  printf "%s\n" "#define HAVE_MKFIFO 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mkfifoat" "ac_cv_func_mkfifoat"
if test "x$ac_cv_func_mkfifoat" = xyes
then :
  printf "%s\n" "#define HAVE_MKFIFOAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mknod" "ac_cv_func_mknod"
if test "x$ac_cv_func_mknod" = xyes
then :
  printf "%s\n" "#define HAVE_MKNOD 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mknodat" "ac_cv_func_mknodat"
if test "x$ac_cv_func_mknodat" = xyes
then :
  printf "%s\n" "#define HAVE_MKNODAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mktime" "ac_cv_func_mktime"
if test "x$ac_cv_func_mktime" = xyes
then :
  printf "%s\n" "#define HAVE_MKTIME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
if test "x$ac_cv_func_mmap" = xyes
then :
  printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "mremap" "ac_cv_func_mremap"
if test "x$ac_cv_func_mremap" = xyes
then :
  printf "%s\n" "#define HAVE_MREMAP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "nice" "ac_cv_func_nice"
if test "x$ac_cv_func_nice" = xyes
then :
  printf "%s\n" "#define HAVE_NICE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "openat" "ac_cv_func_openat"
if test "x$ac_cv_func_openat" = xyes
then :
  printf "%s\n" "#define HAVE_OPENAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "opendir" "ac_cv_func_opendir"
if test "x$ac_cv_func_opendir" = xyes
then :
  printf "%s\n" "#define HAVE_OPENDIR 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pathconf" "ac_cv_func_pathconf"
if test "x$ac_cv_func_pathconf" = xyes
then :
  printf "%s\n" "#define HAVE_PATHCONF 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pause" "ac_cv_func_pause"
if test "x$ac_cv_func_pause" = xyes
then :
  printf "%s\n" "#define HAVE_PAUSE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pidfd_open" "ac_cv_func_pidfd_open"
if test "x$ac_cv_func_pidfd_open" = xyes
then :
  printf "%s\n" "#define HAVE_PIDFD_OPEN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pidfd_getfd" "ac_cv_func_pidfd_getfd"
if test "x$ac_cv_func_pidfd_getfd" = xyes
then :
  printf "%s\n" "#define HAVE_PIDFD_GETFD 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pidfd_send_signal" "ac_cv_func_pidfd_send_signal"
if test "x$ac_cv_func_pidfd_send_signal" = xyes
then :
  printf "%s\n" "#define HAVE_PIDFD_SEND_SIGNAL 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pipe" "ac_cv_func_pipe"
if test "x$ac_cv_func_pipe" = xyes
then :
  printf "%s\n" "#define HAVE_PIPE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "plock" "ac_cv_func_plock"
if test "x$ac_cv_func_plock" = xyes
then :
  printf "%s\n" "#define HAVE_PLOCK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll"
if test "x$ac_cv_func_poll" = xyes
then :
  printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ppoll" "ac_cv_func_ppoll"
if test "x$ac_cv_func_ppoll" = xyes
then :
  printf "%s\n" "#define HAVE_PPOLL 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "posix_fadvise" "ac_cv_func_posix_fadvise"
if test "x$ac_cv_func_posix_fadvise" = xyes
then :
  printf "%s\n" "#define HAVE_POSIX_FADVISE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "posix_fallocate" "ac_cv_func_posix_fallocate"
if test "x$ac_cv_func_posix_fallocate" = xyes
then :
  printf "%s\n" "#define HAVE_POSIX_FALLOCATE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "posix_openpt" "ac_cv_func_posix_openpt"
if test "x$ac_cv_func_posix_openpt" = xyes
then :
  printf "%s\n" "#define HAVE_POSIX_OPENPT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn"
if test "x$ac_cv_func_posix_spawn" = xyes
then :
  printf "%s\n" "#define HAVE_POSIX_SPAWN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "posix_spawnp" "ac_cv_func_posix_spawnp"
if test "x$ac_cv_func_posix_spawnp" = xyes
then :
  printf "%s\n" "#define HAVE_POSIX_SPAWNP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "posix_spawn_file_actions_addclosefrom_np" "ac_cv_func_posix_spawn_file_actions_addclosefrom_np"
if test "x$ac_cv_func_posix_spawn_file_actions_addclosefrom_np" = xyes
then :
  printf "%s\n" "#define HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSEFROM_NP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pread" "ac_cv_func_pread"
if test "x$ac_cv_func_pread" = xyes
then :
  printf "%s\n" "#define HAVE_PREAD 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "preadv" "ac_cv_func_preadv"
if test "x$ac_cv_func_preadv" = xyes
then :
  printf "%s\n" "#define HAVE_PREADV 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "preadv2" "ac_cv_func_preadv2"
if test "x$ac_cv_func_preadv2" = xyes
then :
  printf "%s\n" "#define HAVE_PREADV2 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "process_vm_readv" "ac_cv_func_process_vm_readv"
if test "x$ac_cv_func_process_vm_readv" = xyes
then :
  printf "%s\n" "#define HAVE_PROCESS_VM_READV 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_cond_timedwait_relative_np" "ac_cv_func_pthread_cond_timedwait_relative_np"
if test "x$ac_cv_func_pthread_cond_timedwait_relative_np" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_condattr_setclock" "ac_cv_func_pthread_condattr_setclock"
if test "x$ac_cv_func_pthread_condattr_setclock" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_CONDATTR_SETCLOCK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_init" "ac_cv_func_pthread_init"
if test "x$ac_cv_func_pthread_init" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_INIT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_kill" "ac_cv_func_pthread_kill"
if test "x$ac_cv_func_pthread_kill" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_KILL 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_get_name_np" "ac_cv_func_pthread_get_name_np"
if test "x$ac_cv_func_pthread_get_name_np" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_GET_NAME_NP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_getname_np" "ac_cv_func_pthread_getname_np"
if test "x$ac_cv_func_pthread_getname_np" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_GETNAME_NP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_set_name_np" "ac_cv_func_pthread_set_name_np"
if test "x$ac_cv_func_pthread_set_name_np" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_SET_NAME_NP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_setname_np" "ac_cv_func_pthread_setname_np"
if test "x$ac_cv_func_pthread_setname_np" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_SETNAME_NP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pthread_getattr_np" "ac_cv_func_pthread_getattr_np"
if test "x$ac_cv_func_pthread_getattr_np" = xyes
then :
  printf "%s\n" "#define HAVE_PTHREAD_GETATTR_NP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ptsname" "ac_cv_func_ptsname"
if test "x$ac_cv_func_ptsname" = xyes
then :
  printf "%s\n" "#define HAVE_PTSNAME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ptsname_r" "ac_cv_func_ptsname_r"
if test "x$ac_cv_func_ptsname_r" = xyes
then :
  printf "%s\n" "#define HAVE_PTSNAME_R 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite"
if test "x$ac_cv_func_pwrite" = xyes
then :
  printf "%s\n" "#define HAVE_PWRITE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pwritev" "ac_cv_func_pwritev"
if test "x$ac_cv_func_pwritev" = xyes
then :
  printf "%s\n" "#define HAVE_PWRITEV 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pwritev2" "ac_cv_func_pwritev2"
if test "x$ac_cv_func_pwritev2" = xyes
then :
  printf "%s\n" "#define HAVE_PWRITEV2 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "readlink" "ac_cv_func_readlink"
if test "x$ac_cv_func_readlink" = xyes
then :
  printf "%s\n" "#define HAVE_READLINK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "readlinkat" "ac_cv_func_readlinkat"
if test "x$ac_cv_func_readlinkat" = xyes
then :
  printf "%s\n" "#define HAVE_READLINKAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "readv" "ac_cv_func_readv"
if test "x$ac_cv_func_readv" = xyes
then :
  printf "%s\n" "#define HAVE_READV 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "realpath" "ac_cv_func_realpath"
if test "x$ac_cv_func_realpath" = xyes
then :
  printf "%s\n" "#define HAVE_REALPATH 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "renameat" "ac_cv_func_renameat"
if test "x$ac_cv_func_renameat" = xyes
then :
  printf "%s\n" "#define HAVE_RENAMEAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "rtpSpawn" "ac_cv_func_rtpSpawn"
if test "x$ac_cv_func_rtpSpawn" = xyes
then :
  printf "%s\n" "#define HAVE_RTPSPAWN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sched_get_priority_max" "ac_cv_func_sched_get_priority_max"
if test "x$ac_cv_func_sched_get_priority_max" = xyes
then :
  printf "%s\n" "#define HAVE_SCHED_GET_PRIORITY_MAX 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sched_rr_get_interval" "ac_cv_func_sched_rr_get_interval"
if test "x$ac_cv_func_sched_rr_get_interval" = xyes
then :
  printf "%s\n" "#define HAVE_SCHED_RR_GET_INTERVAL 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sched_setaffinity" "ac_cv_func_sched_setaffinity"
if test "x$ac_cv_func_sched_setaffinity" = xyes
then :
  printf "%s\n" "#define HAVE_SCHED_SETAFFINITY 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sched_setparam" "ac_cv_func_sched_setparam"
if test "x$ac_cv_func_sched_setparam" = xyes
then :
  printf "%s\n" "#define HAVE_SCHED_SETPARAM 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sched_setscheduler" "ac_cv_func_sched_setscheduler"
if test "x$ac_cv_func_sched_setscheduler" = xyes
then :
  printf "%s\n" "#define HAVE_SCHED_SETSCHEDULER 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sem_clockwait" "ac_cv_func_sem_clockwait"
if test "x$ac_cv_func_sem_clockwait" = xyes
then :
  printf "%s\n" "#define HAVE_SEM_CLOCKWAIT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sem_getvalue" "ac_cv_func_sem_getvalue"
if test "x$ac_cv_func_sem_getvalue" = xyes
then :
  printf "%s\n" "#define HAVE_SEM_GETVALUE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sem_open" "ac_cv_func_sem_open"
if test "x$ac_cv_func_sem_open" = xyes
then :
  printf "%s\n" "#define HAVE_SEM_OPEN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sem_timedwait" "ac_cv_func_sem_timedwait"
if test "x$ac_cv_func_sem_timedwait" = xyes
then :
  printf "%s\n" "#define HAVE_SEM_TIMEDWAIT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sem_unlink" "ac_cv_func_sem_unlink"
if test "x$ac_cv_func_sem_unlink" = xyes
then :
  printf "%s\n" "#define HAVE_SEM_UNLINK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sendfile" "ac_cv_func_sendfile"
if test "x$ac_cv_func_sendfile" = xyes
then :
  printf "%s\n" "#define HAVE_SENDFILE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid"
if test "x$ac_cv_func_setegid" = xyes
then :
  printf "%s\n" "#define HAVE_SETEGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid"
if test "x$ac_cv_func_seteuid" = xyes
then :
  printf "%s\n" "#define HAVE_SETEUID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setgid" "ac_cv_func_setgid"
if test "x$ac_cv_func_setgid" = xyes
then :
  printf "%s\n" "#define HAVE_SETGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sethostname" "ac_cv_func_sethostname"
if test "x$ac_cv_func_sethostname" = xyes
then :
  printf "%s\n" "#define HAVE_SETHOSTNAME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setitimer" "ac_cv_func_setitimer"
if test "x$ac_cv_func_setitimer" = xyes
then :
  printf "%s\n" "#define HAVE_SETITIMER 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale"
if test "x$ac_cv_func_setlocale" = xyes
then :
  printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setpgid" "ac_cv_func_setpgid"
if test "x$ac_cv_func_setpgid" = xyes
then :
  printf "%s\n" "#define HAVE_SETPGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setpgrp" "ac_cv_func_setpgrp"
if test "x$ac_cv_func_setpgrp" = xyes
then :
  printf "%s\n" "#define HAVE_SETPGRP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setpriority" "ac_cv_func_setpriority"
if test "x$ac_cv_func_setpriority" = xyes
then :
  printf "%s\n" "#define HAVE_SETPRIORITY 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setregid" "ac_cv_func_setregid"
if test "x$ac_cv_func_setregid" = xyes
then :
  printf "%s\n" "#define HAVE_SETREGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setresgid" "ac_cv_func_setresgid"
if test "x$ac_cv_func_setresgid" = xyes
then :
  printf "%s\n" "#define HAVE_SETRESGID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setresuid" "ac_cv_func_setresuid"
if test "x$ac_cv_func_setresuid" = xyes
then :
  printf "%s\n" "#define HAVE_SETRESUID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid"
if test "x$ac_cv_func_setreuid" = xyes
then :
  printf "%s\n" "#define HAVE_SETREUID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setsid" "ac_cv_func_setsid"
if test "x$ac_cv_func_setsid" = xyes
then :
  printf "%s\n" "#define HAVE_SETSID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setuid" "ac_cv_func_setuid"
if test "x$ac_cv_func_setuid" = xyes
then :
  printf "%s\n" "#define HAVE_SETUID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "setvbuf" "ac_cv_func_setvbuf"
if test "x$ac_cv_func_setvbuf" = xyes
then :
  printf "%s\n" "#define HAVE_SETVBUF 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "shutdown" "ac_cv_func_shutdown"
if test "x$ac_cv_func_shutdown" = xyes
then :
  printf "%s\n" "#define HAVE_SHUTDOWN 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction"
if test "x$ac_cv_func_sigaction" = xyes
then :
  printf "%s\n" "#define HAVE_SIGACTION 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sigaltstack" "ac_cv_func_sigaltstack"
if test "x$ac_cv_func_sigaltstack" = xyes
then :
  printf "%s\n" "#define HAVE_SIGALTSTACK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sigfillset" "ac_cv_func_sigfillset"
if test "x$ac_cv_func_sigfillset" = xyes
then :
  printf "%s\n" "#define HAVE_SIGFILLSET 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "siginterrupt" "ac_cv_func_siginterrupt"
if test "x$ac_cv_func_siginterrupt" = xyes
then :
  printf "%s\n" "#define HAVE_SIGINTERRUPT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sigpending" "ac_cv_func_sigpending"
if test "x$ac_cv_func_sigpending" = xyes
then :
  printf "%s\n" "#define HAVE_SIGPENDING 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sigrelse" "ac_cv_func_sigrelse"
if test "x$ac_cv_func_sigrelse" = xyes
then :
  printf "%s\n" "#define HAVE_SIGRELSE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sigtimedwait" "ac_cv_func_sigtimedwait"
if test "x$ac_cv_func_sigtimedwait" = xyes
then :
  printf "%s\n" "#define HAVE_SIGTIMEDWAIT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sigwait" "ac_cv_func_sigwait"
if test "x$ac_cv_func_sigwait" = xyes
then :
  printf "%s\n" "#define HAVE_SIGWAIT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sigwaitinfo" "ac_cv_func_sigwaitinfo"
if test "x$ac_cv_func_sigwaitinfo" = xyes
then :
  printf "%s\n" "#define HAVE_SIGWAITINFO 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
if test "x$ac_cv_func_snprintf" = xyes
then :
  printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "splice" "ac_cv_func_splice"
if test "x$ac_cv_func_splice" = xyes
then :
  printf "%s\n" "#define HAVE_SPLICE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime"
if test "x$ac_cv_func_strftime" = xyes
then :
  printf "%s\n" "#define HAVE_STRFTIME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy"
if test "x$ac_cv_func_strlcpy" = xyes
then :
  printf "%s\n" "#define HAVE_STRLCPY 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "strsignal" "ac_cv_func_strsignal"
if test "x$ac_cv_func_strsignal" = xyes
then :
  printf "%s\n" "#define HAVE_STRSIGNAL 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "symlinkat" "ac_cv_func_symlinkat"
if test "x$ac_cv_func_symlinkat" = xyes
then :
  printf "%s\n" "#define HAVE_SYMLINKAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sync" "ac_cv_func_sync"
if test "x$ac_cv_func_sync" = xyes
then :
  printf "%s\n" "#define HAVE_SYNC 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf"
if test "x$ac_cv_func_sysconf" = xyes
then :
  printf "%s\n" "#define HAVE_SYSCONF 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "sysctlbyname" "ac_cv_func_sysctlbyname"
if test "x$ac_cv_func_sysctlbyname" = xyes
then :
  printf "%s\n" "#define HAVE_SYSCTLBYNAME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "tcgetpgrp" "ac_cv_func_tcgetpgrp"
if test "x$ac_cv_func_tcgetpgrp" = xyes
then :
  printf "%s\n" "#define HAVE_TCGETPGRP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "tcsetpgrp" "ac_cv_func_tcsetpgrp"
if test "x$ac_cv_func_tcsetpgrp" = xyes
then :
  printf "%s\n" "#define HAVE_TCSETPGRP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "tempnam" "ac_cv_func_tempnam"
if test "x$ac_cv_func_tempnam" = xyes
then :
  printf "%s\n" "#define HAVE_TEMPNAM 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm"
if test "x$ac_cv_func_timegm" = xyes
then :
  printf "%s\n" "#define HAVE_TIMEGM 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "times" "ac_cv_func_times"
if test "x$ac_cv_func_times" = xyes
then :
  printf "%s\n" "#define HAVE_TIMES 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "tmpfile" "ac_cv_func_tmpfile"
if test "x$ac_cv_func_tmpfile" = xyes
then :
  printf "%s\n" "#define HAVE_TMPFILE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "tmpnam" "ac_cv_func_tmpnam"
if test "x$ac_cv_func_tmpnam" = xyes
then :
  printf "%s\n" "#define HAVE_TMPNAM 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "tmpnam_r" "ac_cv_func_tmpnam_r"
if test "x$ac_cv_func_tmpnam_r" = xyes
then :
  printf "%s\n" "#define HAVE_TMPNAM_R 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "truncate" "ac_cv_func_truncate"
if test "x$ac_cv_func_truncate" = xyes
then :
  printf "%s\n" "#define HAVE_TRUNCATE 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ttyname_r" "ac_cv_func_ttyname_r"
if test "x$ac_cv_func_ttyname_r" = xyes
then :
  printf "%s\n" "#define HAVE_TTYNAME_R 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "umask" "ac_cv_func_umask"
if test "x$ac_cv_func_umask" = xyes
then :
  printf "%s\n" "#define HAVE_UMASK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname"
if test "x$ac_cv_func_uname" = xyes
then :
  printf "%s\n" "#define HAVE_UNAME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "unlinkat" "ac_cv_func_unlinkat"
if test "x$ac_cv_func_unlinkat" = xyes
then :
  printf "%s\n" "#define HAVE_UNLINKAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "unlockpt" "ac_cv_func_unlockpt"
if test "x$ac_cv_func_unlockpt" = xyes
then :
  printf "%s\n" "#define HAVE_UNLOCKPT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "utimensat" "ac_cv_func_utimensat"
if test "x$ac_cv_func_utimensat" = xyes
then :
  printf "%s\n" "#define HAVE_UTIMENSAT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "utimes" "ac_cv_func_utimes"
if test "x$ac_cv_func_utimes" = xyes
then :
  printf "%s\n" "#define HAVE_UTIMES 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "vfork" "ac_cv_func_vfork"
if test "x$ac_cv_func_vfork" = xyes
then :
  printf "%s\n" "#define HAVE_VFORK 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "wait" "ac_cv_func_wait"
if test "x$ac_cv_func_wait" = xyes
then :
  printf "%s\n" "#define HAVE_WAIT 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "wait3" "ac_cv_func_wait3"
if test "x$ac_cv_func_wait3" = xyes
then :
  printf "%s\n" "#define HAVE_WAIT3 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "wait4" "ac_cv_func_wait4"
if test "x$ac_cv_func_wait4" = xyes
then :
  printf "%s\n" "#define HAVE_WAIT4 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "waitid" "ac_cv_func_waitid"
if test "x$ac_cv_func_waitid" = xyes
then :
  printf "%s\n" "#define HAVE_WAITID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "waitpid" "ac_cv_func_waitpid"
if test "x$ac_cv_func_waitpid" = xyes
then :
  printf "%s\n" "#define HAVE_WAITPID 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "wcscoll" "ac_cv_func_wcscoll"
if test "x$ac_cv_func_wcscoll" = xyes
then :
  printf "%s\n" "#define HAVE_WCSCOLL 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "wcsftime" "ac_cv_func_wcsftime"
if test "x$ac_cv_func_wcsftime" = xyes
then :
  printf "%s\n" "#define HAVE_WCSFTIME 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "wcsxfrm" "ac_cv_func_wcsxfrm"
if test "x$ac_cv_func_wcsxfrm" = xyes
then :
  printf "%s\n" "#define HAVE_WCSXFRM 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "wmemcmp" "ac_cv_func_wmemcmp"
if test "x$ac_cv_func_wmemcmp" = xyes
then :
  printf "%s\n" "#define HAVE_WMEMCMP 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "writev" "ac_cv_func_writev"
if test "x$ac_cv_func_writev" = xyes
then :
  printf "%s\n" "#define HAVE_WRITEV 1" >>confdefs.h

fi


# os.statx uses Linux's statx function.  AIX also has a function named statx,
# but it's unrelated.  Check only on Linux (including Android).
case $ac_sys_system in #(
  Linux*) :
    ac_fn_c_check_func "$LINENO" "statx" "ac_cv_func_statx"
if test "x$ac_cv_func_statx" = xyes
then :
  printf "%s\n" "#define HAVE_STATX 1" >>confdefs.h

fi

 ;; #(
  *) :
     ;;
esac

# Force lchmod off for Linux. Linux disallows changing the mode of symbolic
# links. Some libc implementations have a stub lchmod implementation that always
# returns an error.
if test "$MACHDEP" != linux; then
  ac_fn_c_check_func "$LINENO" "lchmod" "ac_cv_func_lchmod"
if test "x$ac_cv_func_lchmod" = xyes
then :
  printf "%s\n" "#define HAVE_LCHMOD 1" >>confdefs.h

fi

fi

# iOS defines some system methods that can be linked (so they are
# found by configure), but either raise a compilation error (because the
# header definition prevents usage - autoconf doesn't use the headers), or
# raise an error if used at runtime. Force these symbols off.
if test "$ac_sys_system" != "iOS" ; then
  ac_fn_c_check_func "$LINENO" "dup3" "ac_cv_func_dup3"
if test "x$ac_cv_func_dup3" = xyes
then :
  printf "%s\n" "#define HAVE_DUP3 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getentropy" "ac_cv_func_getentropy"
if test "x$ac_cv_func_getentropy" = xyes
then :
  printf "%s\n" "#define HAVE_GETENTROPY 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "getgroups" "ac_cv_func_getgroups"
if test "x$ac_cv_func_getgroups" = xyes
then :
  printf "%s\n" "#define HAVE_GETGROUPS 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2"
if test "x$ac_cv_func_pipe2" = xyes
then :
  printf "%s\n" "#define HAVE_PIPE2 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "system" "ac_cv_func_system"
if test "x$ac_cv_func_system" = xyes
then :
  printf "%s\n" "#define HAVE_SYSTEM 1" >>confdefs.h

fi

fi

ac_fn_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include <sys/types.h>
               #include <dirent.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_dirfd" = xyes
then :

printf "%s\n" "#define HAVE_DIRFD 1" >>confdefs.h

fi

# For some functions, having a definition is not sufficient, since
# we want to take their address.


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for chroot" >&5
printf %s "checking for chroot... " >&6; }
if test ${ac_cv_func_chroot+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
void *x=chroot
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_chroot=yes
else case e in #(
  e) ac_cv_func_chroot=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_chroot" >&5
printf "%s\n" "$ac_cv_func_chroot" >&6; }
  if test "x$ac_cv_func_chroot" = xyes
then :

printf "%s\n" "#define HAVE_CHROOT 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for link" >&5
printf %s "checking for link... " >&6; }
if test ${ac_cv_func_link+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
void *x=link
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_link=yes
else case e in #(
  e) ac_cv_func_link=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_link" >&5
printf "%s\n" "$ac_cv_func_link" >&6; }
  if test "x$ac_cv_func_link" = xyes
then :

printf "%s\n" "#define HAVE_LINK 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for symlink" >&5
printf %s "checking for symlink... " >&6; }
if test ${ac_cv_func_symlink+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
void *x=symlink
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_symlink=yes
else case e in #(
  e) ac_cv_func_symlink=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_symlink" >&5
printf "%s\n" "$ac_cv_func_symlink" >&6; }
  if test "x$ac_cv_func_symlink" = xyes
then :

printf "%s\n" "#define HAVE_SYMLINK 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fchdir" >&5
printf %s "checking for fchdir... " >&6; }
if test ${ac_cv_func_fchdir+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
void *x=fchdir
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_fchdir=yes
else case e in #(
  e) ac_cv_func_fchdir=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fchdir" >&5
printf "%s\n" "$ac_cv_func_fchdir" >&6; }
  if test "x$ac_cv_func_fchdir" = xyes
then :

printf "%s\n" "#define HAVE_FCHDIR 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fsync" >&5
printf %s "checking for fsync... " >&6; }
if test ${ac_cv_func_fsync+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
void *x=fsync
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_fsync=yes
else case e in #(
  e) ac_cv_func_fsync=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fsync" >&5
printf "%s\n" "$ac_cv_func_fsync" >&6; }
  if test "x$ac_cv_func_fsync" = xyes
then :

printf "%s\n" "#define HAVE_FSYNC 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fdatasync" >&5
printf %s "checking for fdatasync... " >&6; }
if test ${ac_cv_func_fdatasync+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
void *x=fdatasync
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_fdatasync=yes
else case e in #(
  e) ac_cv_func_fdatasync=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fdatasync" >&5
printf "%s\n" "$ac_cv_func_fdatasync" >&6; }
  if test "x$ac_cv_func_fdatasync" = xyes
then :

printf "%s\n" "#define HAVE_FDATASYNC 1" >>confdefs.h

fi




{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --disable-epoll" >&5
printf %s "checking for --disable-epoll... " >&6; }
# Check whether --enable-epoll was given.
if test ${enable_epoll+y}
then :
  enableval=$enable_epoll; if test "x$enable_epoll" = xno
then :
  disable_epoll=yes
else case e in #(
  e) disable_epoll=no ;;
esac
fi
else case e in #(
  e) disable_epoll=no
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $disable_epoll" >&5
printf "%s\n" "$disable_epoll" >&6; }
if test "$disable_epoll" = "no"
then


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for epoll_create" >&5
printf %s "checking for epoll_create... " >&6; }
if test ${ac_cv_func_epoll_create+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/epoll.h>
int
main (void)
{
void *x=epoll_create
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_epoll_create=yes
else case e in #(
  e) ac_cv_func_epoll_create=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_epoll_create" >&5
printf "%s\n" "$ac_cv_func_epoll_create" >&6; }
  if test "x$ac_cv_func_epoll_create" = xyes
then :

printf "%s\n" "#define HAVE_EPOLL 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for epoll_create1" >&5
printf %s "checking for epoll_create1... " >&6; }
if test ${ac_cv_func_epoll_create1+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/epoll.h>
int
main (void)
{
void *x=epoll_create1
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_epoll_create1=yes
else case e in #(
  e) ac_cv_func_epoll_create1=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_epoll_create1" >&5
printf "%s\n" "$ac_cv_func_epoll_create1" >&6; }
  if test "x$ac_cv_func_epoll_create1" = xyes
then :

printf "%s\n" "#define HAVE_EPOLL_CREATE1 1" >>confdefs.h

fi



fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for kqueue" >&5
printf %s "checking for kqueue... " >&6; }
if test ${ac_cv_func_kqueue+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/event.h>

int
main (void)
{
void *x=kqueue
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_kqueue=yes
else case e in #(
  e) ac_cv_func_kqueue=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_kqueue" >&5
printf "%s\n" "$ac_cv_func_kqueue" >&6; }
  if test "x$ac_cv_func_kqueue" = xyes
then :

printf "%s\n" "#define HAVE_KQUEUE 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for prlimit" >&5
printf %s "checking for prlimit... " >&6; }
if test ${ac_cv_func_prlimit+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/time.h>
#include <sys/resource.h>

int
main (void)
{
void *x=prlimit
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_prlimit=yes
else case e in #(
  e) ac_cv_func_prlimit=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_prlimit" >&5
printf "%s\n" "$ac_cv_func_prlimit" >&6; }
  if test "x$ac_cv_func_prlimit" = xyes
then :

printf "%s\n" "#define HAVE_PRLIMIT 1" >>confdefs.h

fi






  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _dyld_shared_cache_contains_path" >&5
printf %s "checking for _dyld_shared_cache_contains_path... " >&6; }
if test ${ac_cv_func__dyld_shared_cache_contains_path+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <mach-o/dyld.h>
int
main (void)
{
void *x=_dyld_shared_cache_contains_path
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func__dyld_shared_cache_contains_path=yes
else case e in #(
  e) ac_cv_func__dyld_shared_cache_contains_path=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func__dyld_shared_cache_contains_path" >&5
printf "%s\n" "$ac_cv_func__dyld_shared_cache_contains_path" >&6; }
  if test "x$ac_cv_func__dyld_shared_cache_contains_path" = xyes
then :

printf "%s\n" "#define HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH 1" >>confdefs.h

fi






  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for memfd_create" >&5
printf %s "checking for memfd_create... " >&6; }
if test ${ac_cv_func_memfd_create+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif
#ifdef HAVE_SYS_MEMFD_H
#include <sys/memfd.h>
#endif

int
main (void)
{
void *x=memfd_create
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_memfd_create=yes
else case e in #(
  e) ac_cv_func_memfd_create=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memfd_create" >&5
printf "%s\n" "$ac_cv_func_memfd_create" >&6; }
  if test "x$ac_cv_func_memfd_create" = xyes
then :

printf "%s\n" "#define HAVE_MEMFD_CREATE 1" >>confdefs.h

fi






  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for eventfd" >&5
printf %s "checking for eventfd... " >&6; }
if test ${ac_cv_func_eventfd+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef HAVE_SYS_EVENTFD_H
#include <sys/eventfd.h>
#endif

int
main (void)
{
void *x=eventfd
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_eventfd=yes
else case e in #(
  e) ac_cv_func_eventfd=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_eventfd" >&5
printf "%s\n" "$ac_cv_func_eventfd" >&6; }
  if test "x$ac_cv_func_eventfd" = xyes
then :

printf "%s\n" "#define HAVE_EVENTFD 1" >>confdefs.h

fi






  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for timerfd_create" >&5
printf %s "checking for timerfd_create... " >&6; }
if test ${ac_cv_func_timerfd_create+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef HAVE_SYS_TIMERFD_H
#include <sys/timerfd.h>
#endif

int
main (void)
{
void *x=timerfd_create
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_timerfd_create=yes
else case e in #(
  e) ac_cv_func_timerfd_create=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_timerfd_create" >&5
printf "%s\n" "$ac_cv_func_timerfd_create" >&6; }
  if test "x$ac_cv_func_timerfd_create" = xyes
then :

printf "%s\n" "#define HAVE_TIMERFD_CREATE 1" >>confdefs.h

fi




# On some systems (eg. FreeBSD 5), we would find a definition of the
# functions ctermid_r, setgroups in the library, but no prototype
# (e.g. because we use _XOPEN_SOURCE). See whether we can take their
# address to avoid compiler warnings and potential miscompilations
# because of the missing prototypes.



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ctermid_r" >&5
printf %s "checking for ctermid_r... " >&6; }
if test ${ac_cv_func_ctermid_r+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
int
main (void)
{
void *x=ctermid_r
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_ctermid_r=yes
else case e in #(
  e) ac_cv_func_ctermid_r=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_ctermid_r" >&5
printf "%s\n" "$ac_cv_func_ctermid_r" >&6; }
  if test "x$ac_cv_func_ctermid_r" = xyes
then :

printf "%s\n" "#define HAVE_CTERMID_R 1" >>confdefs.h

fi




{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for flock declaration" >&5
printf %s "checking for flock declaration... " >&6; }
if test ${ac_cv_flock_decl+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/file.h>
int
main (void)
{
void* p = flock

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_flock_decl=yes
else case e in #(
  e) ac_cv_flock_decl=no
   ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_flock_decl" >&5
printf "%s\n" "$ac_cv_flock_decl" >&6; }
if test "x$ac_cv_flock_decl" = xyes
then :

  for ac_func in flock
do :
  ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock"
if test "x$ac_cv_func_flock" = xyes
then :
  printf "%s\n" "#define HAVE_FLOCK 1" >>confdefs.h

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for flock in -lbsd" >&5
printf %s "checking for flock in -lbsd... " >&6; }
if test ${ac_cv_lib_bsd_flock+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char flock (void);
int
main (void)
{
return flock ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_bsd_flock=yes
else case e in #(
  e) ac_cv_lib_bsd_flock=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_flock" >&5
printf "%s\n" "$ac_cv_lib_bsd_flock" >&6; }
if test "x$ac_cv_lib_bsd_flock" = xyes
then :
  FCNTL_LIBS="-lbsd"
fi
 ;;
esac
fi

done
fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getpagesize" >&5
printf %s "checking for getpagesize... " >&6; }
if test ${ac_cv_func_getpagesize+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
void *x=getpagesize
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_getpagesize=yes
else case e in #(
  e) ac_cv_func_getpagesize=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getpagesize" >&5
printf "%s\n" "$ac_cv_func_getpagesize" >&6; }
  if test "x$ac_cv_func_getpagesize" = xyes
then :

printf "%s\n" "#define HAVE_GETPAGESIZE 1" >>confdefs.h

fi




{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for broken unsetenv" >&5
printf %s "checking for broken unsetenv... " >&6; }
if test ${ac_cv_broken_unsetenv+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main (void)
{
int res = unsetenv("DUMMY")
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_broken_unsetenv=no
else case e in #(
  e) ac_cv_broken_unsetenv=yes
   ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_broken_unsetenv" >&5
printf "%s\n" "$ac_cv_broken_unsetenv" >&6; }
if test "x$ac_cv_broken_unsetenv" = xyes
then :


printf "%s\n" "#define HAVE_BROKEN_UNSETENV 1" >>confdefs.h


fi

for ac_prog in true
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_TRUE+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$TRUE"; then
  ac_cv_prog_TRUE="$TRUE" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_TRUE="$ac_prog"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
TRUE=$ac_cv_prog_TRUE
if test -n "$TRUE"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TRUE" >&5
printf "%s\n" "$TRUE" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


  test -n "$TRUE" && break
done
test -n "$TRUE" || TRUE="/bin/true"


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lc" >&5
printf %s "checking for inet_aton in -lc... " >&6; }
if test ${ac_cv_lib_c_inet_aton+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char inet_aton (void);
int
main (void)
{
return inet_aton ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_c_inet_aton=yes
else case e in #(
  e) ac_cv_lib_c_inet_aton=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_inet_aton" >&5
printf "%s\n" "$ac_cv_lib_c_inet_aton" >&6; }
if test "x$ac_cv_lib_c_inet_aton" = xyes
then :
  $ac_cv_prog_TRUE
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5
printf %s "checking for inet_aton in -lresolv... " >&6; }
if test ${ac_cv_lib_resolv_inet_aton+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lresolv  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char inet_aton (void);
int
main (void)
{
return inet_aton ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_resolv_inet_aton=yes
else case e in #(
  e) ac_cv_lib_resolv_inet_aton=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton" >&5
printf "%s\n" "$ac_cv_lib_resolv_inet_aton" >&6; }
if test "x$ac_cv_lib_resolv_inet_aton" = xyes
then :
  SOCKET_LIBS="-lresolv"
fi

 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for hstrerror in -lc" >&5
printf %s "checking for hstrerror in -lc... " >&6; }
if test ${ac_cv_lib_c_hstrerror+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char hstrerror (void);
int
main (void)
{
return hstrerror ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_c_hstrerror=yes
else case e in #(
  e) ac_cv_lib_c_hstrerror=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_hstrerror" >&5
printf "%s\n" "$ac_cv_lib_c_hstrerror" >&6; }
if test "x$ac_cv_lib_c_hstrerror" = xyes
then :
  $ac_cv_prog_TRUE
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for hstrerror in -lresolv" >&5
printf %s "checking for hstrerror in -lresolv... " >&6; }
if test ${ac_cv_lib_resolv_hstrerror+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lresolv  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char hstrerror (void);
int
main (void)
{
return hstrerror ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_resolv_hstrerror=yes
else case e in #(
  e) ac_cv_lib_resolv_hstrerror=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_hstrerror" >&5
printf "%s\n" "$ac_cv_lib_resolv_hstrerror" >&6; }
if test "x$ac_cv_lib_resolv_hstrerror" = xyes
then :
  SOCKET_LIBS="-lresolv"
fi

 ;;
esac
fi


# On Tru64, chflags seems to be present, but calling it will
# exit Python
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for chflags" >&5
printf %s "checking for chflags... " >&6; }
if test ${ac_cv_have_chflags+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  ac_cv_have_chflags=cross
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
  if(chflags(argv[0], 0) != 0)
    return 1;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_have_chflags=yes
else case e in #(
  e) ac_cv_have_chflags=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_chflags" >&5
printf "%s\n" "$ac_cv_have_chflags" >&6; }
if test "$ac_cv_have_chflags" = cross ; then
  ac_fn_c_check_func "$LINENO" "chflags" "ac_cv_func_chflags"
if test "x$ac_cv_func_chflags" = xyes
then :
  ac_cv_have_chflags="yes"
else case e in #(
  e) ac_cv_have_chflags="no" ;;
esac
fi

fi
if test "$ac_cv_have_chflags" = yes ; then

printf "%s\n" "#define HAVE_CHFLAGS 1" >>confdefs.h

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lchflags" >&5
printf %s "checking for lchflags... " >&6; }
if test ${ac_cv_have_lchflags+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  ac_cv_have_lchflags=cross
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
  if(lchflags(argv[0], 0) != 0)
    return 1;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_have_lchflags=yes
else case e in #(
  e) ac_cv_have_lchflags=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_lchflags" >&5
printf "%s\n" "$ac_cv_have_lchflags" >&6; }
if test "$ac_cv_have_lchflags" = cross ; then
  ac_fn_c_check_func "$LINENO" "lchflags" "ac_cv_func_lchflags"
if test "x$ac_cv_func_lchflags" = xyes
then :
  ac_cv_have_lchflags="yes"
else case e in #(
  e) ac_cv_have_lchflags="no" ;;
esac
fi

fi
if test "$ac_cv_have_lchflags" = yes ; then

printf "%s\n" "#define HAVE_LCHFLAGS 1" >>confdefs.h

fi



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-zlib" >&5
printf %s "checking for --with-zlib... " >&6; }

# Check whether --with-zlib was given.
if test ${with_zlib+y}
then :
  withval=$with_zlib; case $with_zlib in #(
  yes|auto) :
    with_zlib=auto ;; #(
  zlib|zlib-ng|zlib-rs|no) :
     ;; #(
  *) :
    as_fn_error $? "proper usage is --with(out)-zlib[=zlib|zlib-ng|zlib-rs|no]" "$LINENO" 5 ;;
esac
else case e in #(
  e) with_zlib=auto ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_zlib" >&5
printf "%s\n" "$with_zlib" >&6; }

case $with_zlib in #(
  auto|zlib) :



  if test "$ac_sys_system" = "Emscripten" -a -z "$ZLIB_CFLAGS" -a -z "$ZLIB_LIBS"
then :

    ZLIB_CFLAGS="-sUSE_ZLIB"
    ZLIB_LIBS="-sUSE_ZLIB"

fi


 ;; #(
  *) :
     ;;
esac

if test "x$with_zlib" = xzlib-rs
then :

  zlib_name="libz_rs"
  zlib_version="0.6.0"
  zlib_libname="z_rs"

else case e in #(
  e)
  zlib_name="zlib"
  zlib_version="1.2.2.1"
  zlib_libname="z"
 ;;
esac
fi

if test "x$with_zlib" = xno
then :
  have_zlib=no
else case e in #(
  e)

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $zlib_name >= $zlib_version" >&5
printf %s "checking for $zlib_name >= $zlib_version... " >&6; }

if test -n "$ZLIB_CFLAGS"; then
    pkg_cv_ZLIB_CFLAGS="$ZLIB_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$zlib_name >= \$zlib_version\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$zlib_name >= $zlib_version") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_ZLIB_CFLAGS=`$PKG_CONFIG --cflags "$zlib_name >= $zlib_version" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$ZLIB_LIBS"; then
    pkg_cv_ZLIB_LIBS="$ZLIB_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$zlib_name >= \$zlib_version\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$zlib_name >= $zlib_version") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_ZLIB_LIBS=`$PKG_CONFIG --libs "$zlib_name >= $zlib_version" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                ZLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$zlib_name >= $zlib_version" 2>&1`
        else
                ZLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$zlib_name >= $zlib_version" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$ZLIB_PKG_ERRORS" >&5


  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS"
    LIBS="$LIBS $ZLIB_LIBS"
           for ac_header in zlib.h
do :
  ac_fn_c_check_header_compile "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
if test "x$ac_cv_header_zlib_h" = xyes
then :
  printf "%s\n" "#define HAVE_ZLIB_H 1" >>confdefs.h

      py_check_lib_save_LIBS=$LIBS
as_ac_Lib=`printf "%s\n" "ac_cv_lib_$zlib_libname""_gzread" | sed "$as_sed_sh"`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gzread in -l$zlib_libname" >&5
printf %s "checking for gzread in -l$zlib_libname... " >&6; }
if eval test \${$as_ac_Lib+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$zlib_libname  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char gzread (void);
int
main (void)
{
return gzread ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  eval "$as_ac_Lib=yes"
else case e in #(
  e) eval "$as_ac_Lib=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
eval ac_res=\$$as_ac_Lib
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
if eval test \"x\$"$as_ac_Lib"\" = x"yes"
then :
  have_zlib=yes
else case e in #(
  e) have_zlib=no ;;
esac
fi

LIBS=$py_check_lib_save_LIBS


else case e in #(
  e) have_zlib=no ;;
esac
fi

done
    if test "x$have_zlib" = xyes
then :

      ZLIB_CFLAGS=${ZLIB_CFLAGS-""}
      ZLIB_LIBS=${ZLIB_LIBS-"-l$zlib_libname"}
      py_check_lib_save_LIBS=$LIBS
as_ac_Lib=`printf "%s\n" "ac_cv_lib_$zlib_libname""_inflateCopy" | sed "$as_sed_sh"`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -l$zlib_libname" >&5
printf %s "checking for inflateCopy in -l$zlib_libname... " >&6; }
if eval test \${$as_ac_Lib+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$zlib_libname  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char inflateCopy (void);
int
main (void)
{
return inflateCopy ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  eval "$as_ac_Lib=yes"
else case e in #(
  e) eval "$as_ac_Lib=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
eval ac_res=\$$as_ac_Lib
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
if eval test \"x\$"$as_ac_Lib"\" = x"yes"
then :
  printf "%s\n" "#define HAVE_ZLIB_COPY 1" >>confdefs.h

fi

LIBS=$py_check_lib_save_LIBS


fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS"
    LIBS="$LIBS $ZLIB_LIBS"
           for ac_header in zlib.h
do :
  ac_fn_c_check_header_compile "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
if test "x$ac_cv_header_zlib_h" = xyes
then :
  printf "%s\n" "#define HAVE_ZLIB_H 1" >>confdefs.h

      py_check_lib_save_LIBS=$LIBS
as_ac_Lib=`printf "%s\n" "ac_cv_lib_$zlib_libname""_gzread" | sed "$as_sed_sh"`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gzread in -l$zlib_libname" >&5
printf %s "checking for gzread in -l$zlib_libname... " >&6; }
if eval test \${$as_ac_Lib+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$zlib_libname  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char gzread (void);
int
main (void)
{
return gzread ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  eval "$as_ac_Lib=yes"
else case e in #(
  e) eval "$as_ac_Lib=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
eval ac_res=\$$as_ac_Lib
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
if eval test \"x\$"$as_ac_Lib"\" = x"yes"
then :
  have_zlib=yes
else case e in #(
  e) have_zlib=no ;;
esac
fi

LIBS=$py_check_lib_save_LIBS


else case e in #(
  e) have_zlib=no ;;
esac
fi

done
    if test "x$have_zlib" = xyes
then :

      ZLIB_CFLAGS=${ZLIB_CFLAGS-""}
      ZLIB_LIBS=${ZLIB_LIBS-"-l$zlib_libname"}
      py_check_lib_save_LIBS=$LIBS
as_ac_Lib=`printf "%s\n" "ac_cv_lib_$zlib_libname""_inflateCopy" | sed "$as_sed_sh"`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -l$zlib_libname" >&5
printf %s "checking for inflateCopy in -l$zlib_libname... " >&6; }
if eval test \${$as_ac_Lib+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$zlib_libname  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char inflateCopy (void);
int
main (void)
{
return inflateCopy ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  eval "$as_ac_Lib=yes"
else case e in #(
  e) eval "$as_ac_Lib=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
eval ac_res=\$$as_ac_Lib
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
if eval test \"x\$"$as_ac_Lib"\" = x"yes"
then :
  printf "%s\n" "#define HAVE_ZLIB_COPY 1" >>confdefs.h

fi

LIBS=$py_check_lib_save_LIBS


fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



else
        ZLIB_CFLAGS=$pkg_cv_ZLIB_CFLAGS
        ZLIB_LIBS=$pkg_cv_ZLIB_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

  have_zlib=yes
    printf "%s\n" "#define HAVE_ZLIB_COPY 1" >>confdefs.h


fi
 ;;
esac
fi

if test "x$with_zlib" = xzlib-ng
then :
  if test "x$have_zlib" = xyes
then :

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS"
    ac_fn_check_decl "$LINENO" "ZLIBNG_VERSION" "ac_cv_have_decl_ZLIBNG_VERSION" "#include <zlib.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_ZLIBNG_VERSION" = xyes
then :

else case e in #(
  e) as_fn_error $? "--with-zlib=zlib-ng: the detected zlib library is not zlib-ng" "$LINENO" 5 ;;
esac
fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



fi
fi

case $with_zlib in #(
  auto|no) :
     ;; #(
  *) :
    if test "x$have_zlib" = xno
then :
  as_fn_error $? "--with-zlib=$with_zlib requested but $zlib_name was not found" "$LINENO" 5
fi ;;
esac

if test "x$have_zlib" = xyes
then :

  BINASCII_CFLAGS="-DUSE_ZLIB_CRC32 $ZLIB_CFLAGS"
  BINASCII_LIBS="$ZLIB_LIBS"

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-bzip2" >&5
printf %s "checking for --with-bzip2... " >&6; }

# Check whether --with-bzip2 was given.
if test ${with_bzip2+y}
then :
  withval=$with_bzip2; case $with_bzip2 in #(
  yes|auto) :
    with_bzip2=auto ;; #(
  bzip2|bzip2-rs|no) :
     ;; #(
  *) :
    as_fn_error $? "proper usage is --with(out)-bzip2[=bzip2|bzip2-rs|no]" "$LINENO" 5 ;;
esac
else case e in #(
  e) with_bzip2=auto ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_bzip2" >&5
printf "%s\n" "$with_bzip2" >&6; }

case $with_bzip2 in #(
  auto|bzip2) :



  if test "$ac_sys_system" = "Emscripten" -a -z "$BZIP2_CFLAGS" -a -z "$BZIP2_LIBS"
then :

    BZIP2_CFLAGS="-sUSE_BZIP2"
    BZIP2_LIBS="-sUSE_BZIP2"

fi


 ;; #(
  *) :
     ;;
esac

if test "x$with_bzip2" = xbzip2-rs
then :

  bzip2_name="libbz2_rs"
  bzip2_libname="bz2_rs"

else case e in #(
  e)
  bzip2_name="bzip2"
  bzip2_libname="bz2"
 ;;
esac
fi

if test "x$with_bzip2" = xno
then :
  have_bzip2=no
else case e in #(
  e)

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $bzip2_name" >&5
printf %s "checking for $bzip2_name... " >&6; }

if test -n "$BZIP2_CFLAGS"; then
    pkg_cv_BZIP2_CFLAGS="$BZIP2_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$bzip2_name\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$bzip2_name") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_BZIP2_CFLAGS=`$PKG_CONFIG --cflags "$bzip2_name" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$BZIP2_LIBS"; then
    pkg_cv_BZIP2_LIBS="$BZIP2_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$bzip2_name\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$bzip2_name") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_BZIP2_LIBS=`$PKG_CONFIG --libs "$bzip2_name" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                BZIP2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$bzip2_name" 2>&1`
        else
                BZIP2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$bzip2_name" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$BZIP2_PKG_ERRORS" >&5


  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $BZIP2_CFLAGS"
    LIBS="$LIBS $BZIP2_LIBS"
           for ac_header in bzlib.h
do :
  ac_fn_c_check_header_compile "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default"
if test "x$ac_cv_header_bzlib_h" = xyes
then :
  printf "%s\n" "#define HAVE_BZLIB_H 1" >>confdefs.h

      as_ac_Lib=`printf "%s\n" "ac_cv_lib_$bzip2_libname""_BZ2_bzCompress" | sed "$as_sed_sh"`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzCompress in -l$bzip2_libname" >&5
printf %s "checking for BZ2_bzCompress in -l$bzip2_libname... " >&6; }
if eval test \${$as_ac_Lib+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$bzip2_libname  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char BZ2_bzCompress (void);
int
main (void)
{
return BZ2_bzCompress ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  eval "$as_ac_Lib=yes"
else case e in #(
  e) eval "$as_ac_Lib=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
eval ac_res=\$$as_ac_Lib
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
if eval test \"x\$"$as_ac_Lib"\" = x"yes"
then :
  have_bzip2=yes
else case e in #(
  e) have_bzip2=no ;;
esac
fi


else case e in #(
  e) have_bzip2=no ;;
esac
fi

done
    if test "x$have_bzip2" = xyes
then :

      BZIP2_CFLAGS=${BZIP2_CFLAGS-""}
      BZIP2_LIBS=${BZIP2_LIBS-"-l$bzip2_libname"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $BZIP2_CFLAGS"
    LIBS="$LIBS $BZIP2_LIBS"
           for ac_header in bzlib.h
do :
  ac_fn_c_check_header_compile "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default"
if test "x$ac_cv_header_bzlib_h" = xyes
then :
  printf "%s\n" "#define HAVE_BZLIB_H 1" >>confdefs.h

      as_ac_Lib=`printf "%s\n" "ac_cv_lib_$bzip2_libname""_BZ2_bzCompress" | sed "$as_sed_sh"`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzCompress in -l$bzip2_libname" >&5
printf %s "checking for BZ2_bzCompress in -l$bzip2_libname... " >&6; }
if eval test \${$as_ac_Lib+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$bzip2_libname  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char BZ2_bzCompress (void);
int
main (void)
{
return BZ2_bzCompress ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  eval "$as_ac_Lib=yes"
else case e in #(
  e) eval "$as_ac_Lib=no" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
eval ac_res=\$$as_ac_Lib
	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
printf "%s\n" "$ac_res" >&6; }
if eval test \"x\$"$as_ac_Lib"\" = x"yes"
then :
  have_bzip2=yes
else case e in #(
  e) have_bzip2=no ;;
esac
fi


else case e in #(
  e) have_bzip2=no ;;
esac
fi

done
    if test "x$have_bzip2" = xyes
then :

      BZIP2_CFLAGS=${BZIP2_CFLAGS-""}
      BZIP2_LIBS=${BZIP2_LIBS-"-l$bzip2_libname"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



else
        BZIP2_CFLAGS=$pkg_cv_BZIP2_CFLAGS
        BZIP2_LIBS=$pkg_cv_BZIP2_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_bzip2=yes
fi
 ;;
esac
fi

case $with_bzip2 in #(
  auto|no) :
     ;; #(
  *) :
    if test "x$have_bzip2" = xno
then :
  as_fn_error $? "--with-bzip2=$with_bzip2 requested but $bzip2_name was not found" "$LINENO" 5
fi ;;
esac


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for liblzma" >&5
printf %s "checking for liblzma... " >&6; }

if test -n "$LIBLZMA_CFLAGS"; then
    pkg_cv_LIBLZMA_CFLAGS="$LIBLZMA_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"liblzma\""; } >&5
  ($PKG_CONFIG --exists --print-errors "liblzma") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBLZMA_CFLAGS=`$PKG_CONFIG --cflags "liblzma" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$LIBLZMA_LIBS"; then
    pkg_cv_LIBLZMA_LIBS="$LIBLZMA_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"liblzma\""; } >&5
  ($PKG_CONFIG --exists --print-errors "liblzma") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBLZMA_LIBS=`$PKG_CONFIG --libs "liblzma" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                LIBLZMA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "liblzma" 2>&1`
        else
                LIBLZMA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "liblzma" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBLZMA_PKG_ERRORS" >&5


  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $LIBLZMA_CFLAGS"
    LIBS="$LIBS $LIBLZMA_LIBS"
           for ac_header in lzma.h
do :
  ac_fn_c_check_header_compile "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$ac_includes_default"
if test "x$ac_cv_header_lzma_h" = xyes
then :
  printf "%s\n" "#define HAVE_LZMA_H 1" >>confdefs.h

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lzma_easy_encoder in -llzma" >&5
printf %s "checking for lzma_easy_encoder in -llzma... " >&6; }
if test ${ac_cv_lib_lzma_lzma_easy_encoder+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-llzma  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char lzma_easy_encoder (void);
int
main (void)
{
return lzma_easy_encoder ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_lzma_lzma_easy_encoder=yes
else case e in #(
  e) ac_cv_lib_lzma_lzma_easy_encoder=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_easy_encoder" >&5
printf "%s\n" "$ac_cv_lib_lzma_lzma_easy_encoder" >&6; }
if test "x$ac_cv_lib_lzma_lzma_easy_encoder" = xyes
then :
  have_liblzma=yes
else case e in #(
  e) have_liblzma=no ;;
esac
fi


else case e in #(
  e) have_liblzma=no ;;
esac
fi

done
    if test "x$have_liblzma" = xyes
then :

      LIBLZMA_CFLAGS=${LIBLZMA_CFLAGS-""}
      LIBLZMA_LIBS=${LIBLZMA_LIBS-"-llzma"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $LIBLZMA_CFLAGS"
    LIBS="$LIBS $LIBLZMA_LIBS"
           for ac_header in lzma.h
do :
  ac_fn_c_check_header_compile "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$ac_includes_default"
if test "x$ac_cv_header_lzma_h" = xyes
then :
  printf "%s\n" "#define HAVE_LZMA_H 1" >>confdefs.h

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lzma_easy_encoder in -llzma" >&5
printf %s "checking for lzma_easy_encoder in -llzma... " >&6; }
if test ${ac_cv_lib_lzma_lzma_easy_encoder+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-llzma  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char lzma_easy_encoder (void);
int
main (void)
{
return lzma_easy_encoder ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_lzma_lzma_easy_encoder=yes
else case e in #(
  e) ac_cv_lib_lzma_lzma_easy_encoder=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_easy_encoder" >&5
printf "%s\n" "$ac_cv_lib_lzma_lzma_easy_encoder" >&6; }
if test "x$ac_cv_lib_lzma_lzma_easy_encoder" = xyes
then :
  have_liblzma=yes
else case e in #(
  e) have_liblzma=no ;;
esac
fi


else case e in #(
  e) have_liblzma=no ;;
esac
fi

done
    if test "x$have_liblzma" = xyes
then :

      LIBLZMA_CFLAGS=${LIBLZMA_CFLAGS-""}
      LIBLZMA_LIBS=${LIBLZMA_LIBS-"-llzma"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



else
        LIBLZMA_CFLAGS=$pkg_cv_LIBLZMA_CFLAGS
        LIBLZMA_LIBS=$pkg_cv_LIBLZMA_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_liblzma=yes
fi


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libzstd >= 1.4.5" >&5
printf %s "checking for libzstd >= 1.4.5... " >&6; }

if test -n "$LIBZSTD_CFLAGS"; then
    pkg_cv_LIBZSTD_CFLAGS="$LIBZSTD_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd >= 1.4.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libzstd >= 1.4.5") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd >= 1.4.5" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$LIBZSTD_LIBS"; then
    pkg_cv_LIBZSTD_LIBS="$LIBZSTD_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd >= 1.4.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libzstd >= 1.4.5") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBZSTD_LIBS=`$PKG_CONFIG --libs "libzstd >= 1.4.5" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                LIBZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd >= 1.4.5" 2>&1`
        else
                LIBZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd >= 1.4.5" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBZSTD_PKG_ERRORS" >&5


  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $LIBZSTD_CFLAGS"
    CFLAGS="$CFLAGS $LIBZSTD_CFLAGS"
    LIBS="$LIBS $LIBZSTD_LIBS"
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing ZDICT_finalizeDictionary" >&5
printf %s "checking for library containing ZDICT_finalizeDictionary... " >&6; }
if test ${ac_cv_search_ZDICT_finalizeDictionary+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char ZDICT_finalizeDictionary (void);
int
main (void)
{
return ZDICT_finalizeDictionary ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' zstd
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_ZDICT_finalizeDictionary=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_ZDICT_finalizeDictionary+y}
then :
  break
fi
done
if test ${ac_cv_search_ZDICT_finalizeDictionary+y}
then :

else case e in #(
  e) ac_cv_search_ZDICT_finalizeDictionary=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ZDICT_finalizeDictionary" >&5
printf "%s\n" "$ac_cv_search_ZDICT_finalizeDictionary" >&6; }
ac_res=$ac_cv_search_ZDICT_finalizeDictionary
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking ZSTD_VERSION_NUMBER >= 1.4.5" >&5
printf %s "checking ZSTD_VERSION_NUMBER >= 1.4.5... " >&6; }
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

        #include "zstd.h"
int
main (void)
{

          #if ZSTD_VERSION_NUMBER < 10405
          #  error "zstd version is too old"
          #endif

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
               for ac_header in zstd.h zdict.h
do :
  as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | sed "$as_sed_sh"`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"
then :
  cat >>confdefs.h <<_ACEOF
#define `printf "%s\n" "HAVE_$ac_header" | sed "$as_sed_cpp"` 1
_ACEOF
 have_libzstd=yes
else case e in #(
  e) have_libzstd=no ;;
esac
fi

done

else case e in #(
  e)
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_libzstd=no
       ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

else case e in #(
  e) have_libzstd=no ;;
esac
fi

    if test "x$have_libzstd" = xyes
then :

      LIBZSTD_CFLAGS=${LIBZSTD_CFLAGS-""}
      LIBZSTD_LIBS=${LIBZSTD_LIBS-"-lzstd"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $LIBZSTD_CFLAGS"
    CFLAGS="$CFLAGS $LIBZSTD_CFLAGS"
    LIBS="$LIBS $LIBZSTD_LIBS"
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing ZDICT_finalizeDictionary" >&5
printf %s "checking for library containing ZDICT_finalizeDictionary... " >&6; }
if test ${ac_cv_search_ZDICT_finalizeDictionary+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char ZDICT_finalizeDictionary (void);
int
main (void)
{
return ZDICT_finalizeDictionary ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' zstd
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_ZDICT_finalizeDictionary=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_ZDICT_finalizeDictionary+y}
then :
  break
fi
done
if test ${ac_cv_search_ZDICT_finalizeDictionary+y}
then :

else case e in #(
  e) ac_cv_search_ZDICT_finalizeDictionary=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ZDICT_finalizeDictionary" >&5
printf "%s\n" "$ac_cv_search_ZDICT_finalizeDictionary" >&6; }
ac_res=$ac_cv_search_ZDICT_finalizeDictionary
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking ZSTD_VERSION_NUMBER >= 1.4.5" >&5
printf %s "checking ZSTD_VERSION_NUMBER >= 1.4.5... " >&6; }
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

        #include "zstd.h"
int
main (void)
{

          #if ZSTD_VERSION_NUMBER < 10405
          #  error "zstd version is too old"
          #endif

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
               for ac_header in zstd.h zdict.h
do :
  as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | sed "$as_sed_sh"`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"
then :
  cat >>confdefs.h <<_ACEOF
#define `printf "%s\n" "HAVE_$ac_header" | sed "$as_sed_cpp"` 1
_ACEOF
 have_libzstd=yes
else case e in #(
  e) have_libzstd=no ;;
esac
fi

done

else case e in #(
  e)
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_libzstd=no
       ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

else case e in #(
  e) have_libzstd=no ;;
esac
fi

    if test "x$have_libzstd" = xyes
then :

      LIBZSTD_CFLAGS=${LIBZSTD_CFLAGS-""}
      LIBZSTD_LIBS=${LIBZSTD_LIBS-"-lzstd"}

fi

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



else
        LIBZSTD_CFLAGS=$pkg_cv_LIBZSTD_CFLAGS
        LIBZSTD_LIBS=$pkg_cv_LIBZSTD_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_libzstd=yes
fi

if test "x$have_libzstd" = xyes
then :

  REMOTE_DEBUGGING_CFLAGS="-DHAVE_ZSTD $LIBZSTD_CFLAGS"
  REMOTE_DEBUGGING_LIBS="$LIBZSTD_LIBS"

else case e in #(
  e)
  REMOTE_DEBUGGING_CFLAGS=""
  REMOTE_DEBUGGING_LIBS=""
 ;;
esac
fi







  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for hstrerror" >&5
printf %s "checking for hstrerror... " >&6; }
if test ${ac_cv_func_hstrerror+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.h>
int
main (void)
{
void *x=hstrerror
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_hstrerror=yes
else case e in #(
  e) ac_cv_func_hstrerror=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_hstrerror" >&5
printf "%s\n" "$ac_cv_func_hstrerror" >&6; }
  if test "x$ac_cv_func_hstrerror" = xyes
then :

printf "%s\n" "#define HAVE_HSTRERROR 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getservbyname" >&5
printf %s "checking for getservbyname... " >&6; }
if test ${ac_cv_func_getservbyname+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.h>
int
main (void)
{
void *x=getservbyname
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_getservbyname=yes
else case e in #(
  e) ac_cv_func_getservbyname=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getservbyname" >&5
printf "%s\n" "$ac_cv_func_getservbyname" >&6; }
  if test "x$ac_cv_func_getservbyname" = xyes
then :

printf "%s\n" "#define HAVE_GETSERVBYNAME 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getservbyport" >&5
printf %s "checking for getservbyport... " >&6; }
if test ${ac_cv_func_getservbyport+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.h>
int
main (void)
{
void *x=getservbyport
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_getservbyport=yes
else case e in #(
  e) ac_cv_func_getservbyport=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getservbyport" >&5
printf "%s\n" "$ac_cv_func_getservbyport" >&6; }
  if test "x$ac_cv_func_getservbyport" = xyes
then :

printf "%s\n" "#define HAVE_GETSERVBYPORT 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname" >&5
printf %s "checking for gethostbyname... " >&6; }
if test ${ac_cv_func_gethostbyname+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.h>
int
main (void)
{
void *x=gethostbyname
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_gethostbyname=yes
else case e in #(
  e) ac_cv_func_gethostbyname=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gethostbyname" >&5
printf "%s\n" "$ac_cv_func_gethostbyname" >&6; }
  if test "x$ac_cv_func_gethostbyname" = xyes
then :

printf "%s\n" "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyaddr" >&5
printf %s "checking for gethostbyaddr... " >&6; }
if test ${ac_cv_func_gethostbyaddr+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.h>
int
main (void)
{
void *x=gethostbyaddr
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_gethostbyaddr=yes
else case e in #(
  e) ac_cv_func_gethostbyaddr=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gethostbyaddr" >&5
printf "%s\n" "$ac_cv_func_gethostbyaddr" >&6; }
  if test "x$ac_cv_func_gethostbyaddr" = xyes
then :

printf "%s\n" "#define HAVE_GETHOSTBYADDR 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getprotobyname" >&5
printf %s "checking for getprotobyname... " >&6; }
if test ${ac_cv_func_getprotobyname+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.h>
int
main (void)
{
void *x=getprotobyname
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_getprotobyname=yes
else case e in #(
  e) ac_cv_func_getprotobyname=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getprotobyname" >&5
printf "%s\n" "$ac_cv_func_getprotobyname" >&6; }
  if test "x$ac_cv_func_getprotobyname" = xyes
then :

printf "%s\n" "#define HAVE_GETPROTOBYNAME 1" >>confdefs.h

fi








  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inet_aton" >&5
printf %s "checking for inet_aton... " >&6; }
if test ${ac_cv_func_inet_aton+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=inet_aton
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_inet_aton=yes
else case e in #(
  e) ac_cv_func_inet_aton=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_inet_aton" >&5
printf "%s\n" "$ac_cv_func_inet_aton" >&6; }
  if test "x$ac_cv_func_inet_aton" = xyes
then :

printf "%s\n" "#define HAVE_INET_ATON 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa" >&5
printf %s "checking for inet_ntoa... " >&6; }
if test ${ac_cv_func_inet_ntoa+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=inet_ntoa
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_inet_ntoa=yes
else case e in #(
  e) ac_cv_func_inet_ntoa=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_inet_ntoa" >&5
printf "%s\n" "$ac_cv_func_inet_ntoa" >&6; }
  if test "x$ac_cv_func_inet_ntoa" = xyes
then :

printf "%s\n" "#define HAVE_INET_NTOA 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inet_pton" >&5
printf %s "checking for inet_pton... " >&6; }
if test ${ac_cv_func_inet_pton+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=inet_pton
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_inet_pton=yes
else case e in #(
  e) ac_cv_func_inet_pton=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_inet_pton" >&5
printf "%s\n" "$ac_cv_func_inet_pton" >&6; }
  if test "x$ac_cv_func_inet_pton" = xyes
then :

printf "%s\n" "#define HAVE_INET_PTON 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getpeername" >&5
printf %s "checking for getpeername... " >&6; }
if test ${ac_cv_func_getpeername+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=getpeername
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_getpeername=yes
else case e in #(
  e) ac_cv_func_getpeername=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getpeername" >&5
printf "%s\n" "$ac_cv_func_getpeername" >&6; }
  if test "x$ac_cv_func_getpeername" = xyes
then :

printf "%s\n" "#define HAVE_GETPEERNAME 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getsockname" >&5
printf %s "checking for getsockname... " >&6; }
if test ${ac_cv_func_getsockname+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=getsockname
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_getsockname=yes
else case e in #(
  e) ac_cv_func_getsockname=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getsockname" >&5
printf "%s\n" "$ac_cv_func_getsockname" >&6; }
  if test "x$ac_cv_func_getsockname" = xyes
then :

printf "%s\n" "#define HAVE_GETSOCKNAME 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for accept" >&5
printf %s "checking for accept... " >&6; }
if test ${ac_cv_func_accept+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=accept
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_accept=yes
else case e in #(
  e) ac_cv_func_accept=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_accept" >&5
printf "%s\n" "$ac_cv_func_accept" >&6; }
  if test "x$ac_cv_func_accept" = xyes
then :

printf "%s\n" "#define HAVE_ACCEPT 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bind" >&5
printf %s "checking for bind... " >&6; }
if test ${ac_cv_func_bind+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=bind
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_bind=yes
else case e in #(
  e) ac_cv_func_bind=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_bind" >&5
printf "%s\n" "$ac_cv_func_bind" >&6; }
  if test "x$ac_cv_func_bind" = xyes
then :

printf "%s\n" "#define HAVE_BIND 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for connect" >&5
printf %s "checking for connect... " >&6; }
if test ${ac_cv_func_connect+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=connect
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_connect=yes
else case e in #(
  e) ac_cv_func_connect=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_connect" >&5
printf "%s\n" "$ac_cv_func_connect" >&6; }
  if test "x$ac_cv_func_connect" = xyes
then :

printf "%s\n" "#define HAVE_CONNECT 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for listen" >&5
printf %s "checking for listen... " >&6; }
if test ${ac_cv_func_listen+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=listen
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_listen=yes
else case e in #(
  e) ac_cv_func_listen=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_listen" >&5
printf "%s\n" "$ac_cv_func_listen" >&6; }
  if test "x$ac_cv_func_listen" = xyes
then :

printf "%s\n" "#define HAVE_LISTEN 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for recvfrom" >&5
printf %s "checking for recvfrom... " >&6; }
if test ${ac_cv_func_recvfrom+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=recvfrom
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_recvfrom=yes
else case e in #(
  e) ac_cv_func_recvfrom=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_recvfrom" >&5
printf "%s\n" "$ac_cv_func_recvfrom" >&6; }
  if test "x$ac_cv_func_recvfrom" = xyes
then :

printf "%s\n" "#define HAVE_RECVFROM 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sendto" >&5
printf %s "checking for sendto... " >&6; }
if test ${ac_cv_func_sendto+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=sendto
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_sendto=yes
else case e in #(
  e) ac_cv_func_sendto=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_sendto" >&5
printf "%s\n" "$ac_cv_func_sendto" >&6; }
  if test "x$ac_cv_func_sendto" = xyes
then :

printf "%s\n" "#define HAVE_SENDTO 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setsockopt" >&5
printf %s "checking for setsockopt... " >&6; }
if test ${ac_cv_func_setsockopt+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=setsockopt
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_setsockopt=yes
else case e in #(
  e) ac_cv_func_setsockopt=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_setsockopt" >&5
printf "%s\n" "$ac_cv_func_setsockopt" >&6; }
  if test "x$ac_cv_func_setsockopt" = xyes
then :

printf "%s\n" "#define HAVE_SETSOCKOPT 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socket" >&5
printf %s "checking for socket... " >&6; }
if test ${ac_cv_func_socket+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main (void)
{
void *x=socket
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_socket=yes
else case e in #(
  e) ac_cv_func_socket=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_socket" >&5
printf "%s\n" "$ac_cv_func_socket" >&6; }
  if test "x$ac_cv_func_socket" = xyes
then :

printf "%s\n" "#define HAVE_SOCKET 1" >>confdefs.h

fi




# On some systems, setgroups is in unistd.h, on others, in grp.h


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setgroups" >&5
printf %s "checking for setgroups... " >&6; }
if test ${ac_cv_func_setgroups+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <unistd.h>
#ifdef HAVE_GRP_H
#include <grp.h>
#endif

int
main (void)
{
void *x=setgroups
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_setgroups=yes
else case e in #(
  e) ac_cv_func_setgroups=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_setgroups" >&5
printf "%s\n" "$ac_cv_func_setgroups" >&6; }
  if test "x$ac_cv_func_setgroups" = xyes
then :

printf "%s\n" "#define HAVE_SETGROUPS 1" >>confdefs.h

fi




ac_fn_check_decl "$LINENO" "MAXLOGNAME" "ac_cv_have_decl_MAXLOGNAME" "#include <sys/param.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_MAXLOGNAME" = xyes
then :

printf "%s\n" "#define HAVE_MAXLOGNAME 1" >>confdefs.h

fi

ac_fn_check_decl "$LINENO" "UT_NAMESIZE" "ac_cv_have_decl_UT_NAMESIZE" "#include <utmp.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_UT_NAMESIZE" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_UT_NAMESIZE $ac_have_decl" >>confdefs.h
if test $ac_have_decl = 1
then :

printf "%s\n" "#define HAVE_UT_NAMESIZE 1" >>confdefs.h

fi

# musl libc redefines struct prctl_mm_map and conflicts with linux/prctl.h
if test "$ac_cv_libc" != musl
then :

ac_fn_check_decl "$LINENO" "PR_SET_VMA_ANON_NAME" "ac_cv_have_decl_PR_SET_VMA_ANON_NAME" "#include <linux/prctl.h>
               #include <sys/prctl.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_PR_SET_VMA_ANON_NAME" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_PR_SET_VMA_ANON_NAME $ac_have_decl" >>confdefs.h
if test $ac_have_decl = 1
then :

printf "%s\n" "#define _Py_HAVE_PR_SET_VMA_ANON_NAME 1" >>confdefs.h

fi


fi
# check for openpty, login_tty, and forkpty


  for ac_func in openpty
do :
  ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty"
if test "x$ac_cv_func_openpty" = xyes
then :
  printf "%s\n" "#define HAVE_OPENPTY 1" >>confdefs.h

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5
printf %s "checking for openpty in -lutil... " >&6; }
if test ${ac_cv_lib_util_openpty+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lutil  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char openpty (void);
int
main (void)
{
return openpty ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_util_openpty=yes
else case e in #(
  e) ac_cv_lib_util_openpty=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5
printf "%s\n" "$ac_cv_lib_util_openpty" >&6; }
if test "x$ac_cv_lib_util_openpty" = xyes
then :
  printf "%s\n" "#define HAVE_OPENPTY 1" >>confdefs.h
 LIBS="$LIBS -lutil"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openpty in -lbsd" >&5
printf %s "checking for openpty in -lbsd... " >&6; }
if test ${ac_cv_lib_bsd_openpty+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char openpty (void);
int
main (void)
{
return openpty ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_bsd_openpty=yes
else case e in #(
  e) ac_cv_lib_bsd_openpty=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_openpty" >&5
printf "%s\n" "$ac_cv_lib_bsd_openpty" >&6; }
if test "x$ac_cv_lib_bsd_openpty" = xyes
then :
  printf "%s\n" "#define HAVE_OPENPTY 1" >>confdefs.h
 LIBS="$LIBS -lbsd"
fi
 ;;
esac
fi
 ;;
esac
fi

done
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing login_tty" >&5
printf %s "checking for library containing login_tty... " >&6; }
if test ${ac_cv_search_login_tty+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char login_tty (void);
int
main (void)
{
return login_tty ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' util
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_login_tty=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_login_tty+y}
then :
  break
fi
done
if test ${ac_cv_search_login_tty+y}
then :

else case e in #(
  e) ac_cv_search_login_tty=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_login_tty" >&5
printf "%s\n" "$ac_cv_search_login_tty" >&6; }
ac_res=$ac_cv_search_login_tty
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

printf "%s\n" "#define HAVE_LOGIN_TTY 1" >>confdefs.h


fi


  for ac_func in forkpty
do :
  ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty"
if test "x$ac_cv_func_forkpty" = xyes
then :
  printf "%s\n" "#define HAVE_FORKPTY 1" >>confdefs.h

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil" >&5
printf %s "checking for forkpty in -lutil... " >&6; }
if test ${ac_cv_lib_util_forkpty+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lutil  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char forkpty (void);
int
main (void)
{
return forkpty ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_util_forkpty=yes
else case e in #(
  e) ac_cv_lib_util_forkpty=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty" >&5
printf "%s\n" "$ac_cv_lib_util_forkpty" >&6; }
if test "x$ac_cv_lib_util_forkpty" = xyes
then :
  printf "%s\n" "#define HAVE_FORKPTY 1" >>confdefs.h
 LIBS="$LIBS -lutil"
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lbsd" >&5
printf %s "checking for forkpty in -lbsd... " >&6; }
if test ${ac_cv_lib_bsd_forkpty+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char forkpty (void);
int
main (void)
{
return forkpty ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_bsd_forkpty=yes
else case e in #(
  e) ac_cv_lib_bsd_forkpty=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_forkpty" >&5
printf "%s\n" "$ac_cv_lib_bsd_forkpty" >&6; }
if test "x$ac_cv_lib_bsd_forkpty" = xyes
then :
  printf "%s\n" "#define HAVE_FORKPTY 1" >>confdefs.h
 LIBS="$LIBS -lbsd"
fi
 ;;
esac
fi
 ;;
esac
fi

done

# check for long file support functions
ac_fn_c_check_func "$LINENO" "fseek64" "ac_cv_func_fseek64"
if test "x$ac_cv_func_fseek64" = xyes
then :
  printf "%s\n" "#define HAVE_FSEEK64 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fseeko" "ac_cv_func_fseeko"
if test "x$ac_cv_func_fseeko" = xyes
then :
  printf "%s\n" "#define HAVE_FSEEKO 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "fstatvfs" "ac_cv_func_fstatvfs"
if test "x$ac_cv_func_fstatvfs" = xyes
then :
  printf "%s\n" "#define HAVE_FSTATVFS 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ftell64" "ac_cv_func_ftell64"
if test "x$ac_cv_func_ftell64" = xyes
then :
  printf "%s\n" "#define HAVE_FTELL64 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "ftello" "ac_cv_func_ftello"
if test "x$ac_cv_func_ftello" = xyes
then :
  printf "%s\n" "#define HAVE_FTELLO 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "statvfs" "ac_cv_func_statvfs"
if test "x$ac_cv_func_statvfs" = xyes
then :
  printf "%s\n" "#define HAVE_STATVFS 1" >>confdefs.h

fi


ac_fn_c_check_func "$LINENO" "dup2" "ac_cv_func_dup2"
if test "x$ac_cv_func_dup2" = xyes
then :
  printf "%s\n" "#define HAVE_DUP2 1" >>confdefs.h

else case e in #(
  e) case " $LIBOBJS " in
  *" dup2.$ac_objext "* ) ;;
  *) LIBOBJS="$LIBOBJS dup2.$ac_objext"
 ;;
esac
 ;;
esac
fi


  for ac_func in getpgrp
do :
  ac_fn_c_check_func "$LINENO" "getpgrp" "ac_cv_func_getpgrp"
if test "x$ac_cv_func_getpgrp" = xyes
then :
  printf "%s\n" "#define HAVE_GETPGRP 1" >>confdefs.h
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
getpgrp(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

printf "%s\n" "#define GETPGRP_HAVE_ARG 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

done

  for ac_func in setpgrp
do :
  ac_fn_c_check_func "$LINENO" "setpgrp" "ac_cv_func_setpgrp"
if test "x$ac_cv_func_setpgrp" = xyes
then :
  printf "%s\n" "#define HAVE_SETPGRP 1" >>confdefs.h
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main (void)
{
setpgrp(0,0);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

printf "%s\n" "#define SETPGRP_HAVE_ARG 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

done

# check for namespace functions
ac_fn_c_check_func "$LINENO" "setns" "ac_cv_func_setns"
if test "x$ac_cv_func_setns" = xyes
then :
  printf "%s\n" "#define HAVE_SETNS 1" >>confdefs.h

fi
ac_fn_c_check_func "$LINENO" "unshare" "ac_cv_func_unshare"
if test "x$ac_cv_func_unshare" = xyes
then :
  printf "%s\n" "#define HAVE_UNSHARE 1" >>confdefs.h

fi



  for ac_func in clock_gettime
do :
  ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime"
if test "x$ac_cv_func_clock_gettime" = xyes
then :
  printf "%s\n" "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
printf %s "checking for clock_gettime in -lrt... " >&6; }
if test ${ac_cv_lib_rt_clock_gettime+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char clock_gettime (void);
int
main (void)
{
return clock_gettime ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_rt_clock_gettime=yes
else case e in #(
  e) ac_cv_lib_rt_clock_gettime=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
printf "%s\n" "$ac_cv_lib_rt_clock_gettime" >&6; }
if test "x$ac_cv_lib_rt_clock_gettime" = xyes
then :

        LIBS="$LIBS -lrt"
        printf "%s\n" "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h


printf "%s\n" "#define TIMEMODULE_LIB rt" >>confdefs.h


fi

 ;;
esac
fi

done


  for ac_func in clock_getres
do :
  ac_fn_c_check_func "$LINENO" "clock_getres" "ac_cv_func_clock_getres"
if test "x$ac_cv_func_clock_getres" = xyes
then :
  printf "%s\n" "#define HAVE_CLOCK_GETRES 1" >>confdefs.h

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_getres in -lrt" >&5
printf %s "checking for clock_getres in -lrt... " >&6; }
if test ${ac_cv_lib_rt_clock_getres+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char clock_getres (void);
int
main (void)
{
return clock_getres ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_rt_clock_getres=yes
else case e in #(
  e) ac_cv_lib_rt_clock_getres=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_getres" >&5
printf "%s\n" "$ac_cv_lib_rt_clock_getres" >&6; }
if test "x$ac_cv_lib_rt_clock_getres" = xyes
then :

        printf "%s\n" "#define HAVE_CLOCK_GETRES 1" >>confdefs.h


fi

 ;;
esac
fi

done

# On Android and iOS, clock_settime can be linked (so it is found by
# configure), but when used in an unprivileged process, it crashes rather than
# returning an error. Force the symbol off.
if test "$ac_sys_system" != "Linux-android" && test "$ac_sys_system" != "iOS"
then

  for ac_func in clock_settime
do :
  ac_fn_c_check_func "$LINENO" "clock_settime" "ac_cv_func_clock_settime"
if test "x$ac_cv_func_clock_settime" = xyes
then :
  printf "%s\n" "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h

else case e in #(
  e)
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_settime in -lrt" >&5
printf %s "checking for clock_settime in -lrt... " >&6; }
if test ${ac_cv_lib_rt_clock_settime+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char clock_settime (void);
int
main (void)
{
return clock_settime ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_rt_clock_settime=yes
else case e in #(
  e) ac_cv_lib_rt_clock_settime=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_settime" >&5
printf "%s\n" "$ac_cv_lib_rt_clock_settime" >&6; }
if test "x$ac_cv_lib_rt_clock_settime" = xyes
then :

          printf "%s\n" "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h


fi

   ;;
esac
fi

done
fi

# On Android before API level 23, clock_nanosleep returns the wrong value when
# interrupted by a signal (https://issuetracker.google.com/issues/216495770).
if ! { test "$ac_sys_system" = "Linux-android" &&
       test "$ANDROID_API_LEVEL" -lt 23; }; then

  for ac_func in clock_nanosleep
do :
  ac_fn_c_check_func "$LINENO" "clock_nanosleep" "ac_cv_func_clock_nanosleep"
if test "x$ac_cv_func_clock_nanosleep" = xyes
then :
  printf "%s\n" "#define HAVE_CLOCK_NANOSLEEP 1" >>confdefs.h

else case e in #(
  e)
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_nanosleep in -lrt" >&5
printf %s "checking for clock_nanosleep in -lrt... " >&6; }
if test ${ac_cv_lib_rt_clock_nanosleep+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char clock_nanosleep (void);
int
main (void)
{
return clock_nanosleep ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_rt_clock_nanosleep=yes
else case e in #(
  e) ac_cv_lib_rt_clock_nanosleep=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_nanosleep" >&5
printf "%s\n" "$ac_cv_lib_rt_clock_nanosleep" >&6; }
if test "x$ac_cv_lib_rt_clock_nanosleep" = xyes
then :

          printf "%s\n" "#define HAVE_CLOCK_NANOSLEEP 1" >>confdefs.h


fi

   ;;
esac
fi

done
fi


  for ac_func in nanosleep
do :
  ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep"
if test "x$ac_cv_func_nanosleep" = xyes
then :
  printf "%s\n" "#define HAVE_NANOSLEEP 1" >>confdefs.h

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5
printf %s "checking for nanosleep in -lrt... " >&6; }
if test ${ac_cv_lib_rt_nanosleep+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char nanosleep (void);
int
main (void)
{
return nanosleep ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_rt_nanosleep=yes
else case e in #(
  e) ac_cv_lib_rt_nanosleep=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep" >&5
printf "%s\n" "$ac_cv_lib_rt_nanosleep" >&6; }
if test "x$ac_cv_lib_rt_nanosleep" = xyes
then :

        printf "%s\n" "#define HAVE_NANOSLEEP 1" >>confdefs.h


fi

 ;;
esac
fi

done

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for major, minor, and makedev" >&5
printf %s "checking for major, minor, and makedev... " >&6; }
if test ${ac_cv_device_macros+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#if defined(MAJOR_IN_MKDEV)
#include <sys/mkdev.h>
#elif defined(MAJOR_IN_SYSMACROS)
#include <sys/types.h>
#include <sys/sysmacros.h>
#else
#include <sys/types.h>
#endif

int
main (void)
{

  makedev(major(0),minor(0));

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_device_macros=yes
else case e in #(
  e) ac_cv_device_macros=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_device_macros" >&5
printf "%s\n" "$ac_cv_device_macros" >&6; }
if test "x$ac_cv_device_macros" = xyes
then :


printf "%s\n" "#define HAVE_DEVICE_MACROS 1" >>confdefs.h


fi


printf "%s\n" "#define SYS_SELECT_WITH_SYS_TIME 1" >>confdefs.h


# On OSF/1 V5.1, getaddrinfo is available, but a define
# for [no]getaddrinfo in netdb.h.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5
printf %s "checking for getaddrinfo... " >&6; }
if test ${ac_cv_func_getaddrinfo+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>

int
main (void)
{
getaddrinfo(NULL, NULL, NULL, NULL);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_func_getaddrinfo=yes
else case e in #(
  e) ac_cv_func_getaddrinfo=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getaddrinfo" >&5
printf "%s\n" "$ac_cv_func_getaddrinfo" >&6; }

if test "x$ac_cv_func_getaddrinfo" = xyes
then :

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking getaddrinfo bug" >&5
printf %s "checking getaddrinfo bug... " >&6; }
if test ${ac_cv_buggy_getaddrinfo+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :

if test "$ac_sys_system" = "Linux-android" || test "$ac_sys_system" = "iOS"; then
  ac_cv_buggy_getaddrinfo="no"
elif test "${enable_ipv6+set}" = set; then
  ac_cv_buggy_getaddrinfo="no -- configured with --(en|dis)able-ipv6"
else
  ac_cv_buggy_getaddrinfo=yes
fi
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void)
{
  int passive, gaierr, inet4 = 0, inet6 = 0;
  struct addrinfo hints, *ai, *aitop;
  char straddr[INET6_ADDRSTRLEN], strport[16];

  for (passive = 0; passive <= 1; passive++) {
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_flags = passive ? AI_PASSIVE : 0;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
      (void)gai_strerror(gaierr);
      goto bad;
    }
    for (ai = aitop; ai; ai = ai->ai_next) {
      if (ai->ai_addr == NULL ||
          ai->ai_addrlen == 0 ||
          getnameinfo(ai->ai_addr, ai->ai_addrlen,
                      straddr, sizeof(straddr), strport, sizeof(strport),
                      NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
        goto bad;
      }
      switch (ai->ai_family) {
      case AF_INET:
        if (strcmp(strport, "54321") != 0) {
          goto bad;
        }
        if (passive) {
          if (strcmp(straddr, "0.0.0.0") != 0) {
            goto bad;
          }
        } else {
          if (strcmp(straddr, "127.0.0.1") != 0) {
            goto bad;
          }
        }
        inet4++;
        break;
      case AF_INET6:
        if (strcmp(strport, "54321") != 0) {
          goto bad;
        }
        if (passive) {
          if (strcmp(straddr, "::") != 0) {
            goto bad;
          }
        } else {
          if (strcmp(straddr, "::1") != 0) {
            goto bad;
          }
        }
        inet6++;
        break;
      case AF_UNSPEC:
        goto bad;
        break;
      default:
        /* another family support? */
        break;
      }
    }
    freeaddrinfo(aitop);
    aitop = NULL;
  }

  if (!(inet4 == 0 || inet4 == 2))
    goto bad;
  if (!(inet6 == 0 || inet6 == 2))
    goto bad;

  if (aitop)
    freeaddrinfo(aitop);
  return 0;

 bad:
  if (aitop)
    freeaddrinfo(aitop);
  return 1;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_buggy_getaddrinfo=no
else case e in #(
  e) ac_cv_buggy_getaddrinfo=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_buggy_getaddrinfo" >&5
printf "%s\n" "$ac_cv_buggy_getaddrinfo" >&6; }


fi

if test "$ac_cv_func_getaddrinfo" = no -o "$ac_cv_buggy_getaddrinfo" = yes
then
  if test "x$ipv6" = xyes
then :

    as_fn_error $? "You must get working getaddrinfo() function or pass the \"--disable-ipv6\" option to configure." "$LINENO" 5

fi
else

printf "%s\n" "#define HAVE_GETADDRINFO 1" >>confdefs.h

fi

ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo"
if test "x$ac_cv_func_getnameinfo" = xyes
then :
  printf "%s\n" "#define HAVE_GETNAMEINFO 1" >>confdefs.h

fi


# checks for structures
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5
printf %s "checking whether struct tm is in sys/time.h or time.h... " >&6; }
if test ${ac_cv_struct_tm+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#include <time.h>

int
main (void)
{
struct tm tm;
				     int *p = &tm.tm_sec;
				     return !p;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_struct_tm=time.h
else case e in #(
  e) ac_cv_struct_tm=sys/time.h ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5
printf "%s\n" "$ac_cv_struct_tm" >&6; }
if test $ac_cv_struct_tm = sys/time.h; then

printf "%s\n" "#define TM_IN_SYS_TIME 1" >>confdefs.h

fi

ac_fn_c_check_member "$LINENO" "struct tm" "tm_zone" "ac_cv_member_struct_tm_tm_zone" "#include <sys/types.h>
#include <$ac_cv_struct_tm>

"
if test "x$ac_cv_member_struct_tm_tm_zone" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_TM_TM_ZONE 1" >>confdefs.h


fi

if test "$ac_cv_member_struct_tm_tm_zone" = yes; then

printf "%s\n" "#define HAVE_TM_ZONE 1" >>confdefs.h

else
  ac_fn_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include <time.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_tzname" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_TZNAME $ac_have_decl" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5
printf %s "checking for tzname... " >&6; }
if test ${ac_cv_var_tzname+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <time.h>
#if !HAVE_DECL_TZNAME
extern char *tzname[];
#endif

int
main (void)
{
return tzname[0][0];
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_var_tzname=yes
else case e in #(
  e) ac_cv_var_tzname=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tzname" >&5
printf "%s\n" "$ac_cv_var_tzname" >&6; }
  if test $ac_cv_var_tzname = yes; then

printf "%s\n" "#define HAVE_TZNAME 1" >>confdefs.h

  fi
fi

ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev" "ac_cv_member_struct_stat_st_rdev" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_rdev" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STAT_ST_RDEV 1" >>confdefs.h


fi

ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_blksize" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BLKSIZE 1" >>confdefs.h


fi

ac_fn_c_check_member "$LINENO" "struct stat" "st_flags" "ac_cv_member_struct_stat_st_flags" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_flags" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STAT_ST_FLAGS 1" >>confdefs.h


fi

ac_fn_c_check_member "$LINENO" "struct stat" "st_gen" "ac_cv_member_struct_stat_st_gen" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_gen" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STAT_ST_GEN 1" >>confdefs.h


fi

ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtime" "ac_cv_member_struct_stat_st_birthtime" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1" >>confdefs.h


fi

ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_blocks" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BLOCKS 1" >>confdefs.h


fi

ac_fn_c_check_member "$LINENO" "struct passwd" "pw_gecos" "ac_cv_member_struct_passwd_pw_gecos" "
  #include <sys/types.h>
  #include <pwd.h>

"
if test "x$ac_cv_member_struct_passwd_pw_gecos" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_PASSWD_PW_GECOS 1" >>confdefs.h


fi
ac_fn_c_check_member "$LINENO" "struct passwd" "pw_passwd" "ac_cv_member_struct_passwd_pw_passwd" "
  #include <sys/types.h>
  #include <pwd.h>

"
if test "x$ac_cv_member_struct_passwd_pw_passwd" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_PASSWD_PW_PASSWD 1" >>confdefs.h


fi

# Issue #21085: In Cygwin, siginfo_t does not have si_band field.
ac_fn_c_check_member "$LINENO" "siginfo_t" "si_band" "ac_cv_member_siginfo_t_si_band" "#include <signal.h>
"
if test "x$ac_cv_member_siginfo_t_si_band" = xyes
then :

printf "%s\n" "#define HAVE_SIGINFO_T_SI_BAND 1" >>confdefs.h


fi


if test "$ac_cv_func_statx" = yes; then
  # Some systems have the definitions of the mask bits without having the
  # corresponding members in struct statx.  Check for members added after Linux
  # 4.11 (when statx itself was added).
  ac_fn_c_check_member "$LINENO" "struct statx" "stx_mnt_id" "ac_cv_member_struct_statx_stx_mnt_id" "$ac_includes_default"
if test "x$ac_cv_member_struct_statx_stx_mnt_id" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STATX_STX_MNT_ID 1" >>confdefs.h


fi

  ac_fn_c_check_member "$LINENO" "struct statx" "stx_dio_mem_align" "ac_cv_member_struct_statx_stx_dio_mem_align" "$ac_includes_default"
if test "x$ac_cv_member_struct_statx_stx_dio_mem_align" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STATX_STX_DIO_MEM_ALIGN 1" >>confdefs.h


fi

  # stx_dio_offset_align was added together with stx_dio_mem_align
  ac_fn_c_check_member "$LINENO" "struct statx" "stx_subvol" "ac_cv_member_struct_statx_stx_subvol" "$ac_includes_default"
if test "x$ac_cv_member_struct_statx_stx_subvol" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STATX_STX_SUBVOL 1" >>confdefs.h


fi

  ac_fn_c_check_member "$LINENO" "struct statx" "stx_atomic_write_unit_min" "ac_cv_member_struct_statx_stx_atomic_write_unit_min" "$ac_includes_default"
if test "x$ac_cv_member_struct_statx_stx_atomic_write_unit_min" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STATX_STX_ATOMIC_WRITE_UNIT_MIN 1" >>confdefs.h


fi

  # stx_atomic_write_unit_max and stx_atomic_write_segments_max were added
  # together with stx_atomic_write_unit_min
  ac_fn_c_check_member "$LINENO" "struct statx" "stx_dio_read_offset_align" "ac_cv_member_struct_statx_stx_dio_read_offset_align" "$ac_includes_default"
if test "x$ac_cv_member_struct_statx_stx_dio_read_offset_align" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STATX_STX_DIO_READ_OFFSET_ALIGN 1" >>confdefs.h


fi

  # stx_atomic_write_unit_max_opt was added in Linux 6.16, but is controlled by
  # the STATX_WRITE_ATOMIC mask bit added in Linux 6.11, so having the mask bit
  # doesn't imply having the member.
  ac_fn_c_check_member "$LINENO" "struct statx" "stx_atomic_write_unit_max_opt" "ac_cv_member_struct_statx_stx_atomic_write_unit_max_opt" "$ac_includes_default"
if test "x$ac_cv_member_struct_statx_stx_atomic_write_unit_max_opt" = xyes
then :

printf "%s\n" "#define HAVE_STRUCT_STATX_STX_ATOMIC_WRITE_UNIT_MAX_OPT 1" >>confdefs.h


fi

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for time.h that defines altzone" >&5
printf %s "checking for time.h that defines altzone... " >&6; }
if test ${ac_cv_header_time_altzone+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <time.h>
int
main (void)
{
return altzone;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_header_time_altzone=yes
else case e in #(
  e) ac_cv_header_time_altzone=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time_altzone" >&5
printf "%s\n" "$ac_cv_header_time_altzone" >&6; }
if test $ac_cv_header_time_altzone = yes; then

printf "%s\n" "#define HAVE_ALTZONE 1" >>confdefs.h

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for addrinfo" >&5
printf %s "checking for addrinfo... " >&6; }
if test ${ac_cv_struct_addrinfo+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.h>
int
main (void)
{
struct addrinfo a
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_struct_addrinfo=yes
else case e in #(
  e) ac_cv_struct_addrinfo=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_addrinfo" >&5
printf "%s\n" "$ac_cv_struct_addrinfo" >&6; }
if test $ac_cv_struct_addrinfo = yes; then

printf "%s\n" "#define HAVE_ADDRINFO 1" >>confdefs.h

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sockaddr_storage" >&5
printf %s "checking for sockaddr_storage... " >&6; }
if test ${ac_cv_struct_sockaddr_storage+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#		include <sys/types.h>
#		include <sys/socket.h>
int
main (void)
{
struct sockaddr_storage s
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_struct_sockaddr_storage=yes
else case e in #(
  e) ac_cv_struct_sockaddr_storage=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_sockaddr_storage" >&5
printf "%s\n" "$ac_cv_struct_sockaddr_storage" >&6; }
if test $ac_cv_struct_sockaddr_storage = yes; then

printf "%s\n" "#define HAVE_SOCKADDR_STORAGE 1" >>confdefs.h

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sockaddr_alg" >&5
printf %s "checking for sockaddr_alg... " >&6; }
if test ${ac_cv_struct_sockaddr_alg+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#		include <sys/types.h>
#		include <sys/socket.h>
#		include <linux/if_alg.h>
int
main (void)
{
struct sockaddr_alg s
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_struct_sockaddr_alg=yes
else case e in #(
  e) ac_cv_struct_sockaddr_alg=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_sockaddr_alg" >&5
printf "%s\n" "$ac_cv_struct_sockaddr_alg" >&6; }
if test $ac_cv_struct_sockaddr_alg = yes; then

printf "%s\n" "#define HAVE_SOCKADDR_ALG 1" >>confdefs.h

fi

# checks for compiler characteristics

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
printf %s "checking for an ANSI C-conforming const... " >&6; }
if test ${ac_cv_c_const+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

#ifndef __cplusplus
  /* Ultrix mips cc rejects this sort of thing.  */
  typedef int charset[2];
  const charset cs = { 0, 0 };
  /* SunOS 4.1.1 cc rejects this.  */
  char const *const *pcpcc;
  char **ppc;
  /* NEC SVR4.0.2 mips cc rejects this.  */
  struct point {int x, y;};
  static struct point const zero = {0,0};
  /* IBM XL C 1.02.0.0 rejects this.
     It does not let you subtract one const X* pointer from another in
     an arm of an if-expression whose if-part is not a constant
     expression */
  const char *g = "string";
  pcpcc = &g + (g ? g-g : 0);
  /* HPUX 7.0 cc rejects these. */
  ++pcpcc;
  ppc = (char**) pcpcc;
  pcpcc = (char const *const *) ppc;
  { /* SCO 3.2v4 cc rejects this sort of thing.  */
    char tx;
    char *t = &tx;
    char const *s = 0 ? (char *) 0 : (char const *) 0;

    *t++ = 0;
    if (s) return 0;
  }
  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
    int x[] = {25, 17};
    const int *foo = &x[0];
    ++foo;
  }
  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
    typedef const int *iptr;
    iptr p = 0;
    ++p;
  }
  { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying
       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
    struct s { int j; const int *ap[3]; } bx;
    struct s *b = &bx; b->j = 5;
  }
  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
    const int foo = 10;
    if (!foo) return 0;
  }
  return !cs[0] && !zero.x;
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_c_const=yes
else case e in #(
  e) ac_cv_c_const=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
printf "%s\n" "$ac_cv_c_const" >&6; }
if test $ac_cv_c_const = no; then

printf "%s\n" "#define const /**/" >>confdefs.h

fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working signed char" >&5
printf %s "checking for working signed char... " >&6; }
if test ${ac_cv_working_signed_char_c+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{
signed char c;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_working_signed_char_c=yes
else case e in #(
  e) ac_cv_working_signed_char_c=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_signed_char_c" >&5
printf "%s\n" "$ac_cv_working_signed_char_c" >&6; }
if test "x$ac_cv_working_signed_char_c" = xno
then :


printf "%s\n" "#define signed /**/" >>confdefs.h


fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for prototypes" >&5
printf %s "checking for prototypes... " >&6; }
if test ${ac_cv_function_prototypes+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo(int x) { return 0; }
int
main (void)
{
return foo(10);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_function_prototypes=yes
else case e in #(
  e) ac_cv_function_prototypes=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_function_prototypes" >&5
printf "%s\n" "$ac_cv_function_prototypes" >&6; }
if test "x$ac_cv_function_prototypes" = xyes
then :


printf "%s\n" "#define HAVE_PROTOTYPES 1" >>confdefs.h


fi


# check for socketpair


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socketpair" >&5
printf %s "checking for socketpair... " >&6; }
if test ${ac_cv_func_socketpair+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/socket.h>

int
main (void)
{
void *x=socketpair
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_func_socketpair=yes
else case e in #(
  e) ac_cv_func_socketpair=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_socketpair" >&5
printf "%s\n" "$ac_cv_func_socketpair" >&6; }
  if test "x$ac_cv_func_socketpair" = xyes
then :

printf "%s\n" "#define HAVE_SOCKETPAIR 1" >>confdefs.h

fi




# check if sockaddr has sa_len member
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if sockaddr has sa_len member" >&5
printf %s "checking if sockaddr has sa_len member... " >&6; }
if test ${ac_cv_struct_sockaddr_sa_len+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#include <sys/socket.h>
int
main (void)
{
struct sockaddr x;
x.sa_len = 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_struct_sockaddr_sa_len=yes
else case e in #(
  e) ac_cv_struct_sockaddr_sa_len=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_sockaddr_sa_len" >&5
printf "%s\n" "$ac_cv_struct_sockaddr_sa_len" >&6; }
if test "x$ac_cv_struct_sockaddr_sa_len" = xyes
then :


printf "%s\n" "#define HAVE_SOCKADDR_SA_LEN 1" >>confdefs.h


fi

# sigh -- gethostbyname_r is a mess; it can have 3, 5 or 6 arguments :-(


ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r"
if test "x$ac_cv_func_gethostbyname_r" = xyes
then :
  printf "%s\n" "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking gethostbyname_r with 6 args" >&5
printf %s "checking gethostbyname_r with 6 args... " >&6; }
  OLD_CFLAGS=$CFLAGS
  CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#   include <netdb.h>

int
main (void)
{

    char *name;
    struct hostent *he, *res;
    char buffer[2048];
    int buflen = 2048;
    int h_errnop;

    (void) gethostbyname_r(name, he, buffer, buflen, &res, &h_errnop)

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

    printf "%s\n" "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h


printf "%s\n" "#define HAVE_GETHOSTBYNAME_R_6_ARG 1" >>confdefs.h

    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

else case e in #(
  e)
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking gethostbyname_r with 5 args" >&5
printf %s "checking gethostbyname_r with 5 args... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#       include <netdb.h>

int
main (void)
{

        char *name;
        struct hostent *he;
        char buffer[2048];
        int buflen = 2048;
        int h_errnop;

        (void) gethostbyname_r(name, he, buffer, buflen, &h_errnop)

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

        printf "%s\n" "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h


printf "%s\n" "#define HAVE_GETHOSTBYNAME_R_5_ARG 1" >>confdefs.h

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

else case e in #(
  e)
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking gethostbyname_r with 3 args" >&5
printf %s "checking gethostbyname_r with 3 args... " >&6; }
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#           include <netdb.h>

int
main (void)
{

            char *name;
            struct hostent *he;
            struct hostent_data data;

            (void) gethostbyname_r(name, he, &data);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

            printf "%s\n" "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h


printf "%s\n" "#define HAVE_GETHOSTBYNAME_R_3_ARG 1" >>confdefs.h

            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

else case e in #(
  e)
           { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
         ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
     ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$OLD_CFLAGS

else case e in #(
  e)
  ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
if test "x$ac_cv_func_gethostbyname" = xyes
then :
  printf "%s\n" "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h

fi

 ;;
esac
fi







# checks for system services
# (none yet)

# Linux requires this for correct f.p. operations
ac_fn_c_check_func "$LINENO" "__fpu_control" "ac_cv_func___fpu_control"
if test "x$ac_cv_func___fpu_control" = xyes
then :

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __fpu_control in -lieee" >&5
printf %s "checking for __fpu_control in -lieee... " >&6; }
if test ${ac_cv_lib_ieee___fpu_control+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lieee  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char __fpu_control (void);
int
main (void)
{
return __fpu_control ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_ieee___fpu_control=yes
else case e in #(
  e) ac_cv_lib_ieee___fpu_control=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee___fpu_control" >&5
printf "%s\n" "$ac_cv_lib_ieee___fpu_control" >&6; }
if test "x$ac_cv_lib_ieee___fpu_control" = xyes
then :
  printf "%s\n" "#define HAVE_LIBIEEE 1" >>confdefs.h

  LIBS="-lieee $LIBS"

fi

 ;;
esac
fi


# check for --with-libm=...

case $ac_sys_system in
Darwin) ;;
*) LIBM=-lm
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-libm=STRING" >&5
printf %s "checking for --with-libm=STRING... " >&6; }

# Check whether --with-libm was given.
if test ${with_libm+y}
then :
  withval=$with_libm;
if test "$withval" = no
then LIBM=
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: force LIBM empty" >&5
printf "%s\n" "force LIBM empty" >&6; }
elif test "$withval" != yes
then LIBM=$withval
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: set LIBM=\"$withval\"" >&5
printf "%s\n" "set LIBM=\"$withval\"" >&6; }
else as_fn_error $? "proper usage is --with-libm=STRING" "$LINENO" 5
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: default LIBM=\"$LIBM\"" >&5
printf "%s\n" "default LIBM=\"$LIBM\"" >&6; } ;;
esac
fi


# check for --with-libc=...

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-libc=STRING" >&5
printf %s "checking for --with-libc=STRING... " >&6; }

# Check whether --with-libc was given.
if test ${with_libc+y}
then :
  withval=$with_libc;
if test "$withval" = no
then LIBC=
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: force LIBC empty" >&5
printf "%s\n" "force LIBC empty" >&6; }
elif test "$withval" != yes
then LIBC=$withval
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: set LIBC=\"$withval\"" >&5
printf "%s\n" "set LIBC=\"$withval\"" >&6; }
else as_fn_error $? "proper usage is --with-libc=STRING" "$LINENO" 5
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: default LIBC=\"$LIBC\"" >&5
printf "%s\n" "default LIBC=\"$LIBC\"" >&6; } ;;
esac
fi


# **************************************
# * Check for gcc x64 inline assembler *
# **************************************


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for x64 gcc inline assembler" >&5
printf %s "checking for x64 gcc inline assembler... " >&6; }
if test ${ac_cv_gcc_asm_for_x64+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  __asm__ __volatile__ ("movq %rcx, %rax");

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_gcc_asm_for_x64=yes
else case e in #(
  e) ac_cv_gcc_asm_for_x64=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_asm_for_x64" >&5
printf "%s\n" "$ac_cv_gcc_asm_for_x64" >&6; }

if test "x$ac_cv_gcc_asm_for_x64" = xyes
then :


printf "%s\n" "#define HAVE_GCC_ASM_FOR_X64 1" >>confdefs.h


fi

# **************************************************
# * Check for various properties of floating point *
# **************************************************

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether float word ordering is bigendian" >&5
printf %s "checking whether float word ordering is bigendian... " >&6; }
if test ${ax_cv_c_float_words_bigendian+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)

ax_cv_c_float_words_bigendian=unknown
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#include <stdlib.h>

static double m[] = {9.090423496703681e+223, 0.0};

int main (int argc, char *argv[])
{
    m[atoi (argv[1])] += atof (argv[2]);
    return m[atoi (argv[3])] > 0.0;
}


_ACEOF
if ac_fn_c_try_link "$LINENO"
then :


if grep noonsees conftest* > /dev/null ; then
  ax_cv_c_float_words_bigendian=yes
fi
if grep seesnoon conftest* >/dev/null ; then
  if test "$ax_cv_c_float_words_bigendian" = unknown; then
    ax_cv_c_float_words_bigendian=no
  else
    ax_cv_c_float_words_bigendian=unknown
  fi
fi


fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_float_words_bigendian" >&5
printf "%s\n" "$ax_cv_c_float_words_bigendian" >&6; }

case $ax_cv_c_float_words_bigendian in
  yes)

printf "%s\n" "#define DOUBLE_IS_BIG_ENDIAN_IEEE754 1" >>confdefs.h
 ;;
  no)

printf "%s\n" "#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1" >>confdefs.h
 ;;
  *)
    as_fn_error $? "Unknown float word ordering. You need to manually preset ax_cv_c_float_words_bigendian=no (or yes) according to your system." "$LINENO" 5 ;;
esac



# The short float repr introduced in Python 3.1 requires the
# correctly-rounded string <-> double conversion functions from
# Python/dtoa.c, which in turn require that the FPU uses 53-bit
# rounding; this is a problem on x86, where the x87 FPU has a default
# rounding precision of 64 bits.  For gcc/x86, we can fix this by
# using inline assembler to get and set the x87 FPU control word.

# This inline assembler syntax works for icx and may also work for
# suncc and icc, so we try it on all platforms.

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we can use gcc inline assembler to get and set x87 control word" >&5
printf %s "checking whether we can use gcc inline assembler to get and set x87 control word... " >&6; }
if test ${ac_cv_gcc_asm_for_x87+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  unsigned short cw;
  __asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
  __asm__ __volatile__ ("fldcw %0" : : "m" (cw));

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_gcc_asm_for_x87=yes
else case e in #(
  e) ac_cv_gcc_asm_for_x87=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_asm_for_x87" >&5
printf "%s\n" "$ac_cv_gcc_asm_for_x87" >&6; }
if test "x$ac_cv_gcc_asm_for_x87" = xyes
then :


printf "%s\n" "#define HAVE_GCC_ASM_FOR_X87 1" >>confdefs.h


fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we can use gcc inline assembler to get and set mc68881 fpcr" >&5
printf %s "checking whether we can use gcc inline assembler to get and set mc68881 fpcr... " >&6; }
if test ${ac_cv_gcc_asm_for_mc68881+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  unsigned int fpcr;
  __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm" (fpcr));
  __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm" (fpcr));

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_gcc_asm_for_mc68881=yes
else case e in #(
  e) ac_cv_gcc_asm_for_mc68881=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_asm_for_mc68881" >&5
printf "%s\n" "$ac_cv_gcc_asm_for_mc68881" >&6; }
if test "x$ac_cv_gcc_asm_for_mc68881" = xyes
then :


printf "%s\n" "#define HAVE_GCC_ASM_FOR_MC68881 1" >>confdefs.h


fi

# Detect whether system arithmetic is subject to x87-style double
# rounding issues.  The result of this test has little meaning on non
# IEEE 754 platforms.  On IEEE 754, test should return 1 if rounding
# mode is round-to-nearest and double rounding issues are present, and
# 0 otherwise.  See https://github.com/python/cpython/issues/47186 for more info.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for x87-style double rounding" >&5
printf %s "checking for x87-style double rounding... " >&6; }
if test ${ac_cv_x87_double_rounding+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
# $BASECFLAGS may affect the result
ac_save_cc="$CC"
CC="$CC $BASECFLAGS"
if test "$cross_compiling" = yes
then :
  ac_cv_x87_double_rounding=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <math.h>
int main(void) {
    volatile double x, y, z;
    /* 1./(1-2**-53) -> 1+2**-52 (correct), 1.0 (double rounding) */
    x = 0.99999999999999989; /* 1-2**-53 */
    y = 1./x;
    if (y != 1.)
        exit(0);
    /* 1e16+2.99999 -> 1e16+2. (correct), 1e16+4. (double rounding) */
    x = 1e16;
    y = 2.99999;
    z = x + y;
    if (z != 1e16+4.)
        exit(0);
    /* both tests show evidence of double rounding */
    exit(1);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_x87_double_rounding=no
else case e in #(
  e) ac_cv_x87_double_rounding=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

CC="$ac_save_cc"
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_x87_double_rounding" >&5
printf "%s\n" "$ac_cv_x87_double_rounding" >&6; }

if test "x$ac_cv_x87_double_rounding" = xyes
then :


printf "%s\n" "#define X87_DOUBLE_ROUNDING 1" >>confdefs.h


fi

# ************************************
# * Check for mathematical functions *
# ************************************

LIBS_SAVE=$LIBS
LIBS="$LIBS $LIBM"


  for ac_func in acosh asinh atanh erf erfc expm1 log1p log2
do :
  as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"
then :
  cat >>confdefs.h <<_ACEOF
#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1
_ACEOF

else case e in #(
  e) as_fn_error $? "Python requires C99 compatible libm" "$LINENO" 5
 ;;
esac
fi

done

ac_func=
for ac_item in $ac_func_c_list
do
  if test $ac_func; then
    ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func
    if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then
      echo "#define $ac_item 1" >> confdefs.h
    fi
    ac_func=
  else
    ac_func=$ac_item
  fi
done







LIBS=$LIBS_SAVE

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX semaphores are enabled" >&5
printf %s "checking whether POSIX semaphores are enabled... " >&6; }
if test ${ac_cv_posix_semaphores_enabled+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  ac_cv_posix_semaphores_enabled=yes
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


      #include <unistd.h>
      #include <fcntl.h>
      #include <stdio.h>
      #include <semaphore.h>
      #include <sys/stat.h>

      int main(void) {
        sem_t *a = sem_open("/autoconf", O_CREAT, S_IRUSR|S_IWUSR, 0);
        if (a == SEM_FAILED) {
          perror("sem_open");
          return 1;
        }
        sem_close(a);
        sem_unlink("/autoconf");
        return 0;
      }


_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_posix_semaphores_enabled=yes
else case e in #(
  e) ac_cv_posix_semaphores_enabled=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_posix_semaphores_enabled" >&5
printf "%s\n" "$ac_cv_posix_semaphores_enabled" >&6; }
if test "x$ac_cv_posix_semaphores_enabled" = xno
then :


printf "%s\n" "#define POSIX_SEMAPHORES_NOT_ENABLED 1" >>confdefs.h


fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for broken sem_getvalue" >&5
printf %s "checking for broken sem_getvalue... " >&6; }
if test ${ac_cv_broken_sem_getvalue+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  ac_cv_broken_sem_getvalue=yes
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


      #include <unistd.h>
      #include <fcntl.h>
      #include <stdio.h>
      #include <semaphore.h>
      #include <sys/stat.h>

      int main(void){
        sem_t *a = sem_open("/autocftw", O_CREAT, S_IRUSR|S_IWUSR, 0);
        int count;
        int res;
        if(a==SEM_FAILED){
          perror("sem_open");
          return 1;

        }
        res = sem_getvalue(a, &count);
        sem_close(a);
        sem_unlink("/autocftw");
        return res==-1 ? 1 : 0;
      }


_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_broken_sem_getvalue=no
else case e in #(
  e) ac_cv_broken_sem_getvalue=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_broken_sem_getvalue" >&5
printf "%s\n" "$ac_cv_broken_sem_getvalue" >&6; }
if test "x$ac_cv_broken_sem_getvalue" = xyes
then :


printf "%s\n" "#define HAVE_BROKEN_SEM_GETVALUE 1" >>confdefs.h


fi

ac_fn_check_decl "$LINENO" "RTLD_LAZY" "ac_cv_have_decl_RTLD_LAZY" "#include <dlfcn.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_RTLD_LAZY" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_RTLD_LAZY $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "RTLD_NOW" "ac_cv_have_decl_RTLD_NOW" "#include <dlfcn.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_RTLD_NOW" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_RTLD_NOW $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "RTLD_GLOBAL" "ac_cv_have_decl_RTLD_GLOBAL" "#include <dlfcn.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_RTLD_GLOBAL" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_RTLD_GLOBAL $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "RTLD_LOCAL" "ac_cv_have_decl_RTLD_LOCAL" "#include <dlfcn.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_RTLD_LOCAL" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_RTLD_LOCAL $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "RTLD_NODELETE" "ac_cv_have_decl_RTLD_NODELETE" "#include <dlfcn.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_RTLD_NODELETE" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_RTLD_NODELETE $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "RTLD_NOLOAD" "ac_cv_have_decl_RTLD_NOLOAD" "#include <dlfcn.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_RTLD_NOLOAD" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_RTLD_NOLOAD $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "RTLD_DEEPBIND" "ac_cv_have_decl_RTLD_DEEPBIND" "#include <dlfcn.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_RTLD_DEEPBIND" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_RTLD_DEEPBIND $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "RTLD_MEMBER" "ac_cv_have_decl_RTLD_MEMBER" "#include <dlfcn.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_RTLD_MEMBER" = xyes
then :
  ac_have_decl=1
else case e in #(
  e) ac_have_decl=0 ;;
esac
fi
printf "%s\n" "#define HAVE_DECL_RTLD_MEMBER $ac_have_decl" >>confdefs.h


# determine what size digit to use for Python's longs
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking digit size for Python's longs" >&5
printf %s "checking digit size for Python's longs... " >&6; }
# Check whether --enable-big-digits was given.
if test ${enable_big_digits+y}
then :
  enableval=$enable_big_digits; case $enable_big_digits in
yes)
  enable_big_digits=30 ;;
no)
  enable_big_digits=15 ;;
15|30)
  ;;
*)
  as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value should be 15 or 30" "$LINENO" 5 ;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_big_digits" >&5
printf "%s\n" "$enable_big_digits" >&6; }

printf "%s\n" "#define PYLONG_BITS_IN_DIGIT $enable_big_digits" >>confdefs.h


else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no value specified" >&5
printf "%s\n" "no value specified" >&6; } ;;
esac
fi


# check for wchar.h
ac_fn_c_check_header_compile "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default"
if test "x$ac_cv_header_wchar_h" = xyes
then :


printf "%s\n" "#define HAVE_WCHAR_H 1" >>confdefs.h

  wchar_h="yes"

else case e in #(
  e) wchar_h="no"
 ;;
esac
fi


# determine wchar_t size
if test "$wchar_h" = yes
then
  # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5
printf %s "checking size of wchar_t... " >&6; }
if test ${ac_cv_sizeof_wchar_t+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t"        "#include <wchar.h>
"
then :

else case e in #(
  e) if test "$ac_cv_type_wchar_t" = yes; then
     { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (wchar_t)
See 'config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_wchar_t=0
   fi ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_wchar_t" >&5
printf "%s\n" "$ac_cv_sizeof_wchar_t" >&6; }



printf "%s\n" "#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t" >>confdefs.h


fi

# check whether wchar_t is signed or not
if test "$wchar_h" = yes
then
  # check whether wchar_t is signed or not
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wchar_t is signed" >&5
printf %s "checking whether wchar_t is signed... " >&6; }
if test ${ac_cv_wchar_t_signed+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  if test "$cross_compiling" = yes
then :
  ac_cv_wchar_t_signed=yes
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  #include <wchar.h>
  int main()
  {
	/* Success: exit code 0 */
        return ((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1);
  }

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_wchar_t_signed=yes
else case e in #(
  e) ac_cv_wchar_t_signed=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_wchar_t_signed" >&5
printf "%s\n" "$ac_cv_wchar_t_signed" >&6; }
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wchar_t is usable" >&5
printf %s "checking whether wchar_t is usable... " >&6; }
# wchar_t is only usable if it maps to an unsigned type
if test "$ac_cv_sizeof_wchar_t" -ge 2 \
          -a "$ac_cv_wchar_t_signed" = "no"
then

printf "%s\n" "#define HAVE_USABLE_WCHAR_T 1" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

case $ac_sys_system/$ac_sys_release in
SunOS/*)
  if test -f /etc/os-release; then
    OS_NAME=$(awk -F= '/^NAME=/ {print substr($2,2,length($2)-2)}' /etc/os-release)
    if test "x$OS_NAME" = "xOracle Solaris"; then
      # bpo-43667: In Oracle Solaris, the internal form of wchar_t in
      # non-Unicode locales is not Unicode and hence cannot be used directly.
      # https://docs.oracle.com/cd/E37838_01/html/E61053/gmwke.html

printf "%s\n" "#define HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION 1" >>confdefs.h

    fi
  fi
  ;;
esac

# check for endianness
 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
printf %s "checking whether byte ordering is bigendian... " >&6; }
if test ${ac_cv_c_bigendian+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_cv_c_bigendian=unknown
    # See if we're dealing with a universal compiler.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __APPLE_CC__
	       not a universal capable compiler
	     #endif
	     typedef int dummy;

_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :

	# Check for potential -arch flags.  It is not universal unless
	# there are at least two -arch flags with different values.
	ac_arch=
	ac_prev=
	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
	 if test -n "$ac_prev"; then
	   case $ac_word in
	     i?86 | x86_64 | ppc | ppc64)
	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
		 ac_arch=$ac_word
	       else
		 ac_cv_c_bigendian=universal
		 break
	       fi
	       ;;
	   esac
	   ac_prev=
	 elif test "x$ac_word" = "x-arch"; then
	   ac_prev=arch
	 fi
       done
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    if test $ac_cv_c_bigendian = unknown; then
      # See if sys/param.h defines the BYTE_ORDER macro.
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
	     #include <sys/param.h>

int
main (void)
{
#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \\
		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \\
		     && LITTLE_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  # It does; now see whether it defined to BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
		#include <sys/param.h>

int
main (void)
{
#if BYTE_ORDER != BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_c_bigendian=yes
else case e in #(
  e) ac_cv_c_bigendian=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main (void)
{
#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  # It does; now see whether it defined to _BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main (void)
{
#ifndef _BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_c_bigendian=yes
else case e in #(
  e) ac_cv_c_bigendian=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # Compile a test program.
      if test "$cross_compiling" = yes
then :
  # Try to guess by grepping values from an object file.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
unsigned short int ascii_mm[] =
		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
		unsigned short int ascii_ii[] =
		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
		int use_ascii (int i) {
		  return ascii_mm[i] + ascii_ii[i];
		}
		unsigned short int ebcdic_ii[] =
		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
		unsigned short int ebcdic_mm[] =
		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
		int use_ebcdic (int i) {
		  return ebcdic_mm[i] + ebcdic_ii[i];
		}
		int
		main (int argc, char **argv)
		{
		  /* Intimidate the compiler so that it does not
		     optimize the arrays away.  */
		  char *p = argv[0];
		  ascii_mm[1] = *p++; ebcdic_mm[1] = *p++;
		  ascii_ii[1] = *p++; ebcdic_ii[1] = *p++;
		  return use_ascii (argc) == use_ebcdic (*p);
		}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  if grep BIGenDianSyS conftest$ac_exeext >/dev/null; then
	      ac_cv_c_bigendian=yes
	    fi
	    if grep LiTTleEnDian conftest$ac_exeext >/dev/null ; then
	      if test "$ac_cv_c_bigendian" = unknown; then
		ac_cv_c_bigendian=no
	      else
		# finding both strings is unlikely to happen, but who knows?
		ac_cv_c_bigendian=unknown
	      fi
	    fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main (void)
{

	     /* Are we little or big endian?  From Harbison&Steele.  */
	     union
	     {
	       long int l;
	       char c[sizeof (long int)];
	     } u;
	     u.l = 1;
	     return u.c[sizeof (long int) - 1] == 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_c_bigendian=no
else case e in #(
  e) ac_cv_c_bigendian=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

    fi ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
printf "%s\n" "$ac_cv_c_bigendian" >&6; }
 case $ac_cv_c_bigendian in #(
   yes)
     printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h
;; #(
   no)
      ;; #(
   universal)

printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h

     ;; #(
   *)
     as_fn_error $? "unknown endianness
 presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
 esac


# ABI version string for Python extension modules.  This appears between the
# periods in shared library file names, e.g. foo.<SOABI>.so.  It is calculated
# from the following attributes which affect the ABI of this Python build (in
# this order):
#
# * The Python implementation (always 'cpython-' for us)
# * The major and minor version numbers
# * --disable-gil (adds a 't')
# * --with-pydebug (adds a 'd')
#
# Thus for example, Python 3.2 built with wide unicode, pydebug, and pymalloc,
# would get a shared library ABI version tag of 'cpython-32dmu' and shared
# libraries would be named 'foo.cpython-32dmu.so'.
#
# In Python 3.2 and older, --with-wide-unicode added a 'u' flag.
# In Python 3.7 and older, --with-pymalloc added a 'm' flag.

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking ABIFLAGS" >&5
printf %s "checking ABIFLAGS... " >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ABIFLAGS" >&5
printf "%s\n" "$ABIFLAGS" >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking SOABI" >&5
printf %s "checking SOABI... " >&6; }
SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${SOABI_PLATFORM:+-$SOABI_PLATFORM}
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SOABI" >&5
printf "%s\n" "$SOABI" >&6; }

# Release build, debug build (Py_DEBUG), and trace refs build (Py_TRACE_REFS)
# are ABI compatible
if test "$Py_DEBUG" = 'true'; then
  # Similar to SOABI but remove "d" flag from ABIFLAGS

  ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${SOABI_PLATFORM:+-$SOABI_PLATFORM}

printf "%s\n" "#define ALT_SOABI \"${ALT_SOABI}\"" >>confdefs.h

fi


EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX}

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking LDVERSION" >&5
printf %s "checking LDVERSION... " >&6; }
LDVERSION='$(VERSION)$(ABIFLAGS)'
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LDVERSION" >&5
printf "%s\n" "$LDVERSION" >&6; }

# Configure the flags and dependencies used when compiling shared modules.


MODULE_DEPS_SHARED='$(MODULE_DEPS_STATIC) $(EXPORTSYMS)'

# On most platforms, extension modules aren't linked against libpython, so
# LIBPYTHON must be empty.
LIBPYTHON=''

# On Android and Cygwin the shared libraries must be linked with libpython.
# LIBPYTHON is used by python-config, python3.pc, the commands for building the
# stdlib's own extension modules, and external package build systems via
# sysconfig, so its value must be suitable for all those contexts.
if test "$PY_ENABLE_SHARED" = "1" && ( test -n "$ANDROID_API_LEVEL" || test "$MACHDEP" = "cygwin"); then
  MODULE_DEPS_SHARED="$MODULE_DEPS_SHARED \$(LDLIBRARY)"
  LIBPYTHON="-lpython${VERSION}${ABIFLAGS}"
fi

# On iOS the shared libraries must be linked with the framework, when built
if test "$ac_sys_system" = "iOS" && test "$enable_framework"; then
  MODULE_DEPS_SHARED="$MODULE_DEPS_SHARED \$(PYTHONFRAMEWORKDIR)/\$(PYTHONFRAMEWORK)"
fi

# Check for --with-platlibdir
# /usr/$PLATLIBDIR/python$(VERSION)$(ABI_THREAD)

PLATLIBDIR="lib"  # XXX: We should probably calculate the defauly from libdir, if defined.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-platlibdir" >&5
printf %s "checking for --with-platlibdir... " >&6; }

# Check whether --with-platlibdir was given.
if test ${with_platlibdir+y}
then :
  withval=$with_platlibdir;
# ignore 3 options:
#   --with-platlibdir
#   --with-platlibdir=
#   --without-platlibdir
if test -n "$withval" -a "$withval" != yes -a "$withval" != no
then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
  PLATLIBDIR="$withval"
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi




LIBDEST='${prefix}/${PLATLIBDIR}/python$(VERSION)$(ABI_THREAD)'
BINLIBDEST='${exec_prefix}/${PLATLIBDIR}/python$(VERSION)$(ABI_THREAD)'


if test x$PLATFORM_TRIPLET = x; then
  LIBPL='$(LIBDEST)'"/config-${LDVERSION}"
else
  LIBPL='$(LIBDEST)'"/config-${LDVERSION}-${PLATFORM_TRIPLET}"
fi


# Check for --with-wheel-pkg-dir=PATH

WHEEL_PKG_DIR=""
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-wheel-pkg-dir" >&5
printf %s "checking for --with-wheel-pkg-dir... " >&6; }

# Check whether --with-wheel-pkg-dir was given.
if test ${with_wheel_pkg_dir+y}
then :
  withval=$with_wheel_pkg_dir;
if test -n "$withval"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
  WHEEL_PKG_DIR="$withval"
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi
else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; } ;;
esac
fi


# Check whether right shifting a negative integer extends the sign bit
# or fills with zeros (like the Cray J90, according to Tim Peters).
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether right shift extends the sign bit" >&5
printf %s "checking whether right shift extends the sign bit... " >&6; }
if test ${ac_cv_rshift_extends_sign+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
if test "$cross_compiling" = yes
then :
  ac_cv_rshift_extends_sign=yes
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int main(void)
{
	return (((-1)>>3 == -1) ? 0 : 1);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_rshift_extends_sign=yes
else case e in #(
  e) ac_cv_rshift_extends_sign=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_rshift_extends_sign" >&5
printf "%s\n" "$ac_cv_rshift_extends_sign" >&6; }
if test "$ac_cv_rshift_extends_sign" = no
then

printf "%s\n" "#define SIGNED_RIGHT_SHIFT_ZERO_FILLS 1" >>confdefs.h

fi

# check for getc_unlocked and related locking functions
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getc_unlocked() and friends" >&5
printf %s "checking for getc_unlocked() and friends... " >&6; }
if test ${ac_cv_have_getc_unlocked+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
int
main (void)
{

	FILE *f = fopen("/dev/null", "r");
	flockfile(f);
	getc_unlocked(f);
	funlockfile(f);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_have_getc_unlocked=yes
else case e in #(
  e) ac_cv_have_getc_unlocked=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_getc_unlocked" >&5
printf "%s\n" "$ac_cv_have_getc_unlocked" >&6; }
if test "$ac_cv_have_getc_unlocked" = yes
then

printf "%s\n" "#define HAVE_GETC_UNLOCKED 1" >>confdefs.h

fi





# Check whether --with-readline was given.
if test ${with_readline+y}
then :
  withval=$with_readline;
    case $with_readline in #(
  editline|edit) :
    with_readline=edit ;; #(
  yes|readline) :
    with_readline=readline ;; #(
  no) :
     ;; #(
  *) :
    as_fn_error $? "proper usage is --with(out)-readline[=editline|readline|no]" "$LINENO" 5
     ;;
esac

else case e in #(
  e) with_readline=readline
 ;;
esac
fi


if test "x$with_readline" = xreadline
then :


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline" >&5
printf %s "checking for readline... " >&6; }

if test -n "$LIBREADLINE_CFLAGS"; then
    pkg_cv_LIBREADLINE_CFLAGS="$LIBREADLINE_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"readline\""; } >&5
  ($PKG_CONFIG --exists --print-errors "readline") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBREADLINE_CFLAGS=`$PKG_CONFIG --cflags "readline" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$LIBREADLINE_LIBS"; then
    pkg_cv_LIBREADLINE_LIBS="$LIBREADLINE_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"readline\""; } >&5
  ($PKG_CONFIG --exists --print-errors "readline") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBREADLINE_LIBS=`$PKG_CONFIG --libs "readline" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                LIBREADLINE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "readline" 2>&1`
        else
                LIBREADLINE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "readline" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBREADLINE_PKG_ERRORS" >&5


    save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


      CPPFLAGS="$CPPFLAGS $LIBREADLINE_CFLAGS"
      LIBS="$LIBS $LIBREADLINE_LIBS"
             for ac_header in readline/readline.h
do :
  ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default"
if test "x$ac_cv_header_readline_readline_h" = xyes
then :
  printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5
printf %s "checking for readline in -lreadline... " >&6; }
if test ${ac_cv_lib_readline_readline+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lreadline  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char readline (void);
int
main (void)
{
return readline ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_readline_readline=yes
else case e in #(
  e) ac_cv_lib_readline_readline=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5
printf "%s\n" "$ac_cv_lib_readline_readline" >&6; }
if test "x$ac_cv_lib_readline_readline" = xyes
then :

          LIBREADLINE=readline
          READLINE_CFLAGS=${LIBREADLINE_CFLAGS-""}
          READLINE_LIBS=${LIBREADLINE_LIBS-"-lreadline"}

else case e in #(
  e) with_readline=no ;;
esac
fi


else case e in #(
  e) with_readline=no ;;
esac
fi

done

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

    save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


      CPPFLAGS="$CPPFLAGS $LIBREADLINE_CFLAGS"
      LIBS="$LIBS $LIBREADLINE_LIBS"
             for ac_header in readline/readline.h
do :
  ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default"
if test "x$ac_cv_header_readline_readline_h" = xyes
then :
  printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5
printf %s "checking for readline in -lreadline... " >&6; }
if test ${ac_cv_lib_readline_readline+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lreadline  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char readline (void);
int
main (void)
{
return readline ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_readline_readline=yes
else case e in #(
  e) ac_cv_lib_readline_readline=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5
printf "%s\n" "$ac_cv_lib_readline_readline" >&6; }
if test "x$ac_cv_lib_readline_readline" = xyes
then :

          LIBREADLINE=readline
          READLINE_CFLAGS=${LIBREADLINE_CFLAGS-""}
          READLINE_LIBS=${LIBREADLINE_LIBS-"-lreadline"}

else case e in #(
  e) with_readline=no ;;
esac
fi


else case e in #(
  e) with_readline=no ;;
esac
fi

done

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



else
        LIBREADLINE_CFLAGS=$pkg_cv_LIBREADLINE_CFLAGS
        LIBREADLINE_LIBS=$pkg_cv_LIBREADLINE_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

    LIBREADLINE=readline
    READLINE_CFLAGS=$LIBREADLINE_CFLAGS
    READLINE_LIBS=$LIBREADLINE_LIBS

fi

fi

if test "x$with_readline" = xedit
then :


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libedit" >&5
printf %s "checking for libedit... " >&6; }

if test -n "$LIBEDIT_CFLAGS"; then
    pkg_cv_LIBEDIT_CFLAGS="$LIBEDIT_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libedit\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libedit") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBEDIT_CFLAGS=`$PKG_CONFIG --cflags "libedit" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$LIBEDIT_LIBS"; then
    pkg_cv_LIBEDIT_LIBS="$LIBEDIT_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libedit\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libedit") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBEDIT_LIBS=`$PKG_CONFIG --libs "libedit" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                LIBEDIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libedit" 2>&1`
        else
                LIBEDIT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libedit" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBEDIT_PKG_ERRORS" >&5


    save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


      CPPFLAGS="$CPPFLAGS $LIBEDIT_CFLAGS"
      LIBS="$LIBS $LIBEDIT_LIBS"
             for ac_header in editline/readline.h
do :
  ac_fn_c_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default"
if test "x$ac_cv_header_editline_readline_h" = xyes
then :
  printf "%s\n" "#define HAVE_EDITLINE_READLINE_H 1" >>confdefs.h

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5
printf %s "checking for readline in -ledit... " >&6; }
if test ${ac_cv_lib_edit_readline+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ledit  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char readline (void);
int
main (void)
{
return readline ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_edit_readline=yes
else case e in #(
  e) ac_cv_lib_edit_readline=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline" >&5
printf "%s\n" "$ac_cv_lib_edit_readline" >&6; }
if test "x$ac_cv_lib_edit_readline" = xyes
then :

          LIBREADLINE=edit
          printf "%s\n" "#define WITH_EDITLINE 1" >>confdefs.h

          READLINE_CFLAGS=${LIBEDIT_CFLAGS-""}
          READLINE_LIBS=${LIBEDIT_LIBS-"-ledit"}

else case e in #(
  e) with_readline=no ;;
esac
fi


else case e in #(
  e) with_readline=no ;;
esac
fi

done

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

    save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


      CPPFLAGS="$CPPFLAGS $LIBEDIT_CFLAGS"
      LIBS="$LIBS $LIBEDIT_LIBS"
             for ac_header in editline/readline.h
do :
  ac_fn_c_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default"
if test "x$ac_cv_header_editline_readline_h" = xyes
then :
  printf "%s\n" "#define HAVE_EDITLINE_READLINE_H 1" >>confdefs.h

        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5
printf %s "checking for readline in -ledit... " >&6; }
if test ${ac_cv_lib_edit_readline+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ledit  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char readline (void);
int
main (void)
{
return readline ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_lib_edit_readline=yes
else case e in #(
  e) ac_cv_lib_edit_readline=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline" >&5
printf "%s\n" "$ac_cv_lib_edit_readline" >&6; }
if test "x$ac_cv_lib_edit_readline" = xyes
then :

          LIBREADLINE=edit
          printf "%s\n" "#define WITH_EDITLINE 1" >>confdefs.h

          READLINE_CFLAGS=${LIBEDIT_CFLAGS-""}
          READLINE_LIBS=${LIBEDIT_LIBS-"-ledit"}

else case e in #(
  e) with_readline=no ;;
esac
fi


else case e in #(
  e) with_readline=no ;;
esac
fi

done

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



else
        LIBEDIT_CFLAGS=$pkg_cv_LIBEDIT_CFLAGS
        LIBEDIT_LIBS=$pkg_cv_LIBEDIT_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

    printf "%s\n" "#define WITH_EDITLINE 1" >>confdefs.h

    LIBREADLINE=edit
    READLINE_CFLAGS=$LIBEDIT_CFLAGS
    READLINE_LIBS=$LIBEDIT_LIBS

fi

fi

READLINE_CFLAGS=$(echo $READLINE_CFLAGS | sed 's/-D_XOPEN_SOURCE=600//g')

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link readline" >&5
printf %s "checking how to link readline... " >&6; }
if test "x$with_readline" = xno
then :

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

else case e in #(
  e)
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_readline (CFLAGS: $READLINE_CFLAGS, LIBS: $READLINE_LIBS)" >&5
printf "%s\n" "$with_readline (CFLAGS: $READLINE_CFLAGS, LIBS: $READLINE_LIBS)" >&6; }

  save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


    CPPFLAGS="$CPPFLAGS $READLINE_CFLAGS"
    LIBS="$LIBS $READLINE_LIBS"
    LIBS_SAVE=$LIBS



    # check for readline 2.2
    ac_fn_check_decl "$LINENO" "rl_completion_append_character" "ac_cv_have_decl_rl_completion_append_character" "
      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_rl_completion_append_character" = xyes
then :


printf "%s\n" "#define HAVE_RL_COMPLETION_APPEND_CHARACTER 1" >>confdefs.h


fi

    ac_fn_check_decl "$LINENO" "rl_completion_suppress_append" "ac_cv_have_decl_rl_completion_suppress_append" "
      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_rl_completion_suppress_append" = xyes
then :


printf "%s\n" "#define HAVE_RL_COMPLETION_SUPPRESS_APPEND 1" >>confdefs.h


fi

    # check for readline 4.0
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in -l$LIBREADLINE" >&5
printf %s "checking for rl_pre_input_hook in -l$LIBREADLINE... " >&6; }
if test ${ac_cv_readline_rl_pre_input_hook+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

int
main (void)
{
void *x = rl_pre_input_hook
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_readline_rl_pre_input_hook=yes
else case e in #(
  e) ac_cv_readline_rl_pre_input_hook=no
       ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_rl_pre_input_hook" >&5
printf "%s\n" "$ac_cv_readline_rl_pre_input_hook" >&6; }
    if test "x$ac_cv_readline_rl_pre_input_hook" = xyes
then :


printf "%s\n" "#define HAVE_RL_PRE_INPUT_HOOK 1" >>confdefs.h


fi

    # also in 4.0
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rl_completion_display_matches_hook in -l$LIBREADLINE" >&5
printf %s "checking for rl_completion_display_matches_hook in -l$LIBREADLINE... " >&6; }
if test ${ac_cv_readline_rl_completion_display_matches_hook+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

int
main (void)
{
void *x = rl_completion_display_matches_hook
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_readline_rl_completion_display_matches_hook=yes
else case e in #(
  e) ac_cv_readline_rl_completion_display_matches_hook=no
       ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_rl_completion_display_matches_hook" >&5
printf "%s\n" "$ac_cv_readline_rl_completion_display_matches_hook" >&6; }
    if test "x$ac_cv_readline_rl_completion_display_matches_hook" = xyes
then :


printf "%s\n" "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1" >>confdefs.h


fi

    # also in 4.0, but not in editline
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rl_resize_terminal in -l$LIBREADLINE" >&5
printf %s "checking for rl_resize_terminal in -l$LIBREADLINE... " >&6; }
if test ${ac_cv_readline_rl_resize_terminal+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

int
main (void)
{
void *x = rl_resize_terminal
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_readline_rl_resize_terminal=yes
else case e in #(
  e) ac_cv_readline_rl_resize_terminal=no
       ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_rl_resize_terminal" >&5
printf "%s\n" "$ac_cv_readline_rl_resize_terminal" >&6; }
    if test "x$ac_cv_readline_rl_resize_terminal" = xyes
then :


printf "%s\n" "#define HAVE_RL_RESIZE_TERMINAL 1" >>confdefs.h


fi

    # rl_change_environment is in readline 6.3, but not in editline
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rl_change_environment in -l$LIBREADLINE" >&5
printf %s "checking for rl_change_environment in -l$LIBREADLINE... " >&6; }
if test ${ac_cv_readline_rl_change_environment+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

int
main (void)
{
int x = rl_change_environment
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_readline_rl_change_environment=yes
else case e in #(
  e) ac_cv_readline_rl_change_environment=no
       ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_rl_change_environment" >&5
printf "%s\n" "$ac_cv_readline_rl_change_environment" >&6; }
    if test "x$ac_cv_readline_rl_change_environment" = xyes
then :


printf "%s\n" "#define HAVE_RL_CHANGE_ENVIRONMENT 1" >>confdefs.h


fi

    # check for readline 4.2
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -l$LIBREADLINE" >&5
printf %s "checking for rl_completion_matches in -l$LIBREADLINE... " >&6; }
if test ${ac_cv_readline_rl_completion_matches+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

int
main (void)
{
void *x = rl_completion_matches
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_readline_rl_completion_matches=yes
else case e in #(
  e) ac_cv_readline_rl_completion_matches=no
       ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_rl_completion_matches" >&5
printf "%s\n" "$ac_cv_readline_rl_completion_matches" >&6; }
    if test "x$ac_cv_readline_rl_completion_matches" = xyes
then :


printf "%s\n" "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h


fi

    # also in readline 4.2
    ac_fn_check_decl "$LINENO" "rl_catch_signals" "ac_cv_have_decl_rl_catch_signals" "
      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_rl_catch_signals" = xyes
then :


printf "%s\n" "#define HAVE_RL_CATCH_SIGNAL 1" >>confdefs.h


fi

    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for append_history in -l$LIBREADLINE" >&5
printf %s "checking for append_history in -l$LIBREADLINE... " >&6; }
if test ${ac_cv_readline_append_history+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

int
main (void)
{
void *x = append_history
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_readline_append_history=yes
else case e in #(
  e) ac_cv_readline_append_history=no
       ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_append_history" >&5
printf "%s\n" "$ac_cv_readline_append_history" >&6; }
    if test "x$ac_cv_readline_append_history" = xyes
then :


printf "%s\n" "#define HAVE_RL_APPEND_HISTORY 1" >>confdefs.h


fi

    # in readline as well as newer editline (April 2023)
    ac_fn_c_check_type "$LINENO" "rl_compdisp_func_t" "ac_cv_type_rl_compdisp_func_t" "
      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

"
if test "x$ac_cv_type_rl_compdisp_func_t" = xyes
then :

printf "%s\n" "#define HAVE_RL_COMPDISP_FUNC_T 1" >>confdefs.h


fi


    # Some editline versions declare rl_startup_hook as taking no args, others
    # declare it as taking 2.
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if rl_startup_hook takes arguments" >&5
printf %s "checking if rl_startup_hook takes arguments... " >&6; }
if test ${ac_cv_readline_rl_startup_hook_takes_args+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <stdio.h> /* Must be first for Gnu Readline */
      #ifdef WITH_EDITLINE
      # include <editline/readline.h>
      #else
      # include <readline/readline.h>
      # include <readline/history.h>
      #endif

                extern int test_hook_func(const char *text, int state);
int
main (void)
{
rl_startup_hook=test_hook_func;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_readline_rl_startup_hook_takes_args=yes
else case e in #(
  e) ac_cv_readline_rl_startup_hook_takes_args=no
         ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
     ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_rl_startup_hook_takes_args" >&5
printf "%s\n" "$ac_cv_readline_rl_startup_hook_takes_args" >&6; }
    if test "x$ac_cv_readline_rl_startup_hook_takes_args" = xyes
then :


printf "%s\n" "#define Py_RL_STARTUP_HOOK_TAKES_ARGS 1" >>confdefs.h


fi



CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS

 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for broken nice()" >&5
printf %s "checking for broken nice()... " >&6; }
if test ${ac_cv_broken_nice+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
if test "$cross_compiling" = yes
then :
  ac_cv_broken_nice=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <unistd.h>
int main(void)
{
	int val1 = nice(1);
	if (val1 != -1 && val1 == nice(2))
		exit(0);
	exit(1);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_broken_nice=yes
else case e in #(
  e) ac_cv_broken_nice=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_broken_nice" >&5
printf "%s\n" "$ac_cv_broken_nice" >&6; }
if test "$ac_cv_broken_nice" = yes
then

printf "%s\n" "#define HAVE_BROKEN_NICE 1" >>confdefs.h

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for broken poll()" >&5
printf %s "checking for broken poll()... " >&6; }
if test ${ac_cv_broken_poll+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  ac_cv_broken_poll=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <poll.h>
#include <unistd.h>

int main(void)
{
    struct pollfd poll_struct = { 42, POLLIN|POLLPRI|POLLOUT, 0 };
    int poll_test;

    close (42);

    poll_test = poll(&poll_struct, 1, 0);
    if (poll_test < 0)
        return 0;
    else if (poll_test == 0 && poll_struct.revents != POLLNVAL)
        return 0;
    else
        return 1;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_broken_poll=yes
else case e in #(
  e) ac_cv_broken_poll=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_broken_poll" >&5
printf "%s\n" "$ac_cv_broken_poll" >&6; }
if test "$ac_cv_broken_poll" = yes
then

printf "%s\n" "#define HAVE_BROKEN_POLL 1" >>confdefs.h

fi

# check tzset(3) exists and works like we expect it to
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working tzset()" >&5
printf %s "checking for working tzset()... " >&6; }
if test ${ac_cv_working_tzset+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
if test "$cross_compiling" = yes
then :
  ac_cv_working_tzset=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <time.h>
#include <string.h>

#if HAVE_TZNAME
extern char *tzname[];
#endif

int main(void)
{
	/* Note that we need to ensure that not only does tzset(3)
	   do 'something' with localtime, but it works as documented
	   in the library reference and as expected by the test suite.
	   This includes making sure that tzname is set properly if
	   tm->tm_zone does not exist since it is the alternative way
	   of getting timezone info.

	   Red Hat 6.2 doesn't understand the southern hemisphere
	   after New Year's Day.
	*/

	time_t groundhogday = 1044144000; /* GMT-based */
	time_t midyear = groundhogday + (365 * 24 * 3600 / 2);

	putenv("TZ=UTC+0");
	tzset();
	if (localtime(&groundhogday)->tm_hour != 0)
	    exit(1);
#if HAVE_TZNAME
	/* For UTC, tzname[1] is sometimes "", sometimes "   " */
	if (strcmp(tzname[0], "UTC") ||
		(tzname[1][0] != 0 && tzname[1][0] != ' '))
	    exit(1);
#endif

	putenv("TZ=EST+5EDT,M4.1.0,M10.5.0");
	tzset();
	if (localtime(&groundhogday)->tm_hour != 19)
	    exit(1);
#if HAVE_TZNAME
	if (strcmp(tzname[0], "EST") || strcmp(tzname[1], "EDT"))
	    exit(1);
#endif

	putenv("TZ=AEST-10AEDT-11,M10.5.0,M3.5.0");
	tzset();
	if (localtime(&groundhogday)->tm_hour != 11)
	    exit(1);
#if HAVE_TZNAME
	if (strcmp(tzname[0], "AEST") || strcmp(tzname[1], "AEDT"))
	    exit(1);
#endif

#if HAVE_STRUCT_TM_TM_ZONE
	if (strcmp(localtime(&groundhogday)->tm_zone, "AEDT"))
	    exit(1);
	if (strcmp(localtime(&midyear)->tm_zone, "AEST"))
	    exit(1);
#endif

	exit(0);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_working_tzset=yes
else case e in #(
  e) ac_cv_working_tzset=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_tzset" >&5
printf "%s\n" "$ac_cv_working_tzset" >&6; }
if test "$ac_cv_working_tzset" = yes
then

printf "%s\n" "#define HAVE_WORKING_TZSET 1" >>confdefs.h

fi

# Look for subsecond timestamps in struct stat
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tv_nsec in struct stat" >&5
printf %s "checking for tv_nsec in struct stat... " >&6; }
if test ${ac_cv_stat_tv_nsec+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main (void)
{

struct stat st;
st.st_mtim.tv_nsec = 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_stat_tv_nsec=yes
else case e in #(
  e) ac_cv_stat_tv_nsec=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_stat_tv_nsec" >&5
printf "%s\n" "$ac_cv_stat_tv_nsec" >&6; }
if test "$ac_cv_stat_tv_nsec" = yes
then

printf "%s\n" "#define HAVE_STAT_TV_NSEC 1" >>confdefs.h

fi

# Look for BSD style subsecond timestamps in struct stat
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tv_nsec2 in struct stat" >&5
printf %s "checking for tv_nsec2 in struct stat... " >&6; }
if test ${ac_cv_stat_tv_nsec2+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main (void)
{

struct stat st;
st.st_mtimespec.tv_nsec = 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_stat_tv_nsec2=yes
else case e in #(
  e) ac_cv_stat_tv_nsec2=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_stat_tv_nsec2" >&5
printf "%s\n" "$ac_cv_stat_tv_nsec2" >&6; }
if test "$ac_cv_stat_tv_nsec2" = yes
then

printf "%s\n" "#define HAVE_STAT_TV_NSEC2 1" >>confdefs.h

fi

have_curses=no
have_panel=no

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-curses" >&5
printf %s "checking for --with-curses... " >&6; }

# Check whether --with-curses was given.
if test ${with_curses+y}
then :
  withval=$with_curses; case $with_curses in #(
  yes|auto) :
    with_curses=auto ;; #(
  ncursesw|ncurses|curses|no) :
     ;; #(
  *) :
    as_fn_error $? "proper usage is --with(out)-curses[=ncursesw|ncurses|curses|no]" "$LINENO" 5 ;;
esac
else case e in #(
  e) with_curses=auto ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_curses" >&5
printf "%s\n" "$with_curses" >&6; }



# Detect the selected backend.  ncursesw/ncurses are found via pkg-config;
# native curses has no .pc file and is left to the header/link probes below.
# curses_libs/panel_libs drive the AC_SEARCH_LIBS fallback; for "no" they are
# empty so nothing links and have_curses stays "no".
case $with_curses in #(
  ncursesw) :



pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ncursesw" >&5
printf %s "checking for ncursesw... " >&6; }

if test -n "$CURSES_CFLAGS"; then
    pkg_cv_CURSES_CFLAGS="$CURSES_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncursesw\""; } >&5
  ($PKG_CONFIG --exists --print-errors "ncursesw") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURSES_CFLAGS=`$PKG_CONFIG --cflags "ncursesw" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$CURSES_LIBS"; then
    pkg_cv_CURSES_LIBS="$CURSES_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncursesw\""; } >&5
  ($PKG_CONFIG --exists --print-errors "ncursesw") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURSES_LIBS=`$PKG_CONFIG --libs "ncursesw" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                CURSES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ncursesw" 2>&1`
        else
                CURSES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ncursesw" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$CURSES_PKG_ERRORS" >&5

        have_curses=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_curses=no
else
        CURSES_CFLAGS=$pkg_cv_CURSES_CFLAGS
        CURSES_LIBS=$pkg_cv_CURSES_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define HAVE_NCURSESW 1" >>confdefs.h

   have_curses=yes

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for panelw" >&5
printf %s "checking for panelw... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"panelw\""; } >&5
  ($PKG_CONFIG --exists --print-errors "panelw") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "panelw" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"panelw\""; } >&5
  ($PKG_CONFIG --exists --print-errors "panelw") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "panelw" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "panelw" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "panelw" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnupanel" >&5
printf %s "checking for gnupanel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnupanel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnupanel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5

        have_panel=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_panel=no
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_panel=yes
fi
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnupanel" >&5
printf %s "checking for gnupanel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnupanel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnupanel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5

        have_panel=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_panel=no
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_panel=yes
fi
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define HAVE_PANELW 1" >>confdefs.h

     have_panel=yes
fi
fi


               curses_libs="ncursesw"; panel_libs="panelw gnupanel" ;; #(
  ncurses) :



pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ncurses" >&5
printf %s "checking for ncurses... " >&6; }

if test -n "$CURSES_CFLAGS"; then
    pkg_cv_CURSES_CFLAGS="$CURSES_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncurses\""; } >&5
  ($PKG_CONFIG --exists --print-errors "ncurses") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURSES_CFLAGS=`$PKG_CONFIG --cflags "ncurses" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$CURSES_LIBS"; then
    pkg_cv_CURSES_LIBS="$CURSES_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncurses\""; } >&5
  ($PKG_CONFIG --exists --print-errors "ncurses") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURSES_LIBS=`$PKG_CONFIG --libs "ncurses" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                CURSES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ncurses" 2>&1`
        else
                CURSES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ncurses" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$CURSES_PKG_ERRORS" >&5

        have_curses=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_curses=no
else
        CURSES_CFLAGS=$pkg_cv_CURSES_CFLAGS
        CURSES_LIBS=$pkg_cv_CURSES_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define HAVE_NCURSES 1" >>confdefs.h

   have_curses=yes

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for panel" >&5
printf %s "checking for panel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"panel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "panel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "panel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"panel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "panel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "panel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "panel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "panel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnupanel" >&5
printf %s "checking for gnupanel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnupanel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnupanel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5

        have_panel=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_panel=no
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_panel=yes
fi
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnupanel" >&5
printf %s "checking for gnupanel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnupanel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnupanel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5

        have_panel=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_panel=no
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_panel=yes
fi
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define HAVE_PANEL 1" >>confdefs.h

     have_panel=yes
fi
fi


               curses_libs="ncurses"; panel_libs="panel gnupanel" ;; #(
  curses) :
    curses_libs="curses"; panel_libs="panel" ;; #(
  no) :
    curses_libs=""; panel_libs="" ;; #(
  *) :



pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ncursesw" >&5
printf %s "checking for ncursesw... " >&6; }

if test -n "$CURSES_CFLAGS"; then
    pkg_cv_CURSES_CFLAGS="$CURSES_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncursesw\""; } >&5
  ($PKG_CONFIG --exists --print-errors "ncursesw") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURSES_CFLAGS=`$PKG_CONFIG --cflags "ncursesw" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$CURSES_LIBS"; then
    pkg_cv_CURSES_LIBS="$CURSES_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncursesw\""; } >&5
  ($PKG_CONFIG --exists --print-errors "ncursesw") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURSES_LIBS=`$PKG_CONFIG --libs "ncursesw" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                CURSES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ncursesw" 2>&1`
        else
                CURSES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ncursesw" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$CURSES_PKG_ERRORS" >&5

        have_curses=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_curses=no
else
        CURSES_CFLAGS=$pkg_cv_CURSES_CFLAGS
        CURSES_LIBS=$pkg_cv_CURSES_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define HAVE_NCURSESW 1" >>confdefs.h

   have_curses=yes

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for panelw" >&5
printf %s "checking for panelw... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"panelw\""; } >&5
  ($PKG_CONFIG --exists --print-errors "panelw") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "panelw" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"panelw\""; } >&5
  ($PKG_CONFIG --exists --print-errors "panelw") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "panelw" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "panelw" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "panelw" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnupanel" >&5
printf %s "checking for gnupanel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnupanel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnupanel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5

        have_panel=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_panel=no
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_panel=yes
fi
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnupanel" >&5
printf %s "checking for gnupanel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnupanel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnupanel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5

        have_panel=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_panel=no
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_panel=yes
fi
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define HAVE_PANELW 1" >>confdefs.h

     have_panel=yes
fi
fi


   if test "x$have_curses" = xno
then :



pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ncurses" >&5
printf %s "checking for ncurses... " >&6; }

if test -n "$CURSES_CFLAGS"; then
    pkg_cv_CURSES_CFLAGS="$CURSES_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncurses\""; } >&5
  ($PKG_CONFIG --exists --print-errors "ncurses") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURSES_CFLAGS=`$PKG_CONFIG --cflags "ncurses" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$CURSES_LIBS"; then
    pkg_cv_CURSES_LIBS="$CURSES_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncurses\""; } >&5
  ($PKG_CONFIG --exists --print-errors "ncurses") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURSES_LIBS=`$PKG_CONFIG --libs "ncurses" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                CURSES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ncurses" 2>&1`
        else
                CURSES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ncurses" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$CURSES_PKG_ERRORS" >&5

        have_curses=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_curses=no
else
        CURSES_CFLAGS=$pkg_cv_CURSES_CFLAGS
        CURSES_LIBS=$pkg_cv_CURSES_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define HAVE_NCURSES 1" >>confdefs.h

   have_curses=yes

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for panel" >&5
printf %s "checking for panel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"panel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "panel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "panel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"panel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "panel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "panel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "panel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "panel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5


pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnupanel" >&5
printf %s "checking for gnupanel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnupanel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnupanel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5

        have_panel=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_panel=no
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_panel=yes
fi
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

pkg_failed=no
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnupanel" >&5
printf %s "checking for gnupanel... " >&6; }

if test -n "$PANEL_CFLAGS"; then
    pkg_cv_PANEL_CFLAGS="$PANEL_CFLAGS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_CFLAGS=`$PKG_CONFIG --cflags "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
if test -n "$PANEL_LIBS"; then
    pkg_cv_PANEL_LIBS="$PANEL_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnupanel\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnupanel") 2>&5
  ac_status=$?
  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PANEL_LIBS=`$PKG_CONFIG --libs "gnupanel" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi



if test $pkg_failed = yes; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
                PANEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnupanel" 2>&1`
        else
                PANEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnupanel" 2>&1`
        fi
        # Put the nasty error message in config.log where it belongs
        echo "$PANEL_PKG_ERRORS" >&5

        have_panel=no
elif test $pkg_failed = untried; then
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
        have_panel=no
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
        have_panel=yes
fi
else
        PANEL_CFLAGS=$pkg_cv_PANEL_CFLAGS
        PANEL_LIBS=$pkg_cv_PANEL_LIBS
        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }

printf "%s\n" "#define HAVE_PANEL 1" >>confdefs.h

     have_panel=yes
fi
fi


fi
   curses_libs="ncursesw ncurses"; panel_libs="panelw panel gnupanel" ;;
esac

save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  # Make sure we've got the header defines.  For the native "curses" backend,
  # probe only the plain headers: a system may also have ncurses headers (e.g.
  # ncurses/curses.h), and picking those while linking the native library mixes
  # incompatible declarations (e.g. tparm()) with the native <term.h>.
  as_fn_append CPPFLAGS " $CURSES_CFLAGS $PANEL_CFLAGS"
  if test "x$with_curses" = xcurses
then :
  ac_fn_c_check_header_compile "$LINENO" "curses.h" "ac_cv_header_curses_h" "$ac_includes_default"
if test "x$ac_cv_header_curses_h" = xyes
then :
  printf "%s\n" "#define HAVE_CURSES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "panel.h" "ac_cv_header_panel_h" "$ac_includes_default"
if test "x$ac_cv_header_panel_h" = xyes
then :
  printf "%s\n" "#define HAVE_PANEL_H 1" >>confdefs.h

fi

else case e in #(
  e) ac_fn_c_check_header_compile "$LINENO" "ncursesw/curses.h" "ac_cv_header_ncursesw_curses_h" "$ac_includes_default"
if test "x$ac_cv_header_ncursesw_curses_h" = xyes
then :
  printf "%s\n" "#define HAVE_NCURSESW_CURSES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "ncursesw/ncurses.h" "ac_cv_header_ncursesw_ncurses_h" "$ac_includes_default"
if test "x$ac_cv_header_ncursesw_ncurses_h" = xyes
then :
  printf "%s\n" "#define HAVE_NCURSESW_NCURSES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "ncursesw/panel.h" "ac_cv_header_ncursesw_panel_h" "$ac_includes_default"
if test "x$ac_cv_header_ncursesw_panel_h" = xyes
then :
  printf "%s\n" "#define HAVE_NCURSESW_PANEL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "ncurses/curses.h" "ac_cv_header_ncurses_curses_h" "$ac_includes_default"
if test "x$ac_cv_header_ncurses_curses_h" = xyes
then :
  printf "%s\n" "#define HAVE_NCURSES_CURSES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "ncurses/ncurses.h" "ac_cv_header_ncurses_ncurses_h" "$ac_includes_default"
if test "x$ac_cv_header_ncurses_ncurses_h" = xyes
then :
  printf "%s\n" "#define HAVE_NCURSES_NCURSES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "ncurses/panel.h" "ac_cv_header_ncurses_panel_h" "$ac_includes_default"
if test "x$ac_cv_header_ncurses_panel_h" = xyes
then :
  printf "%s\n" "#define HAVE_NCURSES_PANEL_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "curses.h" "ac_cv_header_curses_h" "$ac_includes_default"
if test "x$ac_cv_header_curses_h" = xyes
then :
  printf "%s\n" "#define HAVE_CURSES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "ncurses.h" "ac_cv_header_ncurses_h" "$ac_includes_default"
if test "x$ac_cv_header_ncurses_h" = xyes
then :
  printf "%s\n" "#define HAVE_NCURSES_H 1" >>confdefs.h

fi
ac_fn_c_check_header_compile "$LINENO" "panel.h" "ac_cv_header_panel_h" "$ac_includes_default"
if test "x$ac_cv_header_panel_h" = xyes
then :
  printf "%s\n" "#define HAVE_PANEL_H 1" >>confdefs.h

fi
 ;;
esac
fi

  # Check that we're able to link with crucial curses/panel functions. This
  # also serves as a fallback in case pkg-config failed. Extension modules are
  # not linked with LIBS, so exclude it to get the required libraries.
  LIBS="$CURSES_LIBS $PANEL_LIBS"
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing initscr" >&5
printf %s "checking for library containing initscr... " >&6; }
if test ${ac_cv_search_initscr+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char initscr (void);
int
main (void)
{
return initscr ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' $curses_libs
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_initscr=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_initscr+y}
then :
  break
fi
done
if test ${ac_cv_search_initscr+y}
then :

else case e in #(
  e) ac_cv_search_initscr=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_initscr" >&5
printf "%s\n" "$ac_cv_search_initscr" >&6; }
ac_res=$ac_cv_search_initscr
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
  if test "x$have_curses" = xno
then :
  have_curses=yes
       CURSES_LIBS=${CURSES_LIBS-"$ac_cv_search_initscr"}
fi
else case e in #(
  e) have_curses=no ;;
esac
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing update_panels" >&5
printf %s "checking for library containing update_panels... " >&6; }
if test ${ac_cv_search_update_panels+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char update_panels (void);
int
main (void)
{
return update_panels ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' $panel_libs
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_update_panels=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_update_panels+y}
then :
  break
fi
done
if test ${ac_cv_search_update_panels+y}
then :

else case e in #(
  e) ac_cv_search_update_panels=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_update_panels" >&5
printf "%s\n" "$ac_cv_search_update_panels" >&6; }
ac_res=$ac_cv_search_update_panels
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
  if test "x$have_panel" = xno
then :
  have_panel=yes
       PANEL_LIBS=${PANEL_LIBS-"$ac_cv_search_update_panels"}
fi
else case e in #(
  e) have_panel=no ;;
esac
fi




if test "$have_curses" != "no"
then :

CURSES_CFLAGS=$(echo $CURSES_CFLAGS | sed 's/-D_XOPEN_SOURCE=600//g')

if test "x$ac_sys_system" = xDarwin
then :


  as_fn_append CURSES_CFLAGS " -D_XOPEN_SOURCE_EXTENDED=1"

fi

PANEL_CFLAGS=$(echo $PANEL_CFLAGS | sed 's/-D_XOPEN_SOURCE=600//g')

case $with_curses in #(
  ncursesw|no) :
     ;; #(
  *) :

          save_curses_cppflags=$CPPFLAGS
  as_fn_append CPPFLAGS " $CURSES_CFLAGS"
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether curses supports wide characters" >&5
printf %s "checking whether curses supports wide characters... " >&6; }
if test ${ac_cv_curses_wide+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        cchar_t wcval;
        setcchar(&wcval, L"x", A_NORMAL, 0, NULL);
        add_wch(&wcval);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_curses_wide=yes
else case e in #(
  e) ac_cv_curses_wide=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_curses_wide" >&5
printf "%s\n" "$ac_cv_curses_wide" >&6; }
  CPPFLAGS=$save_curses_cppflags
      if test "x$ac_cv_curses_wide" = xyes
then :
  printf "%s\n" "#define HAVE_NCURSESW 1" >>confdefs.h

fi
 ;;
esac

# On Solaris, term.h requires curses.h
ac_fn_c_check_header_compile "$LINENO" "term.h" "ac_cv_header_term_h" "
#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

"
if test "x$ac_cv_header_term_h" = xyes
then :
  printf "%s\n" "#define HAVE_TERM_H 1" >>confdefs.h

fi


# On HP/UX 11.0, mvwdelch is a block with a return statement
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mvwdelch is an expression" >&5
printf %s "checking whether mvwdelch is an expression... " >&6; }
if test ${ac_cv_mvwdelch_is_expression+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

  int rtn;
  rtn = mvwdelch(0,0,0);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_mvwdelch_is_expression=yes
else case e in #(
  e) ac_cv_mvwdelch_is_expression=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mvwdelch_is_expression" >&5
printf "%s\n" "$ac_cv_mvwdelch_is_expression" >&6; }

if test "$ac_cv_mvwdelch_is_expression" = yes
then

printf "%s\n" "#define MVWDELCH_IS_EXPRESSION 1" >>confdefs.h

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether WINDOW has _flags" >&5
printf %s "checking whether WINDOW has _flags... " >&6; }
if test ${ac_cv_window_has_flags+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

  WINDOW *w;
  w->_flags = 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_window_has_flags=yes
else case e in #(
  e) ac_cv_window_has_flags=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_window_has_flags" >&5
printf "%s\n" "$ac_cv_window_has_flags" >&6; }


if test "$ac_cv_window_has_flags" = yes
then

printf "%s\n" "#define WINDOW_HAS_FLAGS 1" >>confdefs.h

fi







  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function is_pad" >&5
printf %s "checking for curses function is_pad... " >&6; }
if test ${ac_cv_lib_curses_is_pad+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef is_pad
        void *x=is_pad
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_is_pad=yes
else case e in #(
  e) ac_cv_lib_curses_is_pad=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_is_pad" >&5
printf "%s\n" "$ac_cv_lib_curses_is_pad" >&6; }
  if test "x$ac_cv_lib_curses_is_pad" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_IS_PAD 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function is_term_resized" >&5
printf %s "checking for curses function is_term_resized... " >&6; }
if test ${ac_cv_lib_curses_is_term_resized+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef is_term_resized
        void *x=is_term_resized
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_is_term_resized=yes
else case e in #(
  e) ac_cv_lib_curses_is_term_resized=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_is_term_resized" >&5
printf "%s\n" "$ac_cv_lib_curses_is_term_resized" >&6; }
  if test "x$ac_cv_lib_curses_is_term_resized" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_IS_TERM_RESIZED 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function resize_term" >&5
printf %s "checking for curses function resize_term... " >&6; }
if test ${ac_cv_lib_curses_resize_term+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef resize_term
        void *x=resize_term
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_resize_term=yes
else case e in #(
  e) ac_cv_lib_curses_resize_term=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_resize_term" >&5
printf "%s\n" "$ac_cv_lib_curses_resize_term" >&6; }
  if test "x$ac_cv_lib_curses_resize_term" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_RESIZE_TERM 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function resizeterm" >&5
printf %s "checking for curses function resizeterm... " >&6; }
if test ${ac_cv_lib_curses_resizeterm+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef resizeterm
        void *x=resizeterm
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_resizeterm=yes
else case e in #(
  e) ac_cv_lib_curses_resizeterm=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_resizeterm" >&5
printf "%s\n" "$ac_cv_lib_curses_resizeterm" >&6; }
  if test "x$ac_cv_lib_curses_resizeterm" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_RESIZETERM 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function immedok" >&5
printf %s "checking for curses function immedok... " >&6; }
if test ${ac_cv_lib_curses_immedok+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef immedok
        void *x=immedok
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_immedok=yes
else case e in #(
  e) ac_cv_lib_curses_immedok=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_immedok" >&5
printf "%s\n" "$ac_cv_lib_curses_immedok" >&6; }
  if test "x$ac_cv_lib_curses_immedok" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_IMMEDOK 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function syncok" >&5
printf %s "checking for curses function syncok... " >&6; }
if test ${ac_cv_lib_curses_syncok+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef syncok
        void *x=syncok
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_syncok=yes
else case e in #(
  e) ac_cv_lib_curses_syncok=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_syncok" >&5
printf "%s\n" "$ac_cv_lib_curses_syncok" >&6; }
  if test "x$ac_cv_lib_curses_syncok" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SYNCOK 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function wchgat" >&5
printf %s "checking for curses function wchgat... " >&6; }
if test ${ac_cv_lib_curses_wchgat+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef wchgat
        void *x=wchgat
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_wchgat=yes
else case e in #(
  e) ac_cv_lib_curses_wchgat=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_wchgat" >&5
printf "%s\n" "$ac_cv_lib_curses_wchgat" >&6; }
  if test "x$ac_cv_lib_curses_wchgat" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_WCHGAT 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function filter" >&5
printf %s "checking for curses function filter... " >&6; }
if test ${ac_cv_lib_curses_filter+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef filter
        void *x=filter
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_filter=yes
else case e in #(
  e) ac_cv_lib_curses_filter=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_filter" >&5
printf "%s\n" "$ac_cv_lib_curses_filter" >&6; }
  if test "x$ac_cv_lib_curses_filter" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_FILTER 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function nofilter" >&5
printf %s "checking for curses function nofilter... " >&6; }
if test ${ac_cv_lib_curses_nofilter+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef nofilter
        void *x=nofilter
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_nofilter=yes
else case e in #(
  e) ac_cv_lib_curses_nofilter=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_nofilter" >&5
printf "%s\n" "$ac_cv_lib_curses_nofilter" >&6; }
  if test "x$ac_cv_lib_curses_nofilter" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_NOFILTER 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function has_key" >&5
printf %s "checking for curses function has_key... " >&6; }
if test ${ac_cv_lib_curses_has_key+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef has_key
        void *x=has_key
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_has_key=yes
else case e in #(
  e) ac_cv_lib_curses_has_key=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_has_key" >&5
printf "%s\n" "$ac_cv_lib_curses_has_key" >&6; }
  if test "x$ac_cv_lib_curses_has_key" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_HAS_KEY 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function has_mouse" >&5
printf %s "checking for curses function has_mouse... " >&6; }
if test ${ac_cv_lib_curses_has_mouse+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef has_mouse
        void *x=has_mouse
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_has_mouse=yes
else case e in #(
  e) ac_cv_lib_curses_has_mouse=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_has_mouse" >&5
printf "%s\n" "$ac_cv_lib_curses_has_mouse" >&6; }
  if test "x$ac_cv_lib_curses_has_mouse" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_HAS_MOUSE 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function is_keypad" >&5
printf %s "checking for curses function is_keypad... " >&6; }
if test ${ac_cv_lib_curses_is_keypad+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef is_keypad
        void *x=is_keypad
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_is_keypad=yes
else case e in #(
  e) ac_cv_lib_curses_is_keypad=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_is_keypad" >&5
printf "%s\n" "$ac_cv_lib_curses_is_keypad" >&6; }
  if test "x$ac_cv_lib_curses_is_keypad" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_IS_KEYPAD 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function is_leaveok" >&5
printf %s "checking for curses function is_leaveok... " >&6; }
if test ${ac_cv_lib_curses_is_leaveok+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef is_leaveok
        void *x=is_leaveok
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_is_leaveok=yes
else case e in #(
  e) ac_cv_lib_curses_is_leaveok=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_is_leaveok" >&5
printf "%s\n" "$ac_cv_lib_curses_is_leaveok" >&6; }
  if test "x$ac_cv_lib_curses_is_leaveok" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_IS_LEAVEOK 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function typeahead" >&5
printf %s "checking for curses function typeahead... " >&6; }
if test ${ac_cv_lib_curses_typeahead+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef typeahead
        void *x=typeahead
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_typeahead=yes
else case e in #(
  e) ac_cv_lib_curses_typeahead=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_typeahead" >&5
printf "%s\n" "$ac_cv_lib_curses_typeahead" >&6; }
  if test "x$ac_cv_lib_curses_typeahead" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_TYPEAHEAD 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function use_env" >&5
printf %s "checking for curses function use_env... " >&6; }
if test ${ac_cv_lib_curses_use_env+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef use_env
        void *x=use_env
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_use_env=yes
else case e in #(
  e) ac_cv_lib_curses_use_env=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_use_env" >&5
printf "%s\n" "$ac_cv_lib_curses_use_env" >&6; }
  if test "x$ac_cv_lib_curses_use_env" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_USE_ENV 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function new_prescr" >&5
printf %s "checking for curses function new_prescr... " >&6; }
if test ${ac_cv_lib_curses_new_prescr+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef new_prescr
        void *x=new_prescr
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_new_prescr=yes
else case e in #(
  e) ac_cv_lib_curses_new_prescr=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_new_prescr" >&5
printf "%s\n" "$ac_cv_lib_curses_new_prescr" >&6; }
  if test "x$ac_cv_lib_curses_new_prescr" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_NEW_PRESCR 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function use_screen" >&5
printf %s "checking for curses function use_screen... " >&6; }
if test ${ac_cv_lib_curses_use_screen+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef use_screen
        void *x=use_screen
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_use_screen=yes
else case e in #(
  e) ac_cv_lib_curses_use_screen=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_use_screen" >&5
printf "%s\n" "$ac_cv_lib_curses_use_screen" >&6; }
  if test "x$ac_cv_lib_curses_use_screen" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_USE_SCREEN 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function use_window" >&5
printf %s "checking for curses function use_window... " >&6; }
if test ${ac_cv_lib_curses_use_window+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef use_window
        void *x=use_window
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_use_window=yes
else case e in #(
  e) ac_cv_lib_curses_use_window=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_use_window" >&5
printf "%s\n" "$ac_cv_lib_curses_use_window" >&6; }
  if test "x$ac_cv_lib_curses_use_window" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_USE_WINDOW 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function key_defined" >&5
printf %s "checking for curses function key_defined... " >&6; }
if test ${ac_cv_lib_curses_key_defined+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef key_defined
        void *x=key_defined
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_key_defined=yes
else case e in #(
  e) ac_cv_lib_curses_key_defined=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_key_defined" >&5
printf "%s\n" "$ac_cv_lib_curses_key_defined" >&6; }
  if test "x$ac_cv_lib_curses_key_defined" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_KEY_DEFINED 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function term_attrs" >&5
printf %s "checking for curses function term_attrs... " >&6; }
if test ${ac_cv_lib_curses_term_attrs+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef term_attrs
        void *x=term_attrs
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_term_attrs=yes
else case e in #(
  e) ac_cv_lib_curses_term_attrs=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_term_attrs" >&5
printf "%s\n" "$ac_cv_lib_curses_term_attrs" >&6; }
  if test "x$ac_cv_lib_curses_term_attrs" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_TERM_ATTRS 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function define_key" >&5
printf %s "checking for curses function define_key... " >&6; }
if test ${ac_cv_lib_curses_define_key+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef define_key
        void *x=define_key
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_define_key=yes
else case e in #(
  e) ac_cv_lib_curses_define_key=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_define_key" >&5
printf "%s\n" "$ac_cv_lib_curses_define_key" >&6; }
  if test "x$ac_cv_lib_curses_define_key" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_DEFINE_KEY 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function keyok" >&5
printf %s "checking for curses function keyok... " >&6; }
if test ${ac_cv_lib_curses_keyok+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef keyok
        void *x=keyok
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_keyok=yes
else case e in #(
  e) ac_cv_lib_curses_keyok=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_keyok" >&5
printf "%s\n" "$ac_cv_lib_curses_keyok" >&6; }
  if test "x$ac_cv_lib_curses_keyok" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_KEYOK 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function set_escdelay" >&5
printf %s "checking for curses function set_escdelay... " >&6; }
if test ${ac_cv_lib_curses_set_escdelay+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef set_escdelay
        void *x=set_escdelay
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_set_escdelay=yes
else case e in #(
  e) ac_cv_lib_curses_set_escdelay=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_set_escdelay" >&5
printf "%s\n" "$ac_cv_lib_curses_set_escdelay" >&6; }
  if test "x$ac_cv_lib_curses_set_escdelay" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SET_ESCDELAY 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function set_tabsize" >&5
printf %s "checking for curses function set_tabsize... " >&6; }
if test ${ac_cv_lib_curses_set_tabsize+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef set_tabsize
        void *x=set_tabsize
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_set_tabsize=yes
else case e in #(
  e) ac_cv_lib_curses_set_tabsize=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_set_tabsize" >&5
printf "%s\n" "$ac_cv_lib_curses_set_tabsize" >&6; }
  if test "x$ac_cv_lib_curses_set_tabsize" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SET_TABSIZE 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function wattr_get" >&5
printf %s "checking for curses function wattr_get... " >&6; }
if test ${ac_cv_lib_curses_wattr_get+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef wattr_get
        void *x=wattr_get
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_wattr_get=yes
else case e in #(
  e) ac_cv_lib_curses_wattr_get=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_wattr_get" >&5
printf "%s\n" "$ac_cv_lib_curses_wattr_get" >&6; }
  if test "x$ac_cv_lib_curses_wattr_get" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_WATTR_GET 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function wattr_set" >&5
printf %s "checking for curses function wattr_set... " >&6; }
if test ${ac_cv_lib_curses_wattr_set+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef wattr_set
        void *x=wattr_set
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_wattr_set=yes
else case e in #(
  e) ac_cv_lib_curses_wattr_set=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_wattr_set" >&5
printf "%s\n" "$ac_cv_lib_curses_wattr_set" >&6; }
  if test "x$ac_cv_lib_curses_wattr_set" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_WATTR_SET 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function wattr_on" >&5
printf %s "checking for curses function wattr_on... " >&6; }
if test ${ac_cv_lib_curses_wattr_on+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef wattr_on
        void *x=wattr_on
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_wattr_on=yes
else case e in #(
  e) ac_cv_lib_curses_wattr_on=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_wattr_on" >&5
printf "%s\n" "$ac_cv_lib_curses_wattr_on" >&6; }
  if test "x$ac_cv_lib_curses_wattr_on" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_WATTR_ON 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function wattr_off" >&5
printf %s "checking for curses function wattr_off... " >&6; }
if test ${ac_cv_lib_curses_wattr_off+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef wattr_off
        void *x=wattr_off
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_wattr_off=yes
else case e in #(
  e) ac_cv_lib_curses_wattr_off=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_wattr_off" >&5
printf "%s\n" "$ac_cv_lib_curses_wattr_off" >&6; }
  if test "x$ac_cv_lib_curses_wattr_off" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_WATTR_OFF 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function wcolor_set" >&5
printf %s "checking for curses function wcolor_set... " >&6; }
if test ${ac_cv_lib_curses_wcolor_set+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef wcolor_set
        void *x=wcolor_set
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_wcolor_set=yes
else case e in #(
  e) ac_cv_lib_curses_wcolor_set=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_wcolor_set" >&5
printf "%s\n" "$ac_cv_lib_curses_wcolor_set" >&6; }
  if test "x$ac_cv_lib_curses_wcolor_set" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_WCOLOR_SET 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function slk_attr_on" >&5
printf %s "checking for curses function slk_attr_on... " >&6; }
if test ${ac_cv_lib_curses_slk_attr_on+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef slk_attr_on
        void *x=slk_attr_on
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_slk_attr_on=yes
else case e in #(
  e) ac_cv_lib_curses_slk_attr_on=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_slk_attr_on" >&5
printf "%s\n" "$ac_cv_lib_curses_slk_attr_on" >&6; }
  if test "x$ac_cv_lib_curses_slk_attr_on" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SLK_ATTR_ON 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function slk_attr_off" >&5
printf %s "checking for curses function slk_attr_off... " >&6; }
if test ${ac_cv_lib_curses_slk_attr_off+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef slk_attr_off
        void *x=slk_attr_off
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_slk_attr_off=yes
else case e in #(
  e) ac_cv_lib_curses_slk_attr_off=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_slk_attr_off" >&5
printf "%s\n" "$ac_cv_lib_curses_slk_attr_off" >&6; }
  if test "x$ac_cv_lib_curses_slk_attr_off" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SLK_ATTR_OFF 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function slk_attr_set" >&5
printf %s "checking for curses function slk_attr_set... " >&6; }
if test ${ac_cv_lib_curses_slk_attr_set+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef slk_attr_set
        void *x=slk_attr_set
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_slk_attr_set=yes
else case e in #(
  e) ac_cv_lib_curses_slk_attr_set=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_slk_attr_set" >&5
printf "%s\n" "$ac_cv_lib_curses_slk_attr_set" >&6; }
  if test "x$ac_cv_lib_curses_slk_attr_set" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SLK_ATTR_SET 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function slk_color" >&5
printf %s "checking for curses function slk_color... " >&6; }
if test ${ac_cv_lib_curses_slk_color+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef slk_color
        void *x=slk_color
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_slk_color=yes
else case e in #(
  e) ac_cv_lib_curses_slk_color=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_slk_color" >&5
printf "%s\n" "$ac_cv_lib_curses_slk_color" >&6; }
  if test "x$ac_cv_lib_curses_slk_color" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SLK_COLOR 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses variable ESCDELAY" >&5
printf %s "checking for curses variable ESCDELAY... " >&6; }
if test ${ac_cv_lib_curses_ESCDELAY+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        int x = ESCDELAY; (void)x;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_ESCDELAY=yes
else case e in #(
  e) ac_cv_lib_curses_ESCDELAY=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_ESCDELAY" >&5
printf "%s\n" "$ac_cv_lib_curses_ESCDELAY" >&6; }
  if test "x$ac_cv_lib_curses_ESCDELAY" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_ESCDELAY 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses variable TABSIZE" >&5
printf %s "checking for curses variable TABSIZE... " >&6; }
if test ${ac_cv_lib_curses_TABSIZE+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        int x = TABSIZE; (void)x;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_TABSIZE=yes
else case e in #(
  e) ac_cv_lib_curses_TABSIZE=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_TABSIZE" >&5
printf "%s\n" "$ac_cv_lib_curses_TABSIZE" >&6; }
  if test "x$ac_cv_lib_curses_TABSIZE" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_TABSIZE 1" >>confdefs.h

fi




{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ncurses-style curses function getmouse" >&5
printf %s "checking for ncurses-style curses function getmouse... " >&6; }
if test ${ac_cv_lib_curses_getmouse+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{
MEVENT event; (void)getmouse(&event);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_getmouse=yes
else case e in #(
  e) ac_cv_lib_curses_getmouse=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_getmouse" >&5
printf "%s\n" "$ac_cv_lib_curses_getmouse" >&6; }
if test "x$ac_cv_lib_curses_getmouse" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_GETMOUSE 1" >>confdefs.h

fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function scr_dump" >&5
printf %s "checking for curses function scr_dump... " >&6; }
if test ${ac_cv_lib_curses_scr_dump+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef scr_dump
        void *x=scr_dump
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_scr_dump=yes
else case e in #(
  e) ac_cv_lib_curses_scr_dump=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_scr_dump" >&5
printf "%s\n" "$ac_cv_lib_curses_scr_dump" >&6; }
  if test "x$ac_cv_lib_curses_scr_dump" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SCR_DUMP 1" >>confdefs.h

fi





  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curses function scr_set" >&5
printf %s "checking for curses function scr_set... " >&6; }
if test ${ac_cv_lib_curses_scr_set+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define NCURSES_OPAQUE 0
#if defined(HAVE_NCURSESW_NCURSES_H)
#  include <ncursesw/ncurses.h>
#elif defined(HAVE_NCURSESW_CURSES_H)
#  include <ncursesw/curses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
#  include <ncurses/ncurses.h>
#elif defined(HAVE_NCURSES_CURSES_H)
#  include <ncurses/curses.h>
#elif defined(HAVE_NCURSES_H)
#  include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#  include <curses.h>
#endif

int
main (void)
{

        #ifndef scr_set
        void *x=scr_set
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_lib_curses_scr_set=yes
else case e in #(
  e) ac_cv_lib_curses_scr_set=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_scr_set" >&5
printf "%s\n" "$ac_cv_lib_curses_scr_set" >&6; }
  if test "x$ac_cv_lib_curses_scr_set" = xyes
then :

printf "%s\n" "#define HAVE_CURSES_SCR_SET 1" >>confdefs.h

fi



CPPFLAGS=$ac_save_cppflags

fi
CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for device files" >&5
printf "%s\n" "$as_me: checking for device files" >&6;}

if test "$ac_sys_system" = "Linux-android" || test "$ac_sys_system" = "iOS"; then
  ac_cv_file__dev_ptmx=no
  ac_cv_file__dev_ptc=no
else
  if test "x$cross_compiling" = xyes; then
    if test "${ac_cv_file__dev_ptmx+set}" != set; then
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
printf %s "checking for /dev/ptmx... " >&6; }
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not set" >&5
printf "%s\n" "not set" >&6; }
      as_fn_error $? "set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
    fi
    if test "${ac_cv_file__dev_ptc+set}" != set; then
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
printf %s "checking for /dev/ptc... " >&6; }
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not set" >&5
printf "%s\n" "not set" >&6; }
      as_fn_error $? "set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
    fi
  fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
printf %s "checking for /dev/ptmx... " >&6; }
if test ${ac_cv_file__dev_ptmx+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) test "$cross_compiling" = yes &&
  as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
if test -r "/dev/ptmx"; then
  ac_cv_file__dev_ptmx=yes
else
  ac_cv_file__dev_ptmx=no
fi ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file__dev_ptmx" >&5
printf "%s\n" "$ac_cv_file__dev_ptmx" >&6; }
if test "x$ac_cv_file__dev_ptmx" = xyes
then :

fi

  if test "x$ac_cv_file__dev_ptmx" = xyes; then

printf "%s\n" "#define HAVE_DEV_PTMX 1" >>confdefs.h

  fi
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
printf %s "checking for /dev/ptc... " >&6; }
if test ${ac_cv_file__dev_ptc+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) test "$cross_compiling" = yes &&
  as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
if test -r "/dev/ptc"; then
  ac_cv_file__dev_ptc=yes
else
  ac_cv_file__dev_ptc=no
fi ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file__dev_ptc" >&5
printf "%s\n" "$ac_cv_file__dev_ptc" >&6; }
if test "x$ac_cv_file__dev_ptc" = xyes
then :

fi

  if test "x$ac_cv_file__dev_ptc" = xyes; then

printf "%s\n" "#define HAVE_DEV_PTC 1" >>confdefs.h

  fi
fi

if test $ac_sys_system = Darwin
then
	LIBS="$LIBS -framework CoreFoundation"
fi

ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif

"
if test "x$ac_cv_type_socklen_t" = xyes
then :

printf "%s\n" "#define HAVE_SOCKLEN_T 1" >>confdefs.h


else case e in #(
  e)
printf "%s\n" "#define socklen_t int" >>confdefs.h
 ;;
esac
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for broken mbstowcs" >&5
printf %s "checking for broken mbstowcs... " >&6; }
if test ${ac_cv_broken_mbstowcs+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  ac_cv_broken_mbstowcs=no
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
    size_t len = -1;
    const char *str = "text";
    len = mbstowcs(NULL, str, 0);
    return (len != 4);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_broken_mbstowcs=no
else case e in #(
  e) ac_cv_broken_mbstowcs=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_broken_mbstowcs" >&5
printf "%s\n" "$ac_cv_broken_mbstowcs" >&6; }
if test "$ac_cv_broken_mbstowcs" = yes
then

printf "%s\n" "#define HAVE_BROKEN_MBSTOWCS 1" >>confdefs.h

fi

# Check for --with-computed-gotos
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-computed-gotos" >&5
printf %s "checking for --with-computed-gotos... " >&6; }

# Check whether --with-computed-gotos was given.
if test ${with_computed_gotos+y}
then :
  withval=$with_computed_gotos;
if test "$withval" = yes
then

printf "%s\n" "#define USE_COMPUTED_GOTOS 1" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
fi
if test "$withval" = no
then

printf "%s\n" "#define USE_COMPUTED_GOTOS 0" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no value specified" >&5
printf "%s\n" "no value specified" >&6; } ;;
esac
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports computed gotos" >&5
printf %s "checking whether $CC supports computed gotos... " >&6; }
if test ${ac_cv_computed_gotos+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test "$cross_compiling" = yes
then :
  if test "${with_computed_gotos+set}" = set; then
   ac_cv_computed_gotos="$with_computed_gotos -- configured --with(out)-computed-gotos"
 else
   ac_cv_computed_gotos=no
 fi
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int main(int argc, char **argv)
{
    static void *targets[1] = { &&LABEL1 };
    goto LABEL2;
LABEL1:
    return 0;
LABEL2:
    goto *targets[0];
    return 1;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  ac_cv_computed_gotos=yes
else case e in #(
  e) ac_cv_computed_gotos=no ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_computed_gotos" >&5
printf "%s\n" "$ac_cv_computed_gotos" >&6; }
case "$ac_cv_computed_gotos" in yes*)

printf "%s\n" "#define HAVE_COMPUTED_GOTOS 1" >>confdefs.h

esac

# Check for --with-tail-call-interp
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-tail-call-interp" >&5
printf %s "checking for --with-tail-call-interp... " >&6; }

# Check whether --with-tail-call-interp was given.
if test ${with_tail_call_interp+y}
then :
  withval=$with_tail_call_interp;
if test "$withval" = yes
then

printf "%s\n" "#define _Py_TAIL_CALL_INTERP 1" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
fi
if test "$withval" = no
then

printf "%s\n" "#define _Py_TAIL_CALL_INTERP 0" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

else case e in #(
  e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no value specified" >&5
printf "%s\n" "no value specified" >&6; } ;;
esac
fi


# Check for --with-remote-debug
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-remote-debug" >&5
printf %s "checking for --with-remote-debug... " >&6; }

# Check whether --with-remote-debug was given.
if test ${with_remote_debug+y}
then :
  withval=$with_remote_debug;
else case e in #(
  e) with_remote_debug=yes ;;
esac
fi


if test "$with_remote_debug" = yes; then

printf "%s\n" "#define Py_REMOTE_DEBUG 1" >>confdefs.h

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


case $ac_sys_system in
AIX*)

printf "%s\n" "#define HAVE_BROKEN_PIPE_BUF 1" >>confdefs.h
 ;;
esac




for h in `(cd $srcdir;echo Python/thread_*.h)`
do
  THREADHEADERS="$THREADHEADERS \$(srcdir)/$h"
done


SRCDIRS="\
  Modules \
  Modules/_ctypes \
  Modules/_decimal \
  Modules/_hacl \
  Modules/_io \
  Modules/_multiprocessing \
  Modules/_remote_debugging \
  Modules/_sqlite \
  Modules/_sre \
  Modules/_testcapi \
  Modules/_testinternalcapi \
  Modules/_testlimitedcapi \
  Modules/_xxtestfuzz \
  Modules/_zstd \
  Modules/cjkcodecs \
  Modules/expat \
  Objects \
  Objects/mimalloc \
  Objects/mimalloc/prim \
  Parser \
  Parser/tokenizer \
  Parser/lexer \
  Programs \
  Python \
  Python/frozen_modules"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for build directories" >&5
printf %s "checking for build directories... " >&6; }
for dir in $SRCDIRS; do
    if test ! -d $dir; then
        mkdir $dir
    fi
done
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
printf "%s\n" "done" >&6; }

# Availability of -O2:
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -O2" >&5
printf %s "checking for -O2... " >&6; }
if test ${ac_cv_compile_o2+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
saved_cflags="$CFLAGS"
CFLAGS="-O2"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ac_cv_compile_o2=yes
else case e in #(
  e) ac_cv_compile_o2=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS="$saved_cflags"
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_compile_o2" >&5
printf "%s\n" "$ac_cv_compile_o2" >&6; }

# _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
# http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glibc _FORTIFY_SOURCE/memmove bug" >&5
printf %s "checking for glibc _FORTIFY_SOURCE/memmove bug... " >&6; }
saved_cflags="$CFLAGS"
CFLAGS="-O2 -D_FORTIFY_SOURCE=2"
if test "$ac_cv_compile_o2" = no; then
    CFLAGS=""
fi
if test "$cross_compiling" = yes
then :
  have_glibc_memmove_bug=undefined
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void foo(void *p, void *q) { memmove(p, q, 19); }
int main(void) {
  char a[32] = "123456789000000000";
  foo(&a[9], a);
  if (strcmp(a, "123456789123456789000000000") != 0)
    return 1;
  foo(a, &a[9]);
  if (strcmp(a, "123456789000000000") != 0)
    return 1;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  have_glibc_memmove_bug=no
else case e in #(
  e) have_glibc_memmove_bug=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

CFLAGS="$saved_cflags"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_glibc_memmove_bug" >&5
printf "%s\n" "$have_glibc_memmove_bug" >&6; }
if test "$have_glibc_memmove_bug" = yes; then

printf "%s\n" "#define HAVE_GLIBC_MEMMOVE_BUG 1" >>confdefs.h

fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we need to manually block large inlining in ceval.c" >&5
printf %s "checking if we need to manually block large inlining in ceval.c... " >&6; }
if test "$cross_compiling" = yes
then :
  block_huge_inlining_in_ceval=undefined
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int main(void) {
// See gh-148284: Clang 22 seems to have interactions with inlining
// and the stackref buffer which cause 40 kB of stack usage on x86-64
// in buggy versions of _PyEval_EvalFrameDefault() in computed goto
// interpreter. The normal usage seen is normally 1-2 kB.
#if defined(__clang__) && (__clang_major__ == 22)
    return 1;
#else
    return 0;
#endif
}

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  block_huge_inlining_in_ceval=no
else case e in #(
  e) block_huge_inlining_in_ceval=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $block_huge_inlining_in_ceval" >&5
printf "%s\n" "$block_huge_inlining_in_ceval" >&6; }

if test "$block_huge_inlining_in_ceval" = yes && test "$ac_cv_computed_gotos" = yes; then
    # gh-148284: Suppress inlining of functions whose stack size exceeds
    # 512 bytes. This number should be tuned to follow the C stack
    # consumption in _PyEval_EvalFrameDefault() on computed goto
    # interpreter.
    CFLAGS_CEVAL="$CFLAGS_CEVAL -finline-max-stacksize=512"
fi


if test "$ac_cv_gcc_asm_for_x87" = yes; then
    # Some versions of gcc miscompile inline asm:
    # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
    # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
    case $ac_cv_cc_name in
        gcc)
            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gcc ipa-pure-const bug" >&5
printf %s "checking for gcc ipa-pure-const bug... " >&6; }
            saved_cflags="$CFLAGS"
            CFLAGS="-O2"
            if test "$cross_compiling" = yes
then :
  have_ipa_pure_const_bug=undefined
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

            __attribute__((noinline)) int
            foo(int *p) {
              int r;
              asm ( "movl \$6, (%1)\n\t"
                    "xorl %0, %0\n\t"
                    : "=r" (r) : "r" (p) : "memory"
              );
              return r;
            }
            int main(void) {
              int p = 8;
              if ((foo(&p) ? : p) != 6)
                return 1;
              return 0;
            }

_ACEOF
if ac_fn_c_try_run "$LINENO"
then :
  have_ipa_pure_const_bug=no
else case e in #(
  e) have_ipa_pure_const_bug=yes ;;
esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
fi

            CFLAGS="$saved_cflags"
            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_ipa_pure_const_bug" >&5
printf "%s\n" "$have_ipa_pure_const_bug" >&6; }
            if test "$have_ipa_pure_const_bug" = yes; then

printf "%s\n" "#define HAVE_IPA_PURE_CONST_BUG 1" >>confdefs.h

            fi
        ;;
    esac
fi

# ensurepip option
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ensurepip" >&5
printf %s "checking for ensurepip... " >&6; }

# Check whether --with-ensurepip was given.
if test ${with_ensurepip+y}
then :
  withval=$with_ensurepip;
else case e in #(
  e)
      case $ac_sys_system in #(
  Emscripten) :
    with_ensurepip=no ;; #(
  WASI) :
    with_ensurepip=no ;; #(
  iOS) :
    with_ensurepip=no ;; #(
  *) :
    with_ensurepip=upgrade
       ;;
esac
     ;;
esac
fi

case $with_ensurepip in #(
  yes|upgrade) :
    ENSUREPIP=upgrade ;; #(
  install) :
    ENSUREPIP=install ;; #(
  no) :
    ENSUREPIP=no ;; #(
  *) :
    as_fn_error $? "--with-ensurepip=upgrade|install|no" "$LINENO" 5 ;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ENSUREPIP" >&5
printf "%s\n" "$ENSUREPIP" >&6; }


# check if the dirent structure of a d_type field and DT_UNKNOWN is defined
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the dirent structure of a d_type field" >&5
printf %s "checking if the dirent structure of a d_type field... " >&6; }
if test ${ac_cv_dirent_d_type+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


    #include <dirent.h>

    int main(void) {
      struct dirent entry;
      return entry.d_type == DT_UNKNOWN;
    }


_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_dirent_d_type=yes
else case e in #(
  e) ac_cv_dirent_d_type=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_dirent_d_type" >&5
printf "%s\n" "$ac_cv_dirent_d_type" >&6; }

if test "x$ac_cv_dirent_d_type" = xyes
then :


printf "%s\n" "#define HAVE_DIRENT_D_TYPE 1" >>confdefs.h


fi

# check if the Linux getrandom() syscall is available
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the Linux getrandom() syscall" >&5
printf %s "checking for the Linux getrandom() syscall... " >&6; }
if test ${ac_cv_getrandom_syscall+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


    #include <stddef.h>
    #include <unistd.h>
    #include <sys/syscall.h>
    #include <linux/random.h>

    int main(void) {
        char buffer[1];
        const size_t buflen = sizeof(buffer);
        const int flags = GRND_NONBLOCK;
        /* ignore the result, Python checks for ENOSYS and EAGAIN at runtime */
        (void)syscall(SYS_getrandom, buffer, buflen, flags);
        return 0;
    }


_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_getrandom_syscall=yes
else case e in #(
  e) ac_cv_getrandom_syscall=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_getrandom_syscall" >&5
printf "%s\n" "$ac_cv_getrandom_syscall" >&6; }

if test "x$ac_cv_getrandom_syscall" = xyes
then :


printf "%s\n" "#define HAVE_GETRANDOM_SYSCALL 1" >>confdefs.h


fi

# check if the getrandom() function is available
# the test was written for the Solaris function of <sys/random.h>
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the getrandom() function" >&5
printf %s "checking for the getrandom() function... " >&6; }
if test ${ac_cv_func_getrandom+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


    #include <stddef.h>
    #include <sys/random.h>

    int main(void) {
        char buffer[1];
        const size_t buflen = sizeof(buffer);
        const int flags = 0;
        /* ignore the result, Python checks for ENOSYS at runtime */
        (void)getrandom(buffer, buflen, flags);
        return 0;
    }


_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_func_getrandom=yes
else case e in #(
  e) ac_cv_func_getrandom=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
 ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getrandom" >&5
printf "%s\n" "$ac_cv_func_getrandom" >&6; }

if test "x$ac_cv_func_getrandom" = xyes
then :


printf "%s\n" "#define HAVE_GETRANDOM 1" >>confdefs.h


fi

# checks for POSIX shared memory, used by Modules/_multiprocessing/posixshmem.c
# shm_* may only be available if linking against librt
POSIXSHMEM_CFLAGS='-I$(srcdir)/Modules/_multiprocessing'
save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing shm_open" >&5
printf %s "checking for library containing shm_open... " >&6; }
if test ${ac_cv_search_shm_open+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.
   The 'extern "C"' is for builds by C++ compilers;
   although this is not generally supported in C code supporting it here
   has little cost and some practical benefit (sr 110532).  */
#ifdef __cplusplus
extern "C"
#endif
char shm_open (void);
int
main (void)
{
return shm_open ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' rt
do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_search_shm_open=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext
  if test ${ac_cv_search_shm_open+y}
then :
  break
fi
done
if test ${ac_cv_search_shm_open+y}
then :

else case e in #(
  e) ac_cv_search_shm_open=no ;;
esac
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_shm_open" >&5
printf "%s\n" "$ac_cv_search_shm_open" >&6; }
ac_res=$ac_cv_search_shm_open
if test "$ac_res" != no
then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

  if test "x$ac_cv_search_shm_open" = x-lrt
then :
  POSIXSHMEM_LIBS="-lrt"
fi

    save_ac_includes_default=$ac_includes_default
  ac_includes_default="\
  ${ac_includes_default}
  #ifndef __cplusplus
  #  ifdef HAVE_SYS_MMAN_H
  #    include <sys/mman.h>
  #  endif
  #endif
  "

  for ac_func in shm_open shm_unlink
do :
  as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"
then :
  cat >>confdefs.h <<_ACEOF
#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1
_ACEOF
 have_posix_shmem=yes
else case e in #(
  e) have_posix_shmem=no ;;
esac
fi

done
  ac_includes_default=$save_ac_includes_default

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



# Check for usable OpenSSL

    found=false

# Check whether --with-openssl was given.
if test ${with_openssl+y}
then :
  withval=$with_openssl;
            case "$withval" in
            "" | y | ye | yes | n | no)
            as_fn_error $? "Invalid --with-openssl value" "$LINENO" 5
              ;;
            *) ssldirs="$withval"
              ;;
            esac

else case e in #(
  e)
            # if pkg-config is installed and openssl has installed a .pc file,
            # then use that information and don't search ssldirs
            if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_PKG_CONFIG+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$PKG_CONFIG"; then
  ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_PKG_CONFIG="${ac_tool_prefix}pkg-config"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
PKG_CONFIG=$ac_cv_prog_PKG_CONFIG
if test -n "$PKG_CONFIG"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
printf "%s\n" "$PKG_CONFIG" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_PKG_CONFIG"; then
  ac_ct_PKG_CONFIG=$PKG_CONFIG
  # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_PKG_CONFIG+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) if test -n "$ac_ct_PKG_CONFIG"; then
  ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_PKG_CONFIG="pkg-config"
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi ;;
esac
fi
ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG
if test -n "$ac_ct_PKG_CONFIG"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PKG_CONFIG" >&5
printf "%s\n" "$ac_ct_PKG_CONFIG" >&6; }
else
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi

  if test "x$ac_ct_PKG_CONFIG" = x; then
    PKG_CONFIG=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    PKG_CONFIG=$ac_ct_PKG_CONFIG
  fi
else
  PKG_CONFIG="$ac_cv_prog_PKG_CONFIG"
fi

            if test x"$PKG_CONFIG" != x""; then
                OPENSSL_LDFLAGS=`$PKG_CONFIG openssl --libs-only-L 2>/dev/null`
                if test $? = 0; then
                    OPENSSL_LIBS=`$PKG_CONFIG openssl --libs-only-l 2>/dev/null`
                    OPENSSL_INCLUDES=`$PKG_CONFIG openssl --cflags-only-I 2>/dev/null`
                    found=true
                fi
            fi

            # no such luck; use some default ssldirs
            if ! $found; then
                ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr"
            fi

         ;;
esac
fi



    # note that we #include <openssl/foo.h>, so the OpenSSL headers have to be in
    # an 'openssl' subdirectory

    if ! $found; then
        OPENSSL_INCLUDES=
        for ssldir in $ssldirs; do
            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for include/openssl/ssl.h in $ssldir" >&5
printf %s "checking for include/openssl/ssl.h in $ssldir... " >&6; }
            if test -f "$ssldir/include/openssl/ssl.h"; then
                OPENSSL_INCLUDES="-I$ssldir/include"
                OPENSSL_LDFLAGS="-L$ssldir/lib"
                OPENSSL_LIBS="-lssl -lcrypto"
                found=true
                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
                break
            else
                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
            fi
        done

        # if the file wasn't found, well, go ahead and try the link anyway -- maybe
        # it will just work!
    fi

    # try the preprocessor and linker with our new flags,
    # being careful not to pollute the global LIBS, LDFLAGS, and CPPFLAGS

    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiling and linking against OpenSSL works" >&5
printf %s "checking whether compiling and linking against OpenSSL works... " >&6; }
    echo "Trying link with OPENSSL_LDFLAGS=$OPENSSL_LDFLAGS;" \
        "OPENSSL_LIBS=$OPENSSL_LIBS; OPENSSL_INCLUDES=$OPENSSL_INCLUDES" >&5

    save_LIBS="$LIBS"
    save_LDFLAGS="$LDFLAGS"
    save_CPPFLAGS="$CPPFLAGS"
    LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
    LIBS="$OPENSSL_LIBS $LIBS"
    CPPFLAGS="$OPENSSL_INCLUDES $CPPFLAGS"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <openssl/ssl.h>
int
main (void)
{
SSL_new(NULL)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :

            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
            have_openssl=yes

else case e in #(
  e)
            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
            have_openssl=no
         ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
    CPPFLAGS="$save_CPPFLAGS"
    LDFLAGS="$save_LDFLAGS"
    LIBS="$save_LIBS"






# rpath to libssl and libcrypto
if test "x$GNULD" = xyes
then :

  rpath_arg="-Wl,--enable-new-dtags,-rpath="

else case e in #(
  e)
  if test "$ac_sys_system" = "Darwin"
  then
     rpath_arg="-Wl,-rpath,"
  else
     rpath_arg="-Wl,-rpath="
  fi
 ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-openssl-rpath" >&5
printf %s "checking for --with-openssl-rpath... " >&6; }

# Check whether --with-openssl-rpath was given.
if test ${with_openssl_rpath+y}
then :
  withval=$with_openssl_rpath;
else case e in #(
  e) with_openssl_rpath=no
 ;;
esac
fi

case $with_openssl_rpath in #(
  auto|yes) :

      OPENSSL_RPATH=auto
            for arg in "$OPENSSL_LDFLAGS"; do
        case $arg in #(
  -L*) :
    OPENSSL_LDFLAGS_RPATH="$OPENSSL_LDFLAGS_RPATH ${rpath_arg}$(echo $arg | cut -c3-)"
         ;; #(
  *) :
     ;;
esac
      done
     ;; #(
  no) :
    OPENSSL_RPATH= ;; #(
  *) :
    if test -d "$with_openssl_rpath"
then :

          OPENSSL_RPATH="$with_openssl_rpath"
          OPENSSL_LDFLAGS_RPATH="${rpath_arg}$with_openssl_rpath"

else case e in #(
  e) as_fn_error $? "--with-openssl-rpath \"$with_openssl_rpath\" is not a directory" "$LINENO" 5 ;;
esac
fi

 ;;
esac
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OPENSSL_RPATH" >&5
printf "%s\n" "$OPENSSL_RPATH" >&6; }

# This static linking is NOT OFFICIALLY SUPPORTED and not advertised.
# Requires static OpenSSL build with position-independent code. Some features
# like DSO engines or external OSSL providers don't work. Only tested with GCC
# and clang on X86_64.
if test "x$PY_UNSUPPORTED_OPENSSL_BUILD" = xstatic
then :

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for unsupported static openssl build" >&5
printf %s "checking for unsupported static openssl build... " >&6; }
  new_OPENSSL_LIBS=
  for arg in $OPENSSL_LIBS; do
    case $arg in #(
  -l*) :

        libname=$(echo $arg | cut -c3-)
        new_OPENSSL_LIBS="$new_OPENSSL_LIBS -l:lib${libname}.a -Wl,--exclude-libs,lib${libname}.a"
       ;; #(
  *) :
    new_OPENSSL_LIBS="$new_OPENSSL_LIBS $arg"
     ;;
esac
  done
    OPENSSL_LIBS="$new_OPENSSL_LIBS $ZLIB_LIBS"
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OPENSSL_LIBS" >&5
printf "%s\n" "$OPENSSL_LIBS" >&6; }

fi

LIBCRYPTO_LIBS=
for arg in $OPENSSL_LIBS; do
  case $arg in #(
  -l*ssl*|-Wl*ssl*) :
     ;; #(
  *) :
    LIBCRYPTO_LIBS="$LIBCRYPTO_LIBS $arg"
   ;;
esac
done

# check if OpenSSL libraries work as expected
save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  LIBS="$LIBS $OPENSSL_LIBS"
  CFLAGS="$CFLAGS $OPENSSL_INCLUDES"
  LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH"

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL provides required ssl module APIs" >&5
printf %s "checking whether OpenSSL provides required ssl module APIs... " >&6; }
if test ${ac_cv_working_openssl_ssl+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <openssl/opensslv.h>
      #include <openssl/ssl.h>
      #if OPENSSL_VERSION_NUMBER < 0x10101000L
        #error "OpenSSL >= 1.1.1 is required"
      #endif
      static void keylog_cb(const SSL *ssl, const char *line) {}

int
main (void)
{

      SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
      SSL_CTX_set_keylog_callback(ctx, keylog_cb);
      SSL *ssl = SSL_new(ctx);
      X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
      X509_VERIFY_PARAM_set1_host(param, "python.org", 0);
      SSL_free(ssl);
      SSL_CTX_free(ctx);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_working_openssl_ssl=yes
else case e in #(
  e) ac_cv_working_openssl_ssl=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_openssl_ssl" >&5
printf "%s\n" "$ac_cv_working_openssl_ssl" >&6; }

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS


  LIBS="$LIBS $LIBCRYPTO_LIBS"
  CFLAGS="$CFLAGS $OPENSSL_INCLUDES"
  LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH"

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL provides required hashlib module APIs" >&5
printf %s "checking whether OpenSSL provides required hashlib module APIs... " >&6; }
if test ${ac_cv_working_openssl_hashlib+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <openssl/opensslv.h>
      #include <openssl/evp.h>
      #if OPENSSL_VERSION_NUMBER < 0x10101000L
        #error "OpenSSL >= 1.1.1 is required"
      #endif

int
main (void)
{

      OBJ_nid2sn(NID_md5);
      OBJ_nid2sn(NID_sha1);
      OBJ_nid2sn(NID_sha512);
      OBJ_nid2sn(NID_sha3_512);
      EVP_PBE_scrypt(NULL, 0, NULL, 0, 2, 8, 1, 0, NULL, 0);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_working_openssl_hashlib=yes
else case e in #(
  e) ac_cv_working_openssl_hashlib=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext
   ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_openssl_hashlib" >&5
printf "%s\n" "$ac_cv_working_openssl_hashlib" >&6; }

CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS



# ssl module default cipher suite string



{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-ssl-default-suites" >&5
printf %s "checking for --with-ssl-default-suites... " >&6; }

# Check whether --with-ssl-default-suites was given.
if test ${with_ssl_default_suites+y}
then :
  withval=$with_ssl_default_suites;
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5
printf "%s\n" "$withval" >&6; }
case "$withval" in
    python)
        printf "%s\n" "#define PY_SSL_DEFAULT_CIPHERS 1" >>confdefs.h

        ;;
    openssl)
        printf "%s\n" "#define PY_SSL_DEFAULT_CIPHERS 2" >>confdefs.h

        ;;
    *)
        printf "%s\n" "#define PY_SSL_DEFAULT_CIPHERS 0" >>confdefs.h

        printf "%s\n" "#define PY_SSL_DEFAULT_CIPHER_STRING \"$withval\"" >>confdefs.h

        ;;
esac

else case e in #(
  e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: python" >&5
printf "%s\n" "python" >&6; }
printf "%s\n" "#define PY_SSL_DEFAULT_CIPHERS 1" >>confdefs.h

 ;;
esac
fi


# builtin hash modules
default_hashlib_hashes="md5,sha1,sha2,sha3,blake2"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-builtin-hashlib-hashes" >&5
printf %s "checking for --with-builtin-hashlib-hashes... " >&6; }

# Check whether --with-builtin-hashlib-hashes was given.
if test ${with_builtin_hashlib_hashes+y}
then :
  withval=$with_builtin_hashlib_hashes;
  case $with_builtin_hashlib_hashes in #(
  yes) :
    with_builtin_hashlib_hashes=$default_hashlib_hashes ;; #(
  no) :
    with_builtin_hashlib_hashes=""
   ;; #(
  *) :
     ;;
esac

else case e in #(
  e) with_builtin_hashlib_hashes=$default_hashlib_hashes ;;
esac
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_builtin_hashlib_hashes" >&5
printf "%s\n" "$with_builtin_hashlib_hashes" >&6; }

printf "%s\n" "#define PY_BUILTIN_HASHLIB_HASHES \"$with_builtin_hashlib_hashes\"" >>confdefs.h


as_save_IFS=$IFS
IFS=,
for builtin_hash in $with_builtin_hashlib_hashes; do
    case $builtin_hash in #(
  md5) :
    with_builtin_md5=yes ;; #(
  sha1) :
    with_builtin_sha1=yes ;; #(
  sha2) :
    with_builtin_sha2=yes ;; #(
  sha3) :
    with_builtin_sha3=yes ;; #(
  blake2) :
    with_builtin_blake2=yes
     ;; #(
  *) :
     ;;
esac
done
IFS=$as_save_IFS

# Check whether to disable test modules. Once set, setup.py will not build
# test extension modules and "make install" will not install test suites.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --disable-test-modules" >&5
printf %s "checking for --disable-test-modules... " >&6; }
# Check whether --enable-test-modules was given.
if test ${enable_test_modules+y}
then :
  enableval=$enable_test_modules;
  if test "x$enable_test_modules" = xyes
then :
  TEST_MODULES=yes
else case e in #(
  e) TEST_MODULES=no ;;
esac
fi

else case e in #(
  e) TEST_MODULES=yes ;;
esac
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TEST_MODULES" >&5
printf "%s\n" "$TEST_MODULES" >&6; }
if test "$ac_sys_system" = "iOS" && test -z "$PYTHONFRAMEWORK"
then :
  if test "$TEST_MODULES" != "no"
then :
  as_fn_error $? "iOS non-framework builds must use --disable-test-modules" "$LINENO" 5
fi
fi


# Check for --with-build-details-suffix
BUILD_DETAILS=build-details.json

# Check whether --with-build-details-suffix was given.
if test ${with_build_details_suffix+y}
then :
  withval=$with_build_details_suffix;
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-build-details-suffix" >&5
printf %s "checking for --with-build-details-suffix... " >&6; }
    if test "x$with_build_details_suffix" = xno
then :
  as_fn_error $? "invalid --with-build-details-suffix option: expected custom suffix or \"yes\", not \"no\"" "$LINENO" 5

fi
    if test "x$with_build_details_suffix" = xyes
then :

        colocated_install=yes
        threading_suffix=""
        if [ "$ABI_THREAD" = "t" ]; then
          threading_suffix=-free-threading
        fi
        debug_suffix=""
        if [ "$Py_DEBUG" = "true" ]; then
          debug_suffix=-debug
        fi
        BUILD_DETAILS=build-details.$MULTIARCH$threading_suffix$debug_suffix.json

else case e in #(
  e)
        BUILD_DETAILS=build-details.$with_build_details_suffix.json

     ;;
esac
fi


fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_build_details_suffix" >&5
printf "%s\n" "$with_build_details_suffix" >&6; }
BUILD_DETAILS=$BUILD_DETAILS


# gh-109054: Check if -latomic is needed to get <pyatomic.h> atomic functions.
# On Linux aarch64, GCC may require programs and libraries to be linked
# explicitly to libatomic. Call _Py_atomic_or_uint64() which may require
# libatomic __atomic_fetch_or_8(), or not, depending on the C compiler and the
# compiler flags.
#
# gh-112779: On RISC-V, GCC 12 and earlier require libatomic support for 1-byte
# and 2-byte operations, but not for 8-byte operations.
#
# Avoid #include <Python.h> or #include <pyport.h>. The <Python.h> header
# requires <pyconfig.h> header which is only written below by AC_OUTPUT below.
# If the check is done after AC_OUTPUT, modifying LIBS has no effect
# anymore.  <pyport.h> cannot be included alone, it's designed to be included
# by <Python.h>: it expects other includes and macros to be defined.
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="${BASECPPFLAGS} -I. -I${srcdir}/Include ${CPPFLAGS}"

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libatomic is needed by <pyatomic.h>" >&5
printf %s "checking whether libatomic is needed by <pyatomic.h>... " >&6; }
if test ${ac_cv_libatomic_needed+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

// pyatomic.h needs uint64_t and Py_ssize_t types
#include <stdint.h>  // int64_t, intptr_t
#ifdef HAVE_SYS_TYPES_H
#  include <sys/types.h> // ssize_t
#endif
// Code adapted from Include/pyport.h
#if HAVE_SSIZE_T
typedef ssize_t Py_ssize_t;
#elif SIZEOF_VOID_P == SIZEOF_SIZE_T
typedef intptr_t Py_ssize_t;
#else
#  error "unable to define Py_ssize_t"
#endif

#include "pyatomic.h"

int main()
{
    uint64_t value;
    _Py_atomic_store_uint64(&value, 2);
    if (_Py_atomic_or_uint64(&value, 8) != 2) {
        return 1; // error
    }
    if (_Py_atomic_load_uint64(&value) != 10) {
        return 1; // error
    }
    uint8_t byte = 0xb8;
    if (_Py_atomic_or_uint8(&byte, 0x2d) != 0xb8) {
        return 1; // error
    }
    if (_Py_atomic_load_uint8(&byte) != 0xbd) {
        return 1; // error
    }
    return 0; // all good
}

_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
  ac_cv_libatomic_needed=no
else case e in #(
  e)   ac_cv_libatomic_needed=yes ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
    conftest$ac_exeext conftest.$ac_ext  ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libatomic_needed" >&5
printf "%s\n" "$ac_cv_libatomic_needed" >&6; }

if test "x$ac_cv_libatomic_needed" = xyes
then :
  LIBS="${LIBS} -latomic"
           LIBATOMIC=${LIBATOMIC-"-latomic"}
fi
CPPFLAGS=$save_CPPFLAGS


# gh-59705: Maximum length in bytes of a thread name
case "$ac_sys_system" in
  Linux*) _PYTHREAD_NAME_MAXLEN=15;;  # Linux and Android
  SunOS*) _PYTHREAD_NAME_MAXLEN=31;;
  NetBSD*) _PYTHREAD_NAME_MAXLEN=15;; # gh-131268
  Darwin) _PYTHREAD_NAME_MAXLEN=63;;
  iOS) _PYTHREAD_NAME_MAXLEN=63;;
  FreeBSD*) _PYTHREAD_NAME_MAXLEN=19;; # gh-131268
  OpenBSD*) _PYTHREAD_NAME_MAXLEN=23;; # gh-131268
  CYGWIN*) _PYTHREAD_NAME_MAXLEN=16;;
  *) _PYTHREAD_NAME_MAXLEN=;;
esac
if test -n "$_PYTHREAD_NAME_MAXLEN"; then

printf "%s\n" "#define _PYTHREAD_NAME_MAXLEN $_PYTHREAD_NAME_MAXLEN" >>confdefs.h

fi



# stdlib


# stdlib not available
case $ac_sys_system in #(
  AIX) :


    py_cv_module__scproxy=n/a
 ;; #(
  VxWorks*) :


    py_cv_module__scproxy=n/a
    py_cv_module_termios=n/a
    py_cv_module_grp=n/a
 ;; #(
    Darwin) :
     ;; #(
  iOS) :



    py_cv_module__curses=n/a
    py_cv_module__curses_panel=n/a
    py_cv_module__gdbm=n/a
    py_cv_module__multiprocessing=n/a
    py_cv_module__posixshmem=n/a
    py_cv_module__posixsubprocess=n/a
    py_cv_module__scproxy=n/a
    py_cv_module__tkinter=n/a
    py_cv_module_grp=n/a
    py_cv_module_nis=n/a
    py_cv_module_readline=n/a
    py_cv_module_pwd=n/a
    py_cv_module_spwd=n/a
    py_cv_module_syslog=n/a
    py_cv_module_=n/a

   ;; #(
  CYGWIN*) :


    py_cv_module__scproxy=n/a
 ;; #(
  QNX*) :


    py_cv_module__scproxy=n/a
 ;; #(
  FreeBSD*) :


    py_cv_module__scproxy=n/a
 ;; #(
  Emscripten) :



    py_cv_module__curses=n/a
    py_cv_module__curses_panel=n/a
    py_cv_module__dbm=n/a
    py_cv_module__gdbm=n/a
    py_cv_module__multiprocessing=n/a
    py_cv_module__posixshmem=n/a
    py_cv_module__posixsubprocess=n/a
    py_cv_module__scproxy=n/a
    py_cv_module__tkinter=n/a
    py_cv_module__interpreters=n/a
    py_cv_module__interpchannels=n/a
    py_cv_module__interpqueues=n/a
    py_cv_module_grp=n/a
    py_cv_module_pwd=n/a
    py_cv_module_resource=n/a
    py_cv_module_syslog=n/a
    py_cv_module_=n/a



    py_cv_module_readline=n/a
    py_cv_module_=n/a

   ;; #(
  WASI) :



    py_cv_module__curses=n/a
    py_cv_module__curses_panel=n/a
    py_cv_module__dbm=n/a
    py_cv_module__gdbm=n/a
    py_cv_module__multiprocessing=n/a
    py_cv_module__posixshmem=n/a
    py_cv_module__posixsubprocess=n/a
    py_cv_module__scproxy=n/a
    py_cv_module__tkinter=n/a
    py_cv_module__interpreters=n/a
    py_cv_module__interpchannels=n/a
    py_cv_module__interpqueues=n/a
    py_cv_module_grp=n/a
    py_cv_module_pwd=n/a
    py_cv_module_resource=n/a
    py_cv_module_syslog=n/a
    py_cv_module_=n/a



    py_cv_module__ctypes_test=n/a
    py_cv_module__remote_debugging=n/a
    py_cv_module__testimportmultiple=n/a
    py_cv_module__testmultiphase=n/a
    py_cv_module__testsinglephase=n/a
    py_cv_module_fcntl=n/a
    py_cv_module_mmap=n/a
    py_cv_module_termios=n/a
    py_cv_module_xxlimited=n/a
    py_cv_module_xxlimited_35=n/a
    py_cv_module_xxlimited_3_13=n/a
    py_cv_module_=n/a

   ;; #(
  *) :


    py_cv_module__scproxy=n/a

 ;;
esac


case $host_cpu in #(
  wasm32|wasm64) :
    MODULE_BUILDTYPE=static ;; #(
  *) :
    MODULE_BUILDTYPE=${MODULE_BUILDTYPE:-shared}
 ;;
esac


if test "$ac_sys_system" = "iOS" && test -z "$PYTHONFRAMEWORK"
then :
  if test "$MODULE_BUILDTYPE" != "static"
then :
  as_fn_error $? "iOS non-framework builds must use MODULE_BUILDTYPE=static" "$LINENO" 5
fi
fi


MODULE_BLOCK=






        if test "$py_cv_module__io" != "n/a"
then :
  py_cv_module__io=yes
fi
   if test "$py_cv_module__io" = yes; then
  MODULE__IO_TRUE=
  MODULE__IO_FALSE='#'
else
  MODULE__IO_TRUE='#'
  MODULE__IO_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__IO_STATE=$py_cv_module__io$as_nl"
  if test "x$py_cv_module__io" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__IO_CFLAGS=-I\$(srcdir)/Modules/_io$as_nl"


fi


        if test "$py_cv_module_time" != "n/a"
then :
  py_cv_module_time=yes
fi
   if test "$py_cv_module_time" = yes; then
  MODULE_TIME_TRUE=
  MODULE_TIME_FALSE='#'
else
  MODULE_TIME_TRUE='#'
  MODULE_TIME_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE_TIME_STATE=$py_cv_module_time$as_nl"
  if test "x$py_cv_module_time" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE_TIME_LDFLAGS=$TIMEMODULE_LIB$as_nl"

fi



        if test "$py_cv_module_array" != "n/a"
then :
  py_cv_module_array=yes
fi
   if test "$py_cv_module_array" = yes; then
  MODULE_ARRAY_TRUE=
  MODULE_ARRAY_FALSE='#'
else
  MODULE_ARRAY_TRUE='#'
  MODULE_ARRAY_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE_ARRAY_STATE=$py_cv_module_array$as_nl"
  if test "x$py_cv_module_array" = xyes
then :




fi


        if test "$py_cv_module__math_integer" != "n/a"
then :
  py_cv_module__math_integer=yes
fi
   if test "$py_cv_module__math_integer" = yes; then
  MODULE__MATH_INTEGER_TRUE=
  MODULE__MATH_INTEGER_FALSE='#'
else
  MODULE__MATH_INTEGER_TRUE='#'
  MODULE__MATH_INTEGER_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__MATH_INTEGER_STATE=$py_cv_module__math_integer$as_nl"
  if test "x$py_cv_module__math_integer" = xyes
then :




fi


        if test "$py_cv_module__asyncio" != "n/a"
then :
  py_cv_module__asyncio=yes
fi
   if test "$py_cv_module__asyncio" = yes; then
  MODULE__ASYNCIO_TRUE=
  MODULE__ASYNCIO_FALSE='#'
else
  MODULE__ASYNCIO_TRUE='#'
  MODULE__ASYNCIO_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__ASYNCIO_STATE=$py_cv_module__asyncio$as_nl"
  if test "x$py_cv_module__asyncio" = xyes
then :




fi


        if test "$py_cv_module__bisect" != "n/a"
then :
  py_cv_module__bisect=yes
fi
   if test "$py_cv_module__bisect" = yes; then
  MODULE__BISECT_TRUE=
  MODULE__BISECT_FALSE='#'
else
  MODULE__BISECT_TRUE='#'
  MODULE__BISECT_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__BISECT_STATE=$py_cv_module__bisect$as_nl"
  if test "x$py_cv_module__bisect" = xyes
then :




fi


        if test "$py_cv_module__csv" != "n/a"
then :
  py_cv_module__csv=yes
fi
   if test "$py_cv_module__csv" = yes; then
  MODULE__CSV_TRUE=
  MODULE__CSV_FALSE='#'
else
  MODULE__CSV_TRUE='#'
  MODULE__CSV_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__CSV_STATE=$py_cv_module__csv$as_nl"
  if test "x$py_cv_module__csv" = xyes
then :




fi


        if test "$py_cv_module__heapq" != "n/a"
then :
  py_cv_module__heapq=yes
fi
   if test "$py_cv_module__heapq" = yes; then
  MODULE__HEAPQ_TRUE=
  MODULE__HEAPQ_FALSE='#'
else
  MODULE__HEAPQ_TRUE='#'
  MODULE__HEAPQ_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__HEAPQ_STATE=$py_cv_module__heapq$as_nl"
  if test "x$py_cv_module__heapq" = xyes
then :




fi


        if test "$py_cv_module__json" != "n/a"
then :
  py_cv_module__json=yes
fi
   if test "$py_cv_module__json" = yes; then
  MODULE__JSON_TRUE=
  MODULE__JSON_FALSE='#'
else
  MODULE__JSON_TRUE='#'
  MODULE__JSON_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__JSON_STATE=$py_cv_module__json$as_nl"
  if test "x$py_cv_module__json" = xyes
then :




fi


        if test "$py_cv_module__lsprof" != "n/a"
then :
  py_cv_module__lsprof=yes
fi
   if test "$py_cv_module__lsprof" = yes; then
  MODULE__LSPROF_TRUE=
  MODULE__LSPROF_FALSE='#'
else
  MODULE__LSPROF_TRUE='#'
  MODULE__LSPROF_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__LSPROF_STATE=$py_cv_module__lsprof$as_nl"
  if test "x$py_cv_module__lsprof" = xyes
then :




fi


        if test "$py_cv_module__pickle" != "n/a"
then :
  py_cv_module__pickle=yes
fi
   if test "$py_cv_module__pickle" = yes; then
  MODULE__PICKLE_TRUE=
  MODULE__PICKLE_FALSE='#'
else
  MODULE__PICKLE_TRUE='#'
  MODULE__PICKLE_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__PICKLE_STATE=$py_cv_module__pickle$as_nl"
  if test "x$py_cv_module__pickle" = xyes
then :




fi


        if test "$py_cv_module__posixsubprocess" != "n/a"
then :
  py_cv_module__posixsubprocess=yes
fi
   if test "$py_cv_module__posixsubprocess" = yes; then
  MODULE__POSIXSUBPROCESS_TRUE=
  MODULE__POSIXSUBPROCESS_FALSE='#'
else
  MODULE__POSIXSUBPROCESS_TRUE='#'
  MODULE__POSIXSUBPROCESS_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__POSIXSUBPROCESS_STATE=$py_cv_module__posixsubprocess$as_nl"
  if test "x$py_cv_module__posixsubprocess" = xyes
then :




fi


        if test "$py_cv_module__queue" != "n/a"
then :
  py_cv_module__queue=yes
fi
   if test "$py_cv_module__queue" = yes; then
  MODULE__QUEUE_TRUE=
  MODULE__QUEUE_FALSE='#'
else
  MODULE__QUEUE_TRUE='#'
  MODULE__QUEUE_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__QUEUE_STATE=$py_cv_module__queue$as_nl"
  if test "x$py_cv_module__queue" = xyes
then :




fi


        if test "$py_cv_module__random" != "n/a"
then :
  py_cv_module__random=yes
fi
   if test "$py_cv_module__random" = yes; then
  MODULE__RANDOM_TRUE=
  MODULE__RANDOM_FALSE='#'
else
  MODULE__RANDOM_TRUE='#'
  MODULE__RANDOM_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__RANDOM_STATE=$py_cv_module__random$as_nl"
  if test "x$py_cv_module__random" = xyes
then :




fi


        if test "$py_cv_module__remote_debugging" != "n/a"
then :
  py_cv_module__remote_debugging=yes
fi
   if test "$py_cv_module__remote_debugging" = yes; then
  MODULE__REMOTE_DEBUGGING_TRUE=
  MODULE__REMOTE_DEBUGGING_FALSE='#'
else
  MODULE__REMOTE_DEBUGGING_TRUE='#'
  MODULE__REMOTE_DEBUGGING_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__REMOTE_DEBUGGING_STATE=$py_cv_module__remote_debugging$as_nl"
  if test "x$py_cv_module__remote_debugging" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__REMOTE_DEBUGGING_CFLAGS=$REMOTE_DEBUGGING_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__REMOTE_DEBUGGING_LDFLAGS=$REMOTE_DEBUGGING_LIBS$as_nl"

fi


        if test "$py_cv_module_select" != "n/a"
then :
  py_cv_module_select=yes
fi
   if test "$py_cv_module_select" = yes; then
  MODULE_SELECT_TRUE=
  MODULE_SELECT_FALSE='#'
else
  MODULE_SELECT_TRUE='#'
  MODULE_SELECT_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE_SELECT_STATE=$py_cv_module_select$as_nl"
  if test "x$py_cv_module_select" = xyes
then :




fi


        if test "$py_cv_module__struct" != "n/a"
then :
  py_cv_module__struct=yes
fi
   if test "$py_cv_module__struct" = yes; then
  MODULE__STRUCT_TRUE=
  MODULE__STRUCT_FALSE='#'
else
  MODULE__STRUCT_TRUE='#'
  MODULE__STRUCT_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__STRUCT_STATE=$py_cv_module__struct$as_nl"
  if test "x$py_cv_module__struct" = xyes
then :




fi


        if test "$py_cv_module__types" != "n/a"
then :
  py_cv_module__types=yes
fi
   if test "$py_cv_module__types" = yes; then
  MODULE__TYPES_TRUE=
  MODULE__TYPES_FALSE='#'
else
  MODULE__TYPES_TRUE='#'
  MODULE__TYPES_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__TYPES_STATE=$py_cv_module__types$as_nl"
  if test "x$py_cv_module__types" = xyes
then :




fi


        if test "$py_cv_module__typing" != "n/a"
then :
  py_cv_module__typing=yes
fi
   if test "$py_cv_module__typing" = yes; then
  MODULE__TYPING_TRUE=
  MODULE__TYPING_FALSE='#'
else
  MODULE__TYPING_TRUE='#'
  MODULE__TYPING_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__TYPING_STATE=$py_cv_module__typing$as_nl"
  if test "x$py_cv_module__typing" = xyes
then :




fi


        if test "$py_cv_module__interpreters" != "n/a"
then :
  py_cv_module__interpreters=yes
fi
   if test "$py_cv_module__interpreters" = yes; then
  MODULE__INTERPRETERS_TRUE=
  MODULE__INTERPRETERS_FALSE='#'
else
  MODULE__INTERPRETERS_TRUE='#'
  MODULE__INTERPRETERS_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__INTERPRETERS_STATE=$py_cv_module__interpreters$as_nl"
  if test "x$py_cv_module__interpreters" = xyes
then :




fi


        if test "$py_cv_module__interpchannels" != "n/a"
then :
  py_cv_module__interpchannels=yes
fi
   if test "$py_cv_module__interpchannels" = yes; then
  MODULE__INTERPCHANNELS_TRUE=
  MODULE__INTERPCHANNELS_FALSE='#'
else
  MODULE__INTERPCHANNELS_TRUE='#'
  MODULE__INTERPCHANNELS_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__INTERPCHANNELS_STATE=$py_cv_module__interpchannels$as_nl"
  if test "x$py_cv_module__interpchannels" = xyes
then :




fi


        if test "$py_cv_module__interpqueues" != "n/a"
then :
  py_cv_module__interpqueues=yes
fi
   if test "$py_cv_module__interpqueues" = yes; then
  MODULE__INTERPQUEUES_TRUE=
  MODULE__INTERPQUEUES_FALSE='#'
else
  MODULE__INTERPQUEUES_TRUE='#'
  MODULE__INTERPQUEUES_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__INTERPQUEUES_STATE=$py_cv_module__interpqueues$as_nl"
  if test "x$py_cv_module__interpqueues" = xyes
then :




fi


        if test "$py_cv_module__zoneinfo" != "n/a"
then :
  py_cv_module__zoneinfo=yes
fi
   if test "$py_cv_module__zoneinfo" = yes; then
  MODULE__ZONEINFO_TRUE=
  MODULE__ZONEINFO_FALSE='#'
else
  MODULE__ZONEINFO_TRUE='#'
  MODULE__ZONEINFO_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__ZONEINFO_STATE=$py_cv_module__zoneinfo$as_nl"
  if test "x$py_cv_module__zoneinfo" = xyes
then :




fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _multiprocessing" >&5
printf %s "checking for stdlib extension module _multiprocessing... " >&6; }
        if test "$py_cv_module__multiprocessing" != "n/a"
then :

    if true
then :
  if test "$ac_cv_func_sem_unlink" = "yes"
then :
  py_cv_module__multiprocessing=yes
else case e in #(
  e) py_cv_module__multiprocessing=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__multiprocessing=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__MULTIPROCESSING_STATE=$py_cv_module__multiprocessing$as_nl"
  if test "x$py_cv_module__multiprocessing" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__MULTIPROCESSING_CFLAGS=-I\$(srcdir)/Modules/_multiprocessing$as_nl"


fi
   if test "$py_cv_module__multiprocessing" = yes; then
  MODULE__MULTIPROCESSING_TRUE=
  MODULE__MULTIPROCESSING_FALSE='#'
else
  MODULE__MULTIPROCESSING_TRUE='#'
  MODULE__MULTIPROCESSING_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__multiprocessing" >&5
printf "%s\n" "$py_cv_module__multiprocessing" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _posixshmem" >&5
printf %s "checking for stdlib extension module _posixshmem... " >&6; }
        if test "$py_cv_module__posixshmem" != "n/a"
then :

    if true
then :
  if test "$have_posix_shmem" = "yes"
then :
  py_cv_module__posixshmem=yes
else case e in #(
  e) py_cv_module__posixshmem=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__posixshmem=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__POSIXSHMEM_STATE=$py_cv_module__posixshmem$as_nl"
  if test "x$py_cv_module__posixshmem" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__POSIXSHMEM_CFLAGS=$POSIXSHMEM_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__POSIXSHMEM_LDFLAGS=$POSIXSHMEM_LIBS$as_nl"

fi
   if test "$py_cv_module__posixshmem" = yes; then
  MODULE__POSIXSHMEM_TRUE=
  MODULE__POSIXSHMEM_FALSE='#'
else
  MODULE__POSIXSHMEM_TRUE='#'
  MODULE__POSIXSHMEM_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__posixshmem" >&5
printf "%s\n" "$py_cv_module__posixshmem" >&6; }



        if test "$py_cv_module__statistics" != "n/a"
then :
  py_cv_module__statistics=yes
fi
   if test "$py_cv_module__statistics" = yes; then
  MODULE__STATISTICS_TRUE=
  MODULE__STATISTICS_FALSE='#'
else
  MODULE__STATISTICS_TRUE='#'
  MODULE__STATISTICS_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__STATISTICS_STATE=$py_cv_module__statistics$as_nl"
  if test "x$py_cv_module__statistics" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE__STATISTICS_LDFLAGS=$LIBM$as_nl"

fi


        if test "$py_cv_module_cmath" != "n/a"
then :
  py_cv_module_cmath=yes
fi
   if test "$py_cv_module_cmath" = yes; then
  MODULE_CMATH_TRUE=
  MODULE_CMATH_FALSE='#'
else
  MODULE_CMATH_TRUE='#'
  MODULE_CMATH_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE_CMATH_STATE=$py_cv_module_cmath$as_nl"
  if test "x$py_cv_module_cmath" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE_CMATH_LDFLAGS=$LIBM$as_nl"

fi


        if test "$py_cv_module_math" != "n/a"
then :
  py_cv_module_math=yes
fi
   if test "$py_cv_module_math" = yes; then
  MODULE_MATH_TRUE=
  MODULE_MATH_FALSE='#'
else
  MODULE_MATH_TRUE='#'
  MODULE_MATH_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE_MATH_STATE=$py_cv_module_math$as_nl"
  if test "x$py_cv_module_math" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE_MATH_LDFLAGS=$LIBM$as_nl"

fi



        if test "$py_cv_module__datetime" != "n/a"
then :
  py_cv_module__datetime=yes
fi
   if test "$py_cv_module__datetime" = yes; then
  MODULE__DATETIME_TRUE=
  MODULE__DATETIME_FALSE='#'
else
  MODULE__DATETIME_TRUE='#'
  MODULE__DATETIME_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__DATETIME_STATE=$py_cv_module__datetime$as_nl"
  if test "x$py_cv_module__datetime" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE__DATETIME_LDFLAGS=$TIMEMODULE_LIB $LIBM$as_nl"

fi



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module fcntl" >&5
printf %s "checking for stdlib extension module fcntl... " >&6; }
        if test "$py_cv_module_fcntl" != "n/a"
then :

    if true
then :
  if test "$ac_cv_header_sys_ioctl_h" = "yes" -a "$ac_cv_header_fcntl_h" = "yes"
then :
  py_cv_module_fcntl=yes
else case e in #(
  e) py_cv_module_fcntl=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_fcntl=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_FCNTL_STATE=$py_cv_module_fcntl$as_nl"
  if test "x$py_cv_module_fcntl" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE_FCNTL_LDFLAGS=$FCNTL_LIBS$as_nl"

fi
   if test "$py_cv_module_fcntl" = yes; then
  MODULE_FCNTL_TRUE=
  MODULE_FCNTL_FALSE='#'
else
  MODULE_FCNTL_TRUE='#'
  MODULE_FCNTL_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_fcntl" >&5
printf "%s\n" "$py_cv_module_fcntl" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module mmap" >&5
printf %s "checking for stdlib extension module mmap... " >&6; }
        if test "$py_cv_module_mmap" != "n/a"
then :

    if true
then :
  if test "$ac_cv_header_sys_mman_h" = "yes" -a "$ac_cv_header_sys_stat_h" = "yes"
then :
  py_cv_module_mmap=yes
else case e in #(
  e) py_cv_module_mmap=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_mmap=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_MMAP_STATE=$py_cv_module_mmap$as_nl"
  if test "x$py_cv_module_mmap" = xyes
then :




fi
   if test "$py_cv_module_mmap" = yes; then
  MODULE_MMAP_TRUE=
  MODULE_MMAP_FALSE='#'
else
  MODULE_MMAP_TRUE='#'
  MODULE_MMAP_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_mmap" >&5
printf "%s\n" "$py_cv_module_mmap" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _socket" >&5
printf %s "checking for stdlib extension module _socket... " >&6; }
        if test "$py_cv_module__socket" != "n/a"
then :

    if true
then :
  if test "$ac_cv_header_sys_socket_h" = "yes"                     -a "$ac_cv_header_sys_types_h" = "yes"                     -a "$ac_cv_header_netinet_in_h" = "yes"
then :
  py_cv_module__socket=yes
else case e in #(
  e) py_cv_module__socket=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__socket=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__SOCKET_STATE=$py_cv_module__socket$as_nl"
  if test "x$py_cv_module__socket" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE__SOCKET_LDFLAGS=$SOCKET_LIBS$as_nl"

fi
   if test "$py_cv_module__socket" = yes; then
  MODULE__SOCKET_TRUE=
  MODULE__SOCKET_FALSE='#'
else
  MODULE__SOCKET_TRUE='#'
  MODULE__SOCKET_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__socket" >&5
printf "%s\n" "$py_cv_module__socket" >&6; }



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module grp" >&5
printf %s "checking for stdlib extension module grp... " >&6; }
        if test "$py_cv_module_grp" != "n/a"
then :

    if true
then :
  if test "$ac_cv_func_getgrent" = "yes" &&
   { test "$ac_cv_func_getgrgid" = "yes" || test "$ac_cv_func_getgrgid_r" = "yes"; }
then :
  py_cv_module_grp=yes
else case e in #(
  e) py_cv_module_grp=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_grp=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_GRP_STATE=$py_cv_module_grp$as_nl"
  if test "x$py_cv_module_grp" = xyes
then :




fi
   if test "$py_cv_module_grp" = yes; then
  MODULE_GRP_TRUE=
  MODULE_GRP_FALSE='#'
else
  MODULE_GRP_TRUE='#'
  MODULE_GRP_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_grp" >&5
printf "%s\n" "$py_cv_module_grp" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module pwd" >&5
printf %s "checking for stdlib extension module pwd... " >&6; }
        if test "$py_cv_module_pwd" != "n/a"
then :

    if true
then :
  if test "$ac_cv_func_getpwuid" = yes -o "$ac_cv_func_getpwuid_r" = yes
then :
  py_cv_module_pwd=yes
else case e in #(
  e) py_cv_module_pwd=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_pwd=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_PWD_STATE=$py_cv_module_pwd$as_nl"
  if test "x$py_cv_module_pwd" = xyes
then :




fi
   if test "$py_cv_module_pwd" = yes; then
  MODULE_PWD_TRUE=
  MODULE_PWD_FALSE='#'
else
  MODULE_PWD_TRUE='#'
  MODULE_PWD_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_pwd" >&5
printf "%s\n" "$py_cv_module_pwd" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module resource" >&5
printf %s "checking for stdlib extension module resource... " >&6; }
        if test "$py_cv_module_resource" != "n/a"
then :

    if true
then :
  if test "$ac_cv_header_sys_resource_h" = yes
then :
  py_cv_module_resource=yes
else case e in #(
  e) py_cv_module_resource=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_resource=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_RESOURCE_STATE=$py_cv_module_resource$as_nl"
  if test "x$py_cv_module_resource" = xyes
then :




fi
   if test "$py_cv_module_resource" = yes; then
  MODULE_RESOURCE_TRUE=
  MODULE_RESOURCE_FALSE='#'
else
  MODULE_RESOURCE_TRUE='#'
  MODULE_RESOURCE_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_resource" >&5
printf "%s\n" "$py_cv_module_resource" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _scproxy" >&5
printf %s "checking for stdlib extension module _scproxy... " >&6; }
        if test "$py_cv_module__scproxy" != "n/a"
then :

    if test "$ac_sys_system" = "Darwin"
then :
  if true
then :
  py_cv_module__scproxy=yes
else case e in #(
  e) py_cv_module__scproxy=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__scproxy=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__SCPROXY_STATE=$py_cv_module__scproxy$as_nl"
  if test "x$py_cv_module__scproxy" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE__SCPROXY_LDFLAGS=-framework SystemConfiguration -framework CoreFoundation$as_nl"

fi
   if test "$py_cv_module__scproxy" = yes; then
  MODULE__SCPROXY_TRUE=
  MODULE__SCPROXY_FALSE='#'
else
  MODULE__SCPROXY_TRUE='#'
  MODULE__SCPROXY_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__scproxy" >&5
printf "%s\n" "$py_cv_module__scproxy" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module syslog" >&5
printf %s "checking for stdlib extension module syslog... " >&6; }
        if test "$py_cv_module_syslog" != "n/a"
then :

    if true
then :
  if test "$ac_cv_header_syslog_h" = yes
then :
  py_cv_module_syslog=yes
else case e in #(
  e) py_cv_module_syslog=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_syslog=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_SYSLOG_STATE=$py_cv_module_syslog$as_nl"
  if test "x$py_cv_module_syslog" = xyes
then :




fi
   if test "$py_cv_module_syslog" = yes; then
  MODULE_SYSLOG_TRUE=
  MODULE_SYSLOG_FALSE='#'
else
  MODULE_SYSLOG_TRUE='#'
  MODULE_SYSLOG_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_syslog" >&5
printf "%s\n" "$py_cv_module_syslog" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module termios" >&5
printf %s "checking for stdlib extension module termios... " >&6; }
        if test "$py_cv_module_termios" != "n/a"
then :

    if true
then :
  if test "$ac_cv_header_termios_h" = yes
then :
  py_cv_module_termios=yes
else case e in #(
  e) py_cv_module_termios=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_termios=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_TERMIOS_STATE=$py_cv_module_termios$as_nl"
  if test "x$py_cv_module_termios" = xyes
then :




fi
   if test "$py_cv_module_termios" = yes; then
  MODULE_TERMIOS_TRUE=
  MODULE_TERMIOS_FALSE='#'
else
  MODULE_TERMIOS_TRUE='#'
  MODULE_TERMIOS_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_termios" >&5
printf "%s\n" "$py_cv_module_termios" >&6; }



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module pyexpat" >&5
printf %s "checking for stdlib extension module pyexpat... " >&6; }
        if test "$py_cv_module_pyexpat" != "n/a"
then :

    if true
then :
  if test "$ac_cv_header_sys_time_h" = "yes"
then :
  py_cv_module_pyexpat=yes
else case e in #(
  e) py_cv_module_pyexpat=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_pyexpat=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_PYEXPAT_STATE=$py_cv_module_pyexpat$as_nl"
  if test "x$py_cv_module_pyexpat" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE_PYEXPAT_CFLAGS=$LIBEXPAT_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE_PYEXPAT_LDFLAGS=$LIBEXPAT_LDFLAGS$as_nl"

fi
   if test "$py_cv_module_pyexpat" = yes; then
  MODULE_PYEXPAT_TRUE=
  MODULE_PYEXPAT_FALSE='#'
else
  MODULE_PYEXPAT_TRUE='#'
  MODULE_PYEXPAT_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_pyexpat" >&5
printf "%s\n" "$py_cv_module_pyexpat" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _elementtree" >&5
printf %s "checking for stdlib extension module _elementtree... " >&6; }
        if test "$py_cv_module__elementtree" != "n/a"
then :

    if true
then :
  if true
then :
  py_cv_module__elementtree=yes
else case e in #(
  e) py_cv_module__elementtree=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__elementtree=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__ELEMENTTREE_STATE=$py_cv_module__elementtree$as_nl"
  if test "x$py_cv_module__elementtree" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__ELEMENTTREE_CFLAGS=$LIBEXPAT_CFLAGS$as_nl"


fi
   if test "$py_cv_module__elementtree" = yes; then
  MODULE__ELEMENTTREE_TRUE=
  MODULE__ELEMENTTREE_FALSE='#'
else
  MODULE__ELEMENTTREE_TRUE='#'
  MODULE__ELEMENTTREE_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__elementtree" >&5
printf "%s\n" "$py_cv_module__elementtree" >&6; }


        if test "$py_cv_module__codecs_cn" != "n/a"
then :
  py_cv_module__codecs_cn=yes
fi
   if test "$py_cv_module__codecs_cn" = yes; then
  MODULE__CODECS_CN_TRUE=
  MODULE__CODECS_CN_FALSE='#'
else
  MODULE__CODECS_CN_TRUE='#'
  MODULE__CODECS_CN_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__CODECS_CN_STATE=$py_cv_module__codecs_cn$as_nl"
  if test "x$py_cv_module__codecs_cn" = xyes
then :




fi


        if test "$py_cv_module__codecs_hk" != "n/a"
then :
  py_cv_module__codecs_hk=yes
fi
   if test "$py_cv_module__codecs_hk" = yes; then
  MODULE__CODECS_HK_TRUE=
  MODULE__CODECS_HK_FALSE='#'
else
  MODULE__CODECS_HK_TRUE='#'
  MODULE__CODECS_HK_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__CODECS_HK_STATE=$py_cv_module__codecs_hk$as_nl"
  if test "x$py_cv_module__codecs_hk" = xyes
then :




fi


        if test "$py_cv_module__codecs_iso2022" != "n/a"
then :
  py_cv_module__codecs_iso2022=yes
fi
   if test "$py_cv_module__codecs_iso2022" = yes; then
  MODULE__CODECS_ISO2022_TRUE=
  MODULE__CODECS_ISO2022_FALSE='#'
else
  MODULE__CODECS_ISO2022_TRUE='#'
  MODULE__CODECS_ISO2022_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__CODECS_ISO2022_STATE=$py_cv_module__codecs_iso2022$as_nl"
  if test "x$py_cv_module__codecs_iso2022" = xyes
then :




fi


        if test "$py_cv_module__codecs_jp" != "n/a"
then :
  py_cv_module__codecs_jp=yes
fi
   if test "$py_cv_module__codecs_jp" = yes; then
  MODULE__CODECS_JP_TRUE=
  MODULE__CODECS_JP_FALSE='#'
else
  MODULE__CODECS_JP_TRUE='#'
  MODULE__CODECS_JP_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__CODECS_JP_STATE=$py_cv_module__codecs_jp$as_nl"
  if test "x$py_cv_module__codecs_jp" = xyes
then :




fi


        if test "$py_cv_module__codecs_kr" != "n/a"
then :
  py_cv_module__codecs_kr=yes
fi
   if test "$py_cv_module__codecs_kr" = yes; then
  MODULE__CODECS_KR_TRUE=
  MODULE__CODECS_KR_FALSE='#'
else
  MODULE__CODECS_KR_TRUE='#'
  MODULE__CODECS_KR_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__CODECS_KR_STATE=$py_cv_module__codecs_kr$as_nl"
  if test "x$py_cv_module__codecs_kr" = xyes
then :




fi


        if test "$py_cv_module__codecs_tw" != "n/a"
then :
  py_cv_module__codecs_tw=yes
fi
   if test "$py_cv_module__codecs_tw" = yes; then
  MODULE__CODECS_TW_TRUE=
  MODULE__CODECS_TW_FALSE='#'
else
  MODULE__CODECS_TW_TRUE='#'
  MODULE__CODECS_TW_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__CODECS_TW_STATE=$py_cv_module__codecs_tw$as_nl"
  if test "x$py_cv_module__codecs_tw" = xyes
then :




fi


        if test "$py_cv_module__multibytecodec" != "n/a"
then :
  py_cv_module__multibytecodec=yes
fi
   if test "$py_cv_module__multibytecodec" = yes; then
  MODULE__MULTIBYTECODEC_TRUE=
  MODULE__MULTIBYTECODEC_FALSE='#'
else
  MODULE__MULTIBYTECODEC_TRUE='#'
  MODULE__MULTIBYTECODEC_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE__MULTIBYTECODEC_STATE=$py_cv_module__multibytecodec$as_nl"
  if test "x$py_cv_module__multibytecodec" = xyes
then :




fi


        if test "$py_cv_module_unicodedata" != "n/a"
then :
  py_cv_module_unicodedata=yes
fi
   if test "$py_cv_module_unicodedata" = yes; then
  MODULE_UNICODEDATA_TRUE=
  MODULE_UNICODEDATA_FALSE='#'
else
  MODULE_UNICODEDATA_TRUE='#'
  MODULE_UNICODEDATA_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE_UNICODEDATA_STATE=$py_cv_module_unicodedata$as_nl"
  if test "x$py_cv_module_unicodedata" = xyes
then :




fi


###############################################################################
# HACL* compilation and linking configuration (contact: @picnixz)
#
# Used by the HACL*-based implementations of cryptographic primitives.
#
# CPython provides a vendored copy of a subset of the HACL* project used
# to build extension modules of cryptographic primitives. On WASI, HACL*
# sources must be statically linked with the extension modules; on other
# platforms, the extension modules may assume that HACL* has been compiled
# as a shared library.
#
# Example for MD5:
#
#   * Compile Modules/_hacl/Hacl_Hash_MD5.c into Modules/_hacl/Hacl_Hash_MD5.o.
#   * Decide whether the object files are to be passed to the linker (emulate
#     a shared library without having to install it) or if we need to create
#     a static library for WASI. The following summarizes the values taken by
#     the MODULE_<NAME>_LDFLAGS variable depending on the linkage type:
#     - shared: MODULE__MD5_LDFLAGS is set to LIBHACL_MD5_OBJS
#     - static: MODULE__MD5_LDFLAGS is set to Modules/_hacl/libHacl_Hash_MD5.a
#   * Compile Modules/md5module.c into Modules/md5module.o.
#   * Link Modules/md5module.o using $(MODULE__MD5_LDFLAGS)
#     and get Modules/_md5$(EXT_SUFFIX).
#
# LIBHACL_FLAG_I: '-I' flags passed to $(CC) for HACL* and HACL*-based modules
# LIBHACL_FLAG_D: '-D' flags passed to $(CC) for HACL* and HACL*-based modules
# LIBHACL_CFLAGS: compiler flags passed for HACL* and HACL*-based modules
# LIBHACL_LDFLAGS: linker flags passed for HACL* and HACL*-based modules
LIBHACL_FLAG_I='-I$(srcdir)/Modules/_hacl -I$(srcdir)/Modules/_hacl/include'
LIBHACL_FLAG_D='-D_BSD_SOURCE -D_DEFAULT_SOURCE'
case "$ac_sys_system" in
  Linux*)
    if test "$ac_cv_func_explicit_bzero" = "no"; then
      LIBHACL_FLAG_D="${LIBHACL_FLAG_D} -DLINUX_NO_EXPLICIT_BZERO"
    fi
  ;;
esac
LIBHACL_CFLAGS="${LIBHACL_FLAG_I} ${LIBHACL_FLAG_D} \$(PY_STDMODULE_CFLAGS) \$(CCSHARED)"

LIBHACL_LDFLAGS=  # for now, no specific linker flags are needed


if test "$UNIVERSAL_ARCHS" = "universal2" -o \
   \( "$build_cpu" = "aarch64" -a "$build_vendor" = "apple" \)
then
  use_hacl_universal2_impl=yes
else
  use_hacl_universal2_impl=no
fi

# The SIMD files use aligned_alloc, which is not available on older versions of
# Android.
# The *mmintrin.h headers are x86-family-specific, so can't be used on WASI.
if test "$ac_sys_system" != "Linux-android" -a "$ac_sys_system" != "WASI" || \
   { test -n "$ANDROID_API_LEVEL" && test "$ANDROID_API_LEVEL" -ge 28; }
then
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse -msse2 -msse3 -msse4.1 -msse4.2" >&5
printf %s "checking whether C compiler accepts -msse -msse2 -msse3 -msse4.1 -msse4.2... " >&6; }
if test ${ax_cv_check_cflags__Werror__msse__msse2__msse3__msse4_1__msse4_2+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -msse -msse2 -msse3 -msse4.1 -msse4.2"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__msse__msse2__msse3__msse4_1__msse4_2=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__msse__msse2__msse3__msse4_1__msse4_2=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__msse__msse2__msse3__msse4_1__msse4_2" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__msse__msse2__msse3__msse4_1__msse4_2" >&6; }
if test "x$ax_cv_check_cflags__Werror__msse__msse2__msse3__msse4_1__msse4_2" = xyes
then :

    LIBHACL_SIMD128_FLAGS="-msse -msse2 -msse3 -msse4.1 -msse4.2"


printf "%s\n" "#define _Py_HACL_CAN_COMPILE_VEC128 1" >>confdefs.h


    # macOS universal2 builds *support* the -msse etc flags because they're
    # available on x86_64. However, performance of the HACL SIMD128 implementation
    # isn't great, so it's disabled on ARM64.
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HACL* SIMD128 implementation" >&5
printf %s "checking for HACL* SIMD128 implementation... " >&6; }
    if test "$use_hacl_universal2_impl" = "yes"; then
      LIBHACL_BLAKE2_SIMD128_OBJS="Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.o"
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: universal2" >&5
printf "%s\n" "universal2" >&6; }
    else
      LIBHACL_BLAKE2_SIMD128_OBJS="Modules/_hacl/Hacl_Hash_Blake2s_Simd128.o"
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: standard" >&5
printf "%s\n" "standard" >&6; }
    fi


else case e in #(
  e) : ;;
esac
fi

fi



# The SIMD files use aligned_alloc, which is not available on older versions of
# Android.
# The *mmintrin.h headers are x86-family-specific, so can't be used on WASI.
#
# Although AVX support is not guaranteed on Android
# (https://developer.android.com/ndk/guides/abis#86-64), this is safe because we do a
# runtime CPUID check.
if test "$ac_sys_system" != "Linux-android" -a "$ac_sys_system" != "WASI" || \
   { test -n "$ANDROID_API_LEVEL" && test "$ANDROID_API_LEVEL" -ge 28; }
then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mavx2" >&5
printf %s "checking whether C compiler accepts -mavx2... " >&6; }
if test ${ax_cv_check_cflags__Werror__mavx2+y}
then :
  printf %s "(cached) " >&6
else case e in #(
  e)
  ax_check_save_flags=$CFLAGS
  CFLAGS="$CFLAGS -Werror -mavx2"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main (void)
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
  ax_cv_check_cflags__Werror__mavx2=yes
else case e in #(
  e) ax_cv_check_cflags__Werror__mavx2=no ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
  CFLAGS=$ax_check_save_flags ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__mavx2" >&5
printf "%s\n" "$ax_cv_check_cflags__Werror__mavx2" >&6; }
if test "x$ax_cv_check_cflags__Werror__mavx2" = xyes
then :

    LIBHACL_SIMD256_FLAGS="-mavx2"

printf "%s\n" "#define _Py_HACL_CAN_COMPILE_VEC256 1" >>confdefs.h


    # macOS universal2 builds *support* the -mavx2 compiler flag because it's
    # available on x86_64; but the HACL SIMD256 build then fails because the
    # implementation requires symbols that aren't available on ARM64. Use a
    # wrapped implementation if we're building for universal2.
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HACL* SIMD256 implementation" >&5
printf %s "checking for HACL* SIMD256 implementation... " >&6; }
    if test "$use_hacl_universal2_impl" = "yes"; then
      LIBHACL_BLAKE2_SIMD256_OBJS="Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.o"
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: universal2" >&5
printf "%s\n" "universal2" >&6; }
    else
      LIBHACL_BLAKE2_SIMD256_OBJS="Modules/_hacl/Hacl_Hash_Blake2b_Simd256.o"
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: standard" >&5
printf "%s\n" "standard" >&6; }
    fi

else case e in #(
  e) : ;;
esac
fi

fi


### end(HACL* configuration)

###############################################################################
# HACL*-based cryptographic primitives

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HACL* library linking type" >&5
printf %s "checking for HACL* library linking type... " >&6; }
if test "$ac_sys_system" = "WASI" || test "$MODULE_BUILDTYPE" = "static"; then
  LIBHACL_LDEPS_LIBTYPE=STATIC
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: static" >&5
printf "%s\n" "static" >&6; }
else
  LIBHACL_LDEPS_LIBTYPE=SHARED
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: shared" >&5
printf "%s\n" "shared" >&6; }
fi
# Used to complete the "MODULE_<NAME>_LDEPS" Makefile variable.
# The LDEPS variable is a Makefile rule prerequisite.






  LIBHACL_MD5_LDFLAGS=LIBHACL_MD5_LIB_${LIBHACL_LDEPS_LIBTYPE}

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _md5" >&5
printf %s "checking for stdlib extension module _md5... " >&6; }
        if test "$py_cv_module__md5" != "n/a"
then :

    if test "$with_builtin_md5" = yes
then :
  if true
then :
  py_cv_module__md5=yes
else case e in #(
  e) py_cv_module__md5=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__md5=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__MD5_STATE=$py_cv_module__md5$as_nl"
  if test "x$py_cv_module__md5" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__MD5_CFLAGS=$LIBHACL_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__MD5_LDFLAGS=\$($LIBHACL_MD5_LDFLAGS)$as_nl"

fi
   if test "$py_cv_module__md5" = yes; then
  MODULE__MD5_TRUE=
  MODULE__MD5_FALSE='#'
else
  MODULE__MD5_TRUE='#'
  MODULE__MD5_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__md5" >&5
printf "%s\n" "$py_cv_module__md5" >&6; }





  LIBHACL_SHA1_LDFLAGS=LIBHACL_SHA1_LIB_${LIBHACL_LDEPS_LIBTYPE}

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _sha1" >&5
printf %s "checking for stdlib extension module _sha1... " >&6; }
        if test "$py_cv_module__sha1" != "n/a"
then :

    if test "$with_builtin_sha1" = yes
then :
  if true
then :
  py_cv_module__sha1=yes
else case e in #(
  e) py_cv_module__sha1=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__sha1=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__SHA1_STATE=$py_cv_module__sha1$as_nl"
  if test "x$py_cv_module__sha1" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__SHA1_CFLAGS=$LIBHACL_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__SHA1_LDFLAGS=\$($LIBHACL_SHA1_LDFLAGS)$as_nl"

fi
   if test "$py_cv_module__sha1" = yes; then
  MODULE__SHA1_TRUE=
  MODULE__SHA1_FALSE='#'
else
  MODULE__SHA1_TRUE='#'
  MODULE__SHA1_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__sha1" >&5
printf "%s\n" "$py_cv_module__sha1" >&6; }





  LIBHACL_SHA2_LDFLAGS=LIBHACL_SHA2_LIB_${LIBHACL_LDEPS_LIBTYPE}

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _sha2" >&5
printf %s "checking for stdlib extension module _sha2... " >&6; }
        if test "$py_cv_module__sha2" != "n/a"
then :

    if test "$with_builtin_sha2" = yes
then :
  if true
then :
  py_cv_module__sha2=yes
else case e in #(
  e) py_cv_module__sha2=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__sha2=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__SHA2_STATE=$py_cv_module__sha2$as_nl"
  if test "x$py_cv_module__sha2" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__SHA2_CFLAGS=$LIBHACL_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__SHA2_LDFLAGS=\$($LIBHACL_SHA2_LDFLAGS)$as_nl"

fi
   if test "$py_cv_module__sha2" = yes; then
  MODULE__SHA2_TRUE=
  MODULE__SHA2_FALSE='#'
else
  MODULE__SHA2_TRUE='#'
  MODULE__SHA2_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__sha2" >&5
printf "%s\n" "$py_cv_module__sha2" >&6; }





  LIBHACL_SHA3_LDFLAGS=LIBHACL_SHA3_LIB_${LIBHACL_LDEPS_LIBTYPE}

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _sha3" >&5
printf %s "checking for stdlib extension module _sha3... " >&6; }
        if test "$py_cv_module__sha3" != "n/a"
then :

    if test "$with_builtin_sha3" = yes
then :
  if true
then :
  py_cv_module__sha3=yes
else case e in #(
  e) py_cv_module__sha3=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__sha3=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__SHA3_STATE=$py_cv_module__sha3$as_nl"
  if test "x$py_cv_module__sha3" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__SHA3_CFLAGS=$LIBHACL_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__SHA3_LDFLAGS=\$($LIBHACL_SHA3_LDFLAGS)$as_nl"

fi
   if test "$py_cv_module__sha3" = yes; then
  MODULE__SHA3_TRUE=
  MODULE__SHA3_FALSE='#'
else
  MODULE__SHA3_TRUE='#'
  MODULE__SHA3_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__sha3" >&5
printf "%s\n" "$py_cv_module__sha3" >&6; }





  LIBHACL_BLAKE2_LDFLAGS=LIBHACL_BLAKE2_LIB_${LIBHACL_LDEPS_LIBTYPE}

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _blake2" >&5
printf %s "checking for stdlib extension module _blake2... " >&6; }
        if test "$py_cv_module__blake2" != "n/a"
then :

    if test "$with_builtin_blake2" = yes
then :
  if true
then :
  py_cv_module__blake2=yes
else case e in #(
  e) py_cv_module__blake2=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__blake2=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__BLAKE2_STATE=$py_cv_module__blake2$as_nl"
  if test "x$py_cv_module__blake2" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__BLAKE2_CFLAGS=$LIBHACL_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__BLAKE2_LDFLAGS=\$($LIBHACL_BLAKE2_LDFLAGS)$as_nl"

fi
   if test "$py_cv_module__blake2" = yes; then
  MODULE__BLAKE2_TRUE=
  MODULE__BLAKE2_FALSE='#'
else
  MODULE__BLAKE2_TRUE='#'
  MODULE__BLAKE2_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__blake2" >&5
printf "%s\n" "$py_cv_module__blake2" >&6; }






  LIBHACL_HMAC_LDFLAGS=LIBHACL_HMAC_LIB_${LIBHACL_LDEPS_LIBTYPE}

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _hmac" >&5
printf %s "checking for stdlib extension module _hmac... " >&6; }
        if test "$py_cv_module__hmac" != "n/a"
then :

    if test "$ac_sys_system" != "Emscripten"
then :
  if true
then :
  py_cv_module__hmac=yes
else case e in #(
  e) py_cv_module__hmac=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__hmac=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__HMAC_STATE=$py_cv_module__hmac$as_nl"
  if test "x$py_cv_module__hmac" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__HMAC_CFLAGS=$LIBHACL_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__HMAC_LDFLAGS=\$($LIBHACL_HMAC_LDFLAGS)$as_nl"

fi
   if test "$py_cv_module__hmac" = yes; then
  MODULE__HMAC_TRUE=
  MODULE__HMAC_FALSE='#'
else
  MODULE__HMAC_TRUE='#'
  MODULE__HMAC_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__hmac" >&5
printf "%s\n" "$py_cv_module__hmac" >&6; }



### end(cryptographic primitives)


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _ctypes" >&5
printf %s "checking for stdlib extension module _ctypes... " >&6; }
        if test "$py_cv_module__ctypes" != "n/a"
then :

    if true
then :
  if test "$have_libffi" = yes
then :
  py_cv_module__ctypes=yes
else case e in #(
  e) py_cv_module__ctypes=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__ctypes=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__CTYPES_STATE=$py_cv_module__ctypes$as_nl"
  if test "x$py_cv_module__ctypes" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__CTYPES_CFLAGS=$NO_STRICT_OVERFLOW_CFLAGS $LIBFFI_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__CTYPES_LDFLAGS=$LIBFFI_LIBS$as_nl"

fi
   if test "$py_cv_module__ctypes" = yes; then
  MODULE__CTYPES_TRUE=
  MODULE__CTYPES_FALSE='#'
else
  MODULE__CTYPES_TRUE='#'
  MODULE__CTYPES_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__ctypes" >&5
printf "%s\n" "$py_cv_module__ctypes" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _curses" >&5
printf %s "checking for stdlib extension module _curses... " >&6; }
        if test "$py_cv_module__curses" != "n/a"
then :

    if true
then :
  if test "$have_curses" = "yes"
then :
  py_cv_module__curses=yes
else case e in #(
  e) py_cv_module__curses=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__curses=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__CURSES_STATE=$py_cv_module__curses$as_nl"
  if test "x$py_cv_module__curses" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__CURSES_CFLAGS=$CURSES_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__CURSES_LDFLAGS=$CURSES_LIBS
$as_nl"

fi
   if test "$py_cv_module__curses" = yes; then
  MODULE__CURSES_TRUE=
  MODULE__CURSES_FALSE='#'
else
  MODULE__CURSES_TRUE='#'
  MODULE__CURSES_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__curses" >&5
printf "%s\n" "$py_cv_module__curses" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _curses_panel" >&5
printf %s "checking for stdlib extension module _curses_panel... " >&6; }
        if test "$py_cv_module__curses_panel" != "n/a"
then :

    if true
then :
  if test "$have_curses" = "yes" && test "$have_panel" = "yes"
then :
  py_cv_module__curses_panel=yes
else case e in #(
  e) py_cv_module__curses_panel=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__curses_panel=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__CURSES_PANEL_STATE=$py_cv_module__curses_panel$as_nl"
  if test "x$py_cv_module__curses_panel" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__CURSES_PANEL_CFLAGS=$PANEL_CFLAGS $CURSES_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__CURSES_PANEL_LDFLAGS=$PANEL_LIBS $CURSES_LIBS
$as_nl"

fi
   if test "$py_cv_module__curses_panel" = yes; then
  MODULE__CURSES_PANEL_TRUE=
  MODULE__CURSES_PANEL_FALSE='#'
else
  MODULE__CURSES_PANEL_TRUE='#'
  MODULE__CURSES_PANEL_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__curses_panel" >&5
printf "%s\n" "$py_cv_module__curses_panel" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _decimal" >&5
printf %s "checking for stdlib extension module _decimal... " >&6; }
        if test "$py_cv_module__decimal" != "n/a"
then :

    if true
then :
  if test "$have_mpdec" = "yes"
then :
  py_cv_module__decimal=yes
else case e in #(
  e) py_cv_module__decimal=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__decimal=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__DECIMAL_STATE=$py_cv_module__decimal$as_nl"
  if test "x$py_cv_module__decimal" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__DECIMAL_CFLAGS=$LIBMPDEC_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__DECIMAL_LDFLAGS=$LIBMPDEC_LIBS$as_nl"

fi
   if test "$py_cv_module__decimal" = yes; then
  MODULE__DECIMAL_TRUE=
  MODULE__DECIMAL_FALSE='#'
else
  MODULE__DECIMAL_TRUE='#'
  MODULE__DECIMAL_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__decimal" >&5
printf "%s\n" "$py_cv_module__decimal" >&6; }


if test "$have_mpdec" = "no"
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no system libmpdec found; falling back to pure-Python version for the decimal module" >&5
printf "%s\n" "$as_me: WARNING: no system libmpdec found; falling back to pure-Python version for the decimal module" >&2;}
fi


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _dbm" >&5
printf %s "checking for stdlib extension module _dbm... " >&6; }
        if test "$py_cv_module__dbm" != "n/a"
then :

    if test -n "$with_dbmliborder"
then :
  if test "$have_dbm" != "no"
then :
  py_cv_module__dbm=yes
else case e in #(
  e) py_cv_module__dbm=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__dbm=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__DBM_STATE=$py_cv_module__dbm$as_nl"
  if test "x$py_cv_module__dbm" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__DBM_CFLAGS=$DBM_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__DBM_LDFLAGS=$DBM_LIBS$as_nl"

fi
   if test "$py_cv_module__dbm" = yes; then
  MODULE__DBM_TRUE=
  MODULE__DBM_FALSE='#'
else
  MODULE__DBM_TRUE='#'
  MODULE__DBM_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__dbm" >&5
printf "%s\n" "$py_cv_module__dbm" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _gdbm" >&5
printf %s "checking for stdlib extension module _gdbm... " >&6; }
        if test "$py_cv_module__gdbm" != "n/a"
then :

    if test "$have_gdbm_dbmliborder" = yes
then :
  if test "$have_gdbm" = yes
then :
  py_cv_module__gdbm=yes
else case e in #(
  e) py_cv_module__gdbm=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__gdbm=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__GDBM_STATE=$py_cv_module__gdbm$as_nl"
  if test "x$py_cv_module__gdbm" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__GDBM_CFLAGS=$GDBM_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__GDBM_LDFLAGS=$GDBM_LIBS$as_nl"

fi
   if test "$py_cv_module__gdbm" = yes; then
  MODULE__GDBM_TRUE=
  MODULE__GDBM_FALSE='#'
else
  MODULE__GDBM_TRUE='#'
  MODULE__GDBM_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__gdbm" >&5
printf "%s\n" "$py_cv_module__gdbm" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module readline" >&5
printf %s "checking for stdlib extension module readline... " >&6; }
        if test "$py_cv_module_readline" != "n/a"
then :

    if true
then :
  if test "$with_readline" != "no"
then :
  py_cv_module_readline=yes
else case e in #(
  e) py_cv_module_readline=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_readline=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_READLINE_STATE=$py_cv_module_readline$as_nl"
  if test "x$py_cv_module_readline" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE_READLINE_CFLAGS=$READLINE_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE_READLINE_LDFLAGS=$READLINE_LIBS$as_nl"

fi
   if test "$py_cv_module_readline" = yes; then
  MODULE_READLINE_TRUE=
  MODULE_READLINE_FALSE='#'
else
  MODULE_READLINE_TRUE='#'
  MODULE_READLINE_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_readline" >&5
printf "%s\n" "$py_cv_module_readline" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _sqlite3" >&5
printf %s "checking for stdlib extension module _sqlite3... " >&6; }
        if test "$py_cv_module__sqlite3" != "n/a"
then :

    if test "$have_sqlite3" = "yes"
then :
  if test "$have_supported_sqlite3" = "yes"
then :
  py_cv_module__sqlite3=yes
else case e in #(
  e) py_cv_module__sqlite3=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__sqlite3=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__SQLITE3_STATE=$py_cv_module__sqlite3$as_nl"
  if test "x$py_cv_module__sqlite3" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__SQLITE3_CFLAGS=$LIBSQLITE3_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__SQLITE3_LDFLAGS=$LIBSQLITE3_LIBS$as_nl"

fi
   if test "$py_cv_module__sqlite3" = yes; then
  MODULE__SQLITE3_TRUE=
  MODULE__SQLITE3_FALSE='#'
else
  MODULE__SQLITE3_TRUE='#'
  MODULE__SQLITE3_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__sqlite3" >&5
printf "%s\n" "$py_cv_module__sqlite3" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _tkinter" >&5
printf %s "checking for stdlib extension module _tkinter... " >&6; }
        if test "$py_cv_module__tkinter" != "n/a"
then :

    if true
then :
  if test "$have_tcltk" = "yes"
then :
  py_cv_module__tkinter=yes
else case e in #(
  e) py_cv_module__tkinter=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__tkinter=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TKINTER_STATE=$py_cv_module__tkinter$as_nl"
  if test "x$py_cv_module__tkinter" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__TKINTER_CFLAGS=$TCLTK_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__TKINTER_LDFLAGS=$TCLTK_LIBS$as_nl"

fi
   if test "$py_cv_module__tkinter" = yes; then
  MODULE__TKINTER_TRUE=
  MODULE__TKINTER_FALSE='#'
else
  MODULE__TKINTER_TRUE='#'
  MODULE__TKINTER_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__tkinter" >&5
printf "%s\n" "$py_cv_module__tkinter" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _uuid" >&5
printf %s "checking for stdlib extension module _uuid... " >&6; }
        if test "$py_cv_module__uuid" != "n/a"
then :

    if true
then :
  if test "$have_uuid" = "yes"
then :
  py_cv_module__uuid=yes
else case e in #(
  e) py_cv_module__uuid=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__uuid=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__UUID_STATE=$py_cv_module__uuid$as_nl"
  if test "x$py_cv_module__uuid" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__UUID_CFLAGS=$LIBUUID_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__UUID_LDFLAGS=$LIBUUID_LIBS$as_nl"

fi
   if test "$py_cv_module__uuid" = yes; then
  MODULE__UUID_TRUE=
  MODULE__UUID_FALSE='#'
else
  MODULE__UUID_TRUE='#'
  MODULE__UUID_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__uuid" >&5
printf "%s\n" "$py_cv_module__uuid" >&6; }



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module zlib" >&5
printf %s "checking for stdlib extension module zlib... " >&6; }
        if test "$py_cv_module_zlib" != "n/a"
then :

    if true
then :
  if test "$have_zlib" = yes
then :
  py_cv_module_zlib=yes
else case e in #(
  e) py_cv_module_zlib=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_zlib=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_ZLIB_STATE=$py_cv_module_zlib$as_nl"
  if test "x$py_cv_module_zlib" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE_ZLIB_CFLAGS=$ZLIB_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE_ZLIB_LDFLAGS=$ZLIB_LIBS$as_nl"

fi
   if test "$py_cv_module_zlib" = yes; then
  MODULE_ZLIB_TRUE=
  MODULE_ZLIB_FALSE='#'
else
  MODULE_ZLIB_TRUE='#'
  MODULE_ZLIB_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_zlib" >&5
printf "%s\n" "$py_cv_module_zlib" >&6; }


        if test "$py_cv_module_binascii" != "n/a"
then :
  py_cv_module_binascii=yes
fi
   if test "$py_cv_module_binascii" = yes; then
  MODULE_BINASCII_TRUE=
  MODULE_BINASCII_FALSE='#'
else
  MODULE_BINASCII_TRUE='#'
  MODULE_BINASCII_FALSE=
fi

  as_fn_append MODULE_BLOCK "MODULE_BINASCII_STATE=$py_cv_module_binascii$as_nl"
  if test "x$py_cv_module_binascii" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE_BINASCII_CFLAGS=$BINASCII_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE_BINASCII_LDFLAGS=$BINASCII_LIBS$as_nl"

fi


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _bz2" >&5
printf %s "checking for stdlib extension module _bz2... " >&6; }
        if test "$py_cv_module__bz2" != "n/a"
then :

    if true
then :
  if test "$have_bzip2" = yes
then :
  py_cv_module__bz2=yes
else case e in #(
  e) py_cv_module__bz2=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__bz2=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__BZ2_STATE=$py_cv_module__bz2$as_nl"
  if test "x$py_cv_module__bz2" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__BZ2_CFLAGS=$BZIP2_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__BZ2_LDFLAGS=$BZIP2_LIBS$as_nl"

fi
   if test "$py_cv_module__bz2" = yes; then
  MODULE__BZ2_TRUE=
  MODULE__BZ2_FALSE='#'
else
  MODULE__BZ2_TRUE='#'
  MODULE__BZ2_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__bz2" >&5
printf "%s\n" "$py_cv_module__bz2" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _lzma" >&5
printf %s "checking for stdlib extension module _lzma... " >&6; }
        if test "$py_cv_module__lzma" != "n/a"
then :

    if true
then :
  if test "$have_liblzma" = yes
then :
  py_cv_module__lzma=yes
else case e in #(
  e) py_cv_module__lzma=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__lzma=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__LZMA_STATE=$py_cv_module__lzma$as_nl"
  if test "x$py_cv_module__lzma" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__LZMA_CFLAGS=$LIBLZMA_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__LZMA_LDFLAGS=$LIBLZMA_LIBS$as_nl"

fi
   if test "$py_cv_module__lzma" = yes; then
  MODULE__LZMA_TRUE=
  MODULE__LZMA_FALSE='#'
else
  MODULE__LZMA_TRUE='#'
  MODULE__LZMA_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__lzma" >&5
printf "%s\n" "$py_cv_module__lzma" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _zstd" >&5
printf %s "checking for stdlib extension module _zstd... " >&6; }
        if test "$py_cv_module__zstd" != "n/a"
then :

    if true
then :
  if test "$have_libzstd" = yes
then :
  py_cv_module__zstd=yes
else case e in #(
  e) py_cv_module__zstd=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__zstd=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__ZSTD_STATE=$py_cv_module__zstd$as_nl"
  if test "x$py_cv_module__zstd" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__ZSTD_CFLAGS=$LIBZSTD_CFLAGS$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__ZSTD_LDFLAGS=$LIBZSTD_LIBS$as_nl"

fi
   if test "$py_cv_module__zstd" = yes; then
  MODULE__ZSTD_TRUE=
  MODULE__ZSTD_FALSE='#'
else
  MODULE__ZSTD_TRUE='#'
  MODULE__ZSTD_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__zstd" >&5
printf "%s\n" "$py_cv_module__zstd" >&6; }



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _ssl" >&5
printf %s "checking for stdlib extension module _ssl... " >&6; }
        if test "$py_cv_module__ssl" != "n/a"
then :

    if true
then :
  if test "$ac_cv_working_openssl_ssl" = yes
then :
  py_cv_module__ssl=yes
else case e in #(
  e) py_cv_module__ssl=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__ssl=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__SSL_STATE=$py_cv_module__ssl$as_nl"
  if test "x$py_cv_module__ssl" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__SSL_CFLAGS=$OPENSSL_INCLUDES$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__SSL_LDFLAGS=$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $OPENSSL_LIBS$as_nl"

fi
   if test "$py_cv_module__ssl" = yes; then
  MODULE__SSL_TRUE=
  MODULE__SSL_FALSE='#'
else
  MODULE__SSL_TRUE='#'
  MODULE__SSL_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__ssl" >&5
printf "%s\n" "$py_cv_module__ssl" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _hashlib" >&5
printf %s "checking for stdlib extension module _hashlib... " >&6; }
        if test "$py_cv_module__hashlib" != "n/a"
then :

    if true
then :
  if test "$ac_cv_working_openssl_hashlib" = yes
then :
  py_cv_module__hashlib=yes
else case e in #(
  e) py_cv_module__hashlib=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__hashlib=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__HASHLIB_STATE=$py_cv_module__hashlib$as_nl"
  if test "x$py_cv_module__hashlib" = xyes
then :

    as_fn_append MODULE_BLOCK "MODULE__HASHLIB_CFLAGS=$OPENSSL_INCLUDES$as_nl"
    as_fn_append MODULE_BLOCK "MODULE__HASHLIB_LDFLAGS=$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS$as_nl"

fi
   if test "$py_cv_module__hashlib" = yes; then
  MODULE__HASHLIB_TRUE=
  MODULE__HASHLIB_FALSE='#'
else
  MODULE__HASHLIB_TRUE='#'
  MODULE__HASHLIB_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__hashlib" >&5
printf "%s\n" "$py_cv_module__hashlib" >&6; }


case $ac_sys_system in #(
  # On FreeBSD, _testcapi.get_process_memory_usage() calls kvm_openfiles()
  # and so needs libkvm.
  FreeBSD*) :
    LIBKVM="-lkvm"
 ;; #(
  *) :
     ;;
esac

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testcapi" >&5
printf %s "checking for stdlib extension module _testcapi... " >&6; }
        if test "$py_cv_module__testcapi" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if true
then :
  py_cv_module__testcapi=yes
else case e in #(
  e) py_cv_module__testcapi=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testcapi=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTCAPI_STATE=$py_cv_module__testcapi$as_nl"
  if test "x$py_cv_module__testcapi" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE__TESTCAPI_LDFLAGS=$LIBATOMIC $LIBKVM$as_nl"

fi
   if test "$py_cv_module__testcapi" = yes; then
  MODULE__TESTCAPI_TRUE=
  MODULE__TESTCAPI_FALSE='#'
else
  MODULE__TESTCAPI_TRUE='#'
  MODULE__TESTCAPI_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testcapi" >&5
printf "%s\n" "$py_cv_module__testcapi" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testclinic" >&5
printf %s "checking for stdlib extension module _testclinic... " >&6; }
        if test "$py_cv_module__testclinic" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if true
then :
  py_cv_module__testclinic=yes
else case e in #(
  e) py_cv_module__testclinic=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testclinic=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTCLINIC_STATE=$py_cv_module__testclinic$as_nl"
  if test "x$py_cv_module__testclinic" = xyes
then :




fi
   if test "$py_cv_module__testclinic" = yes; then
  MODULE__TESTCLINIC_TRUE=
  MODULE__TESTCLINIC_FALSE='#'
else
  MODULE__TESTCLINIC_TRUE='#'
  MODULE__TESTCLINIC_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testclinic" >&5
printf "%s\n" "$py_cv_module__testclinic" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testclinic_limited" >&5
printf %s "checking for stdlib extension module _testclinic_limited... " >&6; }
        if test "$py_cv_module__testclinic_limited" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if true
then :
  py_cv_module__testclinic_limited=yes
else case e in #(
  e) py_cv_module__testclinic_limited=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testclinic_limited=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTCLINIC_LIMITED_STATE=$py_cv_module__testclinic_limited$as_nl"
  if test "x$py_cv_module__testclinic_limited" = xyes
then :




fi
   if test "$py_cv_module__testclinic_limited" = yes; then
  MODULE__TESTCLINIC_LIMITED_TRUE=
  MODULE__TESTCLINIC_LIMITED_FALSE='#'
else
  MODULE__TESTCLINIC_LIMITED_TRUE='#'
  MODULE__TESTCLINIC_LIMITED_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testclinic_limited" >&5
printf "%s\n" "$py_cv_module__testclinic_limited" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testlimitedcapi" >&5
printf %s "checking for stdlib extension module _testlimitedcapi... " >&6; }
        if test "$py_cv_module__testlimitedcapi" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if true
then :
  py_cv_module__testlimitedcapi=yes
else case e in #(
  e) py_cv_module__testlimitedcapi=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testlimitedcapi=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTLIMITEDCAPI_STATE=$py_cv_module__testlimitedcapi$as_nl"
  if test "x$py_cv_module__testlimitedcapi" = xyes
then :




fi
   if test "$py_cv_module__testlimitedcapi" = yes; then
  MODULE__TESTLIMITEDCAPI_TRUE=
  MODULE__TESTLIMITEDCAPI_FALSE='#'
else
  MODULE__TESTLIMITEDCAPI_TRUE='#'
  MODULE__TESTLIMITEDCAPI_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testlimitedcapi" >&5
printf "%s\n" "$py_cv_module__testlimitedcapi" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testinternalcapi" >&5
printf %s "checking for stdlib extension module _testinternalcapi... " >&6; }
        if test "$py_cv_module__testinternalcapi" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if true
then :
  py_cv_module__testinternalcapi=yes
else case e in #(
  e) py_cv_module__testinternalcapi=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testinternalcapi=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTINTERNALCAPI_STATE=$py_cv_module__testinternalcapi$as_nl"
  if test "x$py_cv_module__testinternalcapi" = xyes
then :




fi
   if test "$py_cv_module__testinternalcapi" = yes; then
  MODULE__TESTINTERNALCAPI_TRUE=
  MODULE__TESTINTERNALCAPI_FALSE='#'
else
  MODULE__TESTINTERNALCAPI_TRUE='#'
  MODULE__TESTINTERNALCAPI_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testinternalcapi" >&5
printf "%s\n" "$py_cv_module__testinternalcapi" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testbuffer" >&5
printf %s "checking for stdlib extension module _testbuffer... " >&6; }
        if test "$py_cv_module__testbuffer" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if true
then :
  py_cv_module__testbuffer=yes
else case e in #(
  e) py_cv_module__testbuffer=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testbuffer=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTBUFFER_STATE=$py_cv_module__testbuffer$as_nl"
  if test "x$py_cv_module__testbuffer" = xyes
then :




fi
   if test "$py_cv_module__testbuffer" = yes; then
  MODULE__TESTBUFFER_TRUE=
  MODULE__TESTBUFFER_FALSE='#'
else
  MODULE__TESTBUFFER_TRUE='#'
  MODULE__TESTBUFFER_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testbuffer" >&5
printf "%s\n" "$py_cv_module__testbuffer" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testimportmultiple" >&5
printf %s "checking for stdlib extension module _testimportmultiple... " >&6; }
        if test "$py_cv_module__testimportmultiple" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if test "$ac_cv_func_dlopen" = yes
then :
  py_cv_module__testimportmultiple=yes
else case e in #(
  e) py_cv_module__testimportmultiple=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testimportmultiple=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTIMPORTMULTIPLE_STATE=$py_cv_module__testimportmultiple$as_nl"
  if test "x$py_cv_module__testimportmultiple" = xyes
then :




fi
   if test "$py_cv_module__testimportmultiple" = yes; then
  MODULE__TESTIMPORTMULTIPLE_TRUE=
  MODULE__TESTIMPORTMULTIPLE_FALSE='#'
else
  MODULE__TESTIMPORTMULTIPLE_TRUE='#'
  MODULE__TESTIMPORTMULTIPLE_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testimportmultiple" >&5
printf "%s\n" "$py_cv_module__testimportmultiple" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testmultiphase" >&5
printf %s "checking for stdlib extension module _testmultiphase... " >&6; }
        if test "$py_cv_module__testmultiphase" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if test "$ac_cv_func_dlopen" = yes
then :
  py_cv_module__testmultiphase=yes
else case e in #(
  e) py_cv_module__testmultiphase=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testmultiphase=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTMULTIPHASE_STATE=$py_cv_module__testmultiphase$as_nl"
  if test "x$py_cv_module__testmultiphase" = xyes
then :




fi
   if test "$py_cv_module__testmultiphase" = yes; then
  MODULE__TESTMULTIPHASE_TRUE=
  MODULE__TESTMULTIPHASE_FALSE='#'
else
  MODULE__TESTMULTIPHASE_TRUE='#'
  MODULE__TESTMULTIPHASE_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testmultiphase" >&5
printf "%s\n" "$py_cv_module__testmultiphase" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testsinglephase" >&5
printf %s "checking for stdlib extension module _testsinglephase... " >&6; }
        if test "$py_cv_module__testsinglephase" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if test "$ac_cv_func_dlopen" = yes
then :
  py_cv_module__testsinglephase=yes
else case e in #(
  e) py_cv_module__testsinglephase=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__testsinglephase=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__TESTSINGLEPHASE_STATE=$py_cv_module__testsinglephase$as_nl"
  if test "x$py_cv_module__testsinglephase" = xyes
then :




fi
   if test "$py_cv_module__testsinglephase" = yes; then
  MODULE__TESTSINGLEPHASE_TRUE=
  MODULE__TESTSINGLEPHASE_FALSE='#'
else
  MODULE__TESTSINGLEPHASE_TRUE='#'
  MODULE__TESTSINGLEPHASE_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__testsinglephase" >&5
printf "%s\n" "$py_cv_module__testsinglephase" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module xxsubtype" >&5
printf %s "checking for stdlib extension module xxsubtype... " >&6; }
        if test "$py_cv_module_xxsubtype" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if true
then :
  py_cv_module_xxsubtype=yes
else case e in #(
  e) py_cv_module_xxsubtype=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_xxsubtype=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_XXSUBTYPE_STATE=$py_cv_module_xxsubtype$as_nl"
  if test "x$py_cv_module_xxsubtype" = xyes
then :




fi
   if test "$py_cv_module_xxsubtype" = yes; then
  MODULE_XXSUBTYPE_TRUE=
  MODULE_XXSUBTYPE_FALSE='#'
else
  MODULE_XXSUBTYPE_TRUE='#'
  MODULE_XXSUBTYPE_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_xxsubtype" >&5
printf "%s\n" "$py_cv_module_xxsubtype" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _xxtestfuzz" >&5
printf %s "checking for stdlib extension module _xxtestfuzz... " >&6; }
        if test "$py_cv_module__xxtestfuzz" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if true
then :
  py_cv_module__xxtestfuzz=yes
else case e in #(
  e) py_cv_module__xxtestfuzz=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__xxtestfuzz=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__XXTESTFUZZ_STATE=$py_cv_module__xxtestfuzz$as_nl"
  if test "x$py_cv_module__xxtestfuzz" = xyes
then :




fi
   if test "$py_cv_module__xxtestfuzz" = yes; then
  MODULE__XXTESTFUZZ_TRUE=
  MODULE__XXTESTFUZZ_FALSE='#'
else
  MODULE__XXTESTFUZZ_TRUE='#'
  MODULE__XXTESTFUZZ_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__xxtestfuzz" >&5
printf "%s\n" "$py_cv_module__xxtestfuzz" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _ctypes_test" >&5
printf %s "checking for stdlib extension module _ctypes_test... " >&6; }
        if test "$py_cv_module__ctypes_test" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if test "$have_libffi" = yes -a "$ac_cv_func_dlopen" = yes
then :
  py_cv_module__ctypes_test=yes
else case e in #(
  e) py_cv_module__ctypes_test=missing ;;
esac
fi
else case e in #(
  e) py_cv_module__ctypes_test=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE__CTYPES_TEST_STATE=$py_cv_module__ctypes_test$as_nl"
  if test "x$py_cv_module__ctypes_test" = xyes
then :


    as_fn_append MODULE_BLOCK "MODULE__CTYPES_TEST_LDFLAGS=$LIBM$as_nl"

fi
   if test "$py_cv_module__ctypes_test" = yes; then
  MODULE__CTYPES_TEST_TRUE=
  MODULE__CTYPES_TEST_FALSE='#'
else
  MODULE__CTYPES_TEST_TRUE='#'
  MODULE__CTYPES_TEST_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__ctypes_test" >&5
printf "%s\n" "$py_cv_module__ctypes_test" >&6; }



  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module xxlimited" >&5
printf %s "checking for stdlib extension module xxlimited... " >&6; }
        if test "$py_cv_module_xxlimited" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if test "$ac_cv_func_dlopen" = yes
then :
  py_cv_module_xxlimited=yes
else case e in #(
  e) py_cv_module_xxlimited=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_xxlimited=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_XXLIMITED_STATE=$py_cv_module_xxlimited$as_nl"
  if test "x$py_cv_module_xxlimited" = xyes
then :




fi
   if test "$py_cv_module_xxlimited" = yes; then
  MODULE_XXLIMITED_TRUE=
  MODULE_XXLIMITED_FALSE='#'
else
  MODULE_XXLIMITED_TRUE='#'
  MODULE_XXLIMITED_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_xxlimited" >&5
printf "%s\n" "$py_cv_module_xxlimited" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module xxlimited_35" >&5
printf %s "checking for stdlib extension module xxlimited_35... " >&6; }
        if test "$py_cv_module_xxlimited_35" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if test "$ac_cv_func_dlopen" = yes
then :
  py_cv_module_xxlimited_35=yes
else case e in #(
  e) py_cv_module_xxlimited_35=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_xxlimited_35=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_XXLIMITED_35_STATE=$py_cv_module_xxlimited_35$as_nl"
  if test "x$py_cv_module_xxlimited_35" = xyes
then :




fi
   if test "$py_cv_module_xxlimited_35" = yes; then
  MODULE_XXLIMITED_35_TRUE=
  MODULE_XXLIMITED_35_FALSE='#'
else
  MODULE_XXLIMITED_35_TRUE='#'
  MODULE_XXLIMITED_35_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_xxlimited_35" >&5
printf "%s\n" "$py_cv_module_xxlimited_35" >&6; }


  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module xxlimited_3_13" >&5
printf %s "checking for stdlib extension module xxlimited_3_13... " >&6; }
        if test "$py_cv_module_xxlimited_3_13" != "n/a"
then :

    if test "$TEST_MODULES" = yes
then :
  if test "$ac_cv_func_dlopen" = yes
then :
  py_cv_module_xxlimited_3_13=yes
else case e in #(
  e) py_cv_module_xxlimited_3_13=missing ;;
esac
fi
else case e in #(
  e) py_cv_module_xxlimited_3_13=disabled ;;
esac
fi

fi
  as_fn_append MODULE_BLOCK "MODULE_XXLIMITED_3_13_STATE=$py_cv_module_xxlimited_3_13$as_nl"
  if test "x$py_cv_module_xxlimited_3_13" = xyes
then :




fi
   if test "$py_cv_module_xxlimited_3_13" = yes; then
  MODULE_XXLIMITED_3_13_TRUE=
  MODULE_XXLIMITED_3_13_FALSE='#'
else
  MODULE_XXLIMITED_3_13_TRUE='#'
  MODULE_XXLIMITED_3_13_FALSE=
fi

  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $py_cv_module_xxlimited_3_13" >&5
printf "%s\n" "$py_cv_module_xxlimited_3_13" >&6; }


# Determine JIT stencils header files based on target platform
JIT_STENCILS_H=""
JIT_SHIM_O=""
JIT_SHIM_BUILD_O=""
if ${jit_flags:+false} :
then :

else case e in #(
  e) if test "${enable_universalsdk}" && test "$UNIVERSAL_ARCHS" = "universal2"; then
     JIT_STENCILS_H="jit_stencils-aarch64-apple-darwin.h jit_stencils-x86_64-apple-darwin.h"
     JIT_SHIM_O="jit_shim-universal2-apple-darwin.o"
     JIT_SHIM_BUILD_O="jit_shim-aarch64-apple-darwin.o jit_shim-x86_64-apple-darwin.o"
   else
     case "$host" in
       aarch64-apple-darwin*)
         JIT_STENCILS_H="jit_stencils-aarch64-apple-darwin.h"
         JIT_SHIM_O="jit_shim-aarch64-apple-darwin.o"
         ;;
       x86_64-apple-darwin*)
         JIT_STENCILS_H="jit_stencils-x86_64-apple-darwin.h"
         JIT_SHIM_O="jit_shim-x86_64-apple-darwin.o"
         ;;
       aarch64-pc-windows-msvc)
         JIT_STENCILS_H="jit_stencils-aarch64-pc-windows-msvc.h"
         JIT_SHIM_O="jit_shim-aarch64-pc-windows-msvc.o"
         ;;
       i686-pc-windows-msvc)
         JIT_STENCILS_H="jit_stencils-i686-pc-windows-msvc.h"
         JIT_SHIM_O="jit_shim-i686-pc-windows-msvc.o"
         ;;
       x86_64-pc-windows-msvc)
         JIT_STENCILS_H="jit_stencils-x86_64-pc-windows-msvc.h"
         JIT_SHIM_O="jit_shim-x86_64-pc-windows-msvc.o"
         ;;
       aarch64-*-linux-gnu)
         JIT_STENCILS_H="jit_stencils-aarch64-unknown-linux-gnu.h"
         JIT_SHIM_O="jit_shim-aarch64-unknown-linux-gnu.o"
         ;;
       x86_64-*-linux-gnu)
         JIT_STENCILS_H="jit_stencils-x86_64-unknown-linux-gnu.h"
         JIT_SHIM_O="jit_shim-x86_64-unknown-linux-gnu.o"
         ;;
     esac
     JIT_SHIM_BUILD_O="$JIT_SHIM_O"
   fi ;;
esac
fi





# substitute multiline block, must come after last PY_STDLIB_MOD()


# generate output files
ac_config_files="$ac_config_files Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh"

ac_config_files="$ac_config_files Modules/Setup.bootstrap Modules/Setup.stdlib"

ac_config_files="$ac_config_files Modules/ld_so_aix"

# Generate files like pyconfig.h
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems.  If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# 'ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* 'ac_cv_foo' will be assigned the
# following values.

_ACEOF

# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done

  (set) 2>&1 |
    case $as_nl`(ac_space=' '; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      # 'set' does not quote correctly, so add quotes: double-quote
      # substitution turns \\\\ into \\, and sed turns \\ into \.
      sed -n \
	"s/'/'\\\\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
      ;; #(
    *)
      # 'set' quotes correctly as required by POSIX, so do not add quotes.
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
) |
  sed '
     /^ac_cv_env_/b end
     t clear
     :clear
     s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
     t end
     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
     :end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
  if test -w "$cache_file"; then
    if test "x$cache_file" != "x/dev/null"; then
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
      if test ! -f "$cache_file" || test -h "$cache_file"; then
	cat confcache >"$cache_file"
      else
        case $cache_file in #(
        */* | ?:*)
	  mv -f confcache "$cache_file"$$ &&
	  mv -f "$cache_file"$$ "$cache_file" ;; #(
        *)
	  mv -f confcache "$cache_file" ;;
	esac
      fi
    fi
  else
    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
  fi
fi
rm -f confcache

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

DEFS=-DHAVE_CONFIG_H

ac_libobjs=
ac_ltlibobjs=
U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
  # 1. Remove the extension, and $U if already installed.
  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
  ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
  #    will be set to the directory where LIBOBJS objects are built.
  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
done
LIBOBJS=$ac_libobjs

LTLIBOBJS=$ac_ltlibobjs



if test -z "${MODULE__IO_TRUE}" && test -z "${MODULE__IO_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__IO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_TIME_TRUE}" && test -z "${MODULE_TIME_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_TIME\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_ARRAY_TRUE}" && test -z "${MODULE_ARRAY_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_ARRAY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__MATH_INTEGER_TRUE}" && test -z "${MODULE__MATH_INTEGER_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__MATH_INTEGER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__ASYNCIO_TRUE}" && test -z "${MODULE__ASYNCIO_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__ASYNCIO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__BISECT_TRUE}" && test -z "${MODULE__BISECT_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__BISECT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CSV_TRUE}" && test -z "${MODULE__CSV_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CSV\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__HEAPQ_TRUE}" && test -z "${MODULE__HEAPQ_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__HEAPQ\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__JSON_TRUE}" && test -z "${MODULE__JSON_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__JSON\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__LSPROF_TRUE}" && test -z "${MODULE__LSPROF_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__LSPROF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__PICKLE_TRUE}" && test -z "${MODULE__PICKLE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__PICKLE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__POSIXSUBPROCESS_TRUE}" && test -z "${MODULE__POSIXSUBPROCESS_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__POSIXSUBPROCESS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__QUEUE_TRUE}" && test -z "${MODULE__QUEUE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__QUEUE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__RANDOM_TRUE}" && test -z "${MODULE__RANDOM_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__RANDOM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__REMOTE_DEBUGGING_TRUE}" && test -z "${MODULE__REMOTE_DEBUGGING_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__REMOTE_DEBUGGING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_SELECT_TRUE}" && test -z "${MODULE_SELECT_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_SELECT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__STRUCT_TRUE}" && test -z "${MODULE__STRUCT_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__STRUCT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TYPES_TRUE}" && test -z "${MODULE__TYPES_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TYPES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TYPING_TRUE}" && test -z "${MODULE__TYPING_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TYPING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__INTERPRETERS_TRUE}" && test -z "${MODULE__INTERPRETERS_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__INTERPRETERS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__INTERPCHANNELS_TRUE}" && test -z "${MODULE__INTERPCHANNELS_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__INTERPCHANNELS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__INTERPQUEUES_TRUE}" && test -z "${MODULE__INTERPQUEUES_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__INTERPQUEUES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__ZONEINFO_TRUE}" && test -z "${MODULE__ZONEINFO_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__ZONEINFO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__MULTIPROCESSING_TRUE}" && test -z "${MODULE__MULTIPROCESSING_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__MULTIPROCESSING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__POSIXSHMEM_TRUE}" && test -z "${MODULE__POSIXSHMEM_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__POSIXSHMEM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__STATISTICS_TRUE}" && test -z "${MODULE__STATISTICS_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__STATISTICS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_CMATH_TRUE}" && test -z "${MODULE_CMATH_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_CMATH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_MATH_TRUE}" && test -z "${MODULE_MATH_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_MATH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__DATETIME_TRUE}" && test -z "${MODULE__DATETIME_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__DATETIME\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_FCNTL_TRUE}" && test -z "${MODULE_FCNTL_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_FCNTL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_MMAP_TRUE}" && test -z "${MODULE_MMAP_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_MMAP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__SOCKET_TRUE}" && test -z "${MODULE__SOCKET_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__SOCKET\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_GRP_TRUE}" && test -z "${MODULE_GRP_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_GRP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_PWD_TRUE}" && test -z "${MODULE_PWD_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_PWD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_RESOURCE_TRUE}" && test -z "${MODULE_RESOURCE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_RESOURCE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__SCPROXY_TRUE}" && test -z "${MODULE__SCPROXY_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__SCPROXY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_SYSLOG_TRUE}" && test -z "${MODULE_SYSLOG_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_SYSLOG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_TERMIOS_TRUE}" && test -z "${MODULE_TERMIOS_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_TERMIOS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_PYEXPAT_TRUE}" && test -z "${MODULE_PYEXPAT_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_PYEXPAT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__ELEMENTTREE_TRUE}" && test -z "${MODULE__ELEMENTTREE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__ELEMENTTREE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CODECS_CN_TRUE}" && test -z "${MODULE__CODECS_CN_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CODECS_CN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CODECS_HK_TRUE}" && test -z "${MODULE__CODECS_HK_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CODECS_HK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CODECS_ISO2022_TRUE}" && test -z "${MODULE__CODECS_ISO2022_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CODECS_ISO2022\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CODECS_JP_TRUE}" && test -z "${MODULE__CODECS_JP_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CODECS_JP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CODECS_KR_TRUE}" && test -z "${MODULE__CODECS_KR_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CODECS_KR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CODECS_TW_TRUE}" && test -z "${MODULE__CODECS_TW_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CODECS_TW\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__MULTIBYTECODEC_TRUE}" && test -z "${MODULE__MULTIBYTECODEC_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__MULTIBYTECODEC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_UNICODEDATA_TRUE}" && test -z "${MODULE_UNICODEDATA_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_UNICODEDATA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__MD5_TRUE}" && test -z "${MODULE__MD5_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__MD5\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__SHA1_TRUE}" && test -z "${MODULE__SHA1_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__SHA1\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__SHA2_TRUE}" && test -z "${MODULE__SHA2_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__SHA2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__SHA3_TRUE}" && test -z "${MODULE__SHA3_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__SHA3\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__BLAKE2_TRUE}" && test -z "${MODULE__BLAKE2_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__BLAKE2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__HMAC_TRUE}" && test -z "${MODULE__HMAC_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__HMAC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CTYPES_TRUE}" && test -z "${MODULE__CTYPES_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CTYPES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CURSES_TRUE}" && test -z "${MODULE__CURSES_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CURSES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CURSES_PANEL_TRUE}" && test -z "${MODULE__CURSES_PANEL_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CURSES_PANEL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__DECIMAL_TRUE}" && test -z "${MODULE__DECIMAL_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__DECIMAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__DBM_TRUE}" && test -z "${MODULE__DBM_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__DBM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__GDBM_TRUE}" && test -z "${MODULE__GDBM_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__GDBM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_READLINE_TRUE}" && test -z "${MODULE_READLINE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_READLINE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__SQLITE3_TRUE}" && test -z "${MODULE__SQLITE3_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__SQLITE3\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TKINTER_TRUE}" && test -z "${MODULE__TKINTER_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TKINTER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__UUID_TRUE}" && test -z "${MODULE__UUID_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__UUID\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_ZLIB_TRUE}" && test -z "${MODULE_ZLIB_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_ZLIB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_BINASCII_TRUE}" && test -z "${MODULE_BINASCII_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_BINASCII\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__BZ2_TRUE}" && test -z "${MODULE__BZ2_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__BZ2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__LZMA_TRUE}" && test -z "${MODULE__LZMA_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__LZMA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__ZSTD_TRUE}" && test -z "${MODULE__ZSTD_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__ZSTD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__SSL_TRUE}" && test -z "${MODULE__SSL_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__SSL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__HASHLIB_TRUE}" && test -z "${MODULE__HASHLIB_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__HASHLIB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTCAPI_TRUE}" && test -z "${MODULE__TESTCAPI_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTCAPI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTCLINIC_TRUE}" && test -z "${MODULE__TESTCLINIC_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTCLINIC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTCLINIC_LIMITED_TRUE}" && test -z "${MODULE__TESTCLINIC_LIMITED_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTCLINIC_LIMITED\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTLIMITEDCAPI_TRUE}" && test -z "${MODULE__TESTLIMITEDCAPI_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTLIMITEDCAPI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTINTERNALCAPI_TRUE}" && test -z "${MODULE__TESTINTERNALCAPI_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTINTERNALCAPI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTBUFFER_TRUE}" && test -z "${MODULE__TESTBUFFER_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTBUFFER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTIMPORTMULTIPLE_TRUE}" && test -z "${MODULE__TESTIMPORTMULTIPLE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTIMPORTMULTIPLE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTMULTIPHASE_TRUE}" && test -z "${MODULE__TESTMULTIPHASE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTMULTIPHASE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TESTSINGLEPHASE_TRUE}" && test -z "${MODULE__TESTSINGLEPHASE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__TESTSINGLEPHASE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_XXSUBTYPE_TRUE}" && test -z "${MODULE_XXSUBTYPE_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_XXSUBTYPE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__XXTESTFUZZ_TRUE}" && test -z "${MODULE__XXTESTFUZZ_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__XXTESTFUZZ\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__CTYPES_TEST_TRUE}" && test -z "${MODULE__CTYPES_TEST_FALSE}"; then
  as_fn_error $? "conditional \"MODULE__CTYPES_TEST\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_XXLIMITED_TRUE}" && test -z "${MODULE_XXLIMITED_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_XXLIMITED\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_XXLIMITED_35_TRUE}" && test -z "${MODULE_XXLIMITED_35_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_XXLIMITED_35\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE_XXLIMITED_3_13_TRUE}" && test -z "${MODULE_XXLIMITED_3_13_FALSE}"; then
  as_fn_error $? "conditional \"MODULE_XXLIMITED_3_13\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi

: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
# Generated by $as_me.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.

debug=false
ac_cs_recheck=false
ac_cs_silent=false

SHELL=\${CONFIG_SHELL-$SHELL}
export SHELL
_ASEOF
cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else case e in #(
  e) case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac ;;
esac
fi



# Reset variables that may have inherited troublesome values from
# the environment.

# IFS needs to be set, to space, tab, and newline, in precisely that order.
# (If _AS_PATH_WALK were called with IFS unset, it would have the
# side effect of setting IFS to empty, thus disabling word splitting.)
# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
IFS=" ""	$as_nl"

PS1='$ '
PS2='> '
PS4='+ '

# Ensure predictable behavior from utilities with locale-dependent output.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# We cannot yet rely on "unset" to work, but we need these variables
# to be unset--not just set to an empty or harmless value--now, to
# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct
# also avoids known problems related to "unset" and subshell syntax
# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
do eval test \${$as_var+y} \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done

# Ensure that fds 0, 1, and 2 are open.
if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
if (exec 3>&2)            ; then :; else exec 2>/dev/null; fi

# The user is always right.
if ${PATH_SEPARATOR+false} :; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# Find who we are.  Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  case $as_dir in #(((
    '') as_dir=./ ;;
    */) ;;
    *) as_dir=$as_dir/ ;;
  esac
    test -r "$as_dir$0" && as_myself=$as_dir$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as 'sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi



# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
  as_status=$1; test $as_status -eq 0 && as_status=1
  if test "$4"; then
    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
  fi
  printf "%s\n" "$as_me: error: $2" >&2
  as_fn_exit $as_status
} # as_fn_error


# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset

# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else case e in #(
  e) as_fn_append ()
  {
    eval $1=\$$1\$2
  } ;;
esac
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else case e in #(
  e) as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  } ;;
esac
fi # as_fn_arith


if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
printf "%s\n" X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits


# Determine whether it's possible to make 'echo' print without a newline.
# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

# For backward compatibility with old third-party macros, we provide
# the shell variables $as_echo and $as_echo_n.  New code should use
# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
as_echo='printf %s\n'
as_echo_n='printf %s'

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable.
    # In both cases, we have to default to 'cp -pR'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -pR'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -pR'
  fi
else
  as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null


# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
printf "%s\n" X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"


} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi


# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
  test -f "$1" && test -x "$1"
} # as_fn_executable_p
as_test_x='test -x'
as_executable_p=as_fn_executable_p

# Sed expression to map a string onto a valid CPP name.
as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated

# Sed expression to map a string onto a valid variable name.
as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
as_tr_sh="eval sed '$as_sed_sh'" # deprecated


exec 6>&1
## ----------------------------------- ##
## Main body of $CONFIG_STATUS script. ##
## ----------------------------------- ##
_ASEOF
test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Save the log message, to keep $0 and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by python $as_me 3.16, which was
generated by GNU Autoconf 2.72.  Invocation command line was

  CONFIG_FILES    = $CONFIG_FILES
  CONFIG_HEADERS  = $CONFIG_HEADERS
  CONFIG_LINKS    = $CONFIG_LINKS
  CONFIG_COMMANDS = $CONFIG_COMMANDS
  $ $0 $@

on `(hostname || uname -n) 2>/dev/null | sed 1q`
"

_ACEOF

case $ac_config_files in *"
"*) set x $ac_config_files; shift; ac_config_files=$*;;
esac

case $ac_config_headers in *"
"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
esac


cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
config_headers="$ac_config_headers"

_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
'$as_me' instantiates files and other configuration actions
from templates according to the current configuration.  Unless the files
and actions are specified as TAGs, all are instantiated by default.

Usage: $0 [OPTION]... [TAG]...

  -h, --help       print this help, then exit
  -V, --version    print version number and configuration settings, then exit
      --config     print configuration, then exit
  -q, --quiet, --silent
                   do not print progress messages
  -d, --debug      don't remove temporary files
      --recheck    update $as_me by reconfiguring in the same conditions
      --file=FILE[:TEMPLATE]
                   instantiate the configuration file FILE
      --header=FILE[:TEMPLATE]
                   instantiate the configuration header FILE

Configuration files:
$config_files

Configuration headers:
$config_headers

Report bugs to <https://github.com/python/cpython/issues/>."

_ACEOF
ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
python config.status 3.16
configured by $0, generated by GNU Autoconf 2.72,
  with options \\"\$ac_cs_config\\"

Copyright (C) 2023 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."

ac_pwd='$ac_pwd'
srcdir='$srcdir'
INSTALL='$INSTALL'
MKDIR_P='$MKDIR_P'
test -n "\$AWK" || AWK=awk
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# The default lists apply if the user does not specify any file.
ac_need_defaults=:
while test $# != 0
do
  case $1 in
  --*=?*)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
    ac_shift=:
    ;;
  --*=)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=
    ac_shift=:
    ;;
  *)
    ac_option=$1
    ac_optarg=$2
    ac_shift=shift
    ;;
  esac

  case $ac_option in
  # Handling of the options.
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    ac_cs_recheck=: ;;
  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
    printf "%s\n" "$ac_cs_version"; exit ;;
  --config | --confi | --conf | --con | --co | --c )
    printf "%s\n" "$ac_cs_config"; exit ;;
  --debug | --debu | --deb | --de | --d | -d )
    debug=: ;;
  --file | --fil | --fi | --f )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    '') as_fn_error $? "missing file argument" ;;
    esac
    as_fn_append CONFIG_FILES " '$ac_optarg'"
    ac_need_defaults=false;;
  --header | --heade | --head | --hea )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
    ac_need_defaults=false;;
  --he | --h)
    # Conflict between --help and --header
    as_fn_error $? "ambiguous option: '$1'
Try '$0 --help' for more information.";;
  --help | --hel | -h )
    printf "%s\n" "$ac_cs_usage"; exit ;;
  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil | --si | --s)
    ac_cs_silent=: ;;

  # This is an error.
  -*) as_fn_error $? "unrecognized option: '$1'
Try '$0 --help' for more information." ;;

  *) as_fn_append ac_config_targets " $1"
     ac_need_defaults=false ;;

  esac
  shift
done

ac_configure_extra_args=

if $ac_cs_silent; then
  exec 6>/dev/null
  ac_configure_extra_args="$ac_configure_extra_args --silent"
fi

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
  shift
  \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
  CONFIG_SHELL='$SHELL'
  export CONFIG_SHELL
  exec "\$@"
fi

_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
  echo
  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
  printf "%s\n" "$ac_log"
} >&5

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1

# Handling of arguments.
for ac_config_target in $ac_config_targets
do
  case $ac_config_target in
    "pyconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS pyconfig.h" ;;
    "Mac/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/Makefile" ;;
    "Mac/PythonLauncher/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/PythonLauncher/Makefile" ;;
    "Mac/Resources/framework/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/framework/Info.plist" ;;
    "Mac/Resources/app/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/app/Info.plist" ;;
    "Platforms/Apple/iOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES Platforms/Apple/iOS/Resources/Info.plist" ;;
    "Makefile.pre") CONFIG_FILES="$CONFIG_FILES Makefile.pre" ;;
    "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc" ;;
    "Misc/python-embed.pc") CONFIG_FILES="$CONFIG_FILES Misc/python-embed.pc" ;;
    "Misc/python-config.sh") CONFIG_FILES="$CONFIG_FILES Misc/python-config.sh" ;;
    "Modules/Setup.bootstrap") CONFIG_FILES="$CONFIG_FILES Modules/Setup.bootstrap" ;;
    "Modules/Setup.stdlib") CONFIG_FILES="$CONFIG_FILES Modules/Setup.stdlib" ;;
    "Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES Modules/ld_so_aix" ;;

  *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;;
  esac
done


# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used.  Set only those that are not.
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
  test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
  test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
fi

# Have a temporary directory for convenience.  Make it in the build tree
# simply because there is no reason against having it here, and in addition,
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
# after its creation but before its name has been assigned to '$tmp'.
$debug ||
{
  tmp= ac_tmp=
  trap 'exit_status=$?
  : "${ac_tmp:=$tmp}"
  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
  trap 'as_fn_exit 1' 1 2 13 15
}
# Create a (secure) tmp directory for tmp files.

{
  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
  test -d "$tmp"
}  ||
{
  tmp=./conf$$-$RANDOM
  (umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
ac_tmp=$tmp

# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
# This happens for instance with './config.status config.h'.
if test -n "$CONFIG_FILES"; then


ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
# point, so we can use a bashism as a fallback.
if test "x$ac_cr" = x; then
  eval ac_cr=\$\'\\r\'
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
  ac_cs_awk_cr='\\r'
else
  ac_cs_awk_cr=$ac_cr
fi

echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF


{
  echo "cat >conf$$subs.awk <<_ACEOF" &&
  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
  echo "_ACEOF"
} >conf$$subs.sh ||
  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
  . ./conf$$subs.sh ||
    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5

  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
  if test $ac_delim_n = $ac_delim_num; then
    break
  elif $ac_last_try; then
    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done
rm -f conf$$subs.sh

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
s/^/S["/; s/!.*/"]=/
p
g
s/^[^!]*!//
:repl
t repl
s/'"$ac_delim"'$//
t delim
:nl
h
s/\(.\{148\}\)..*/\1/
t more1
s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
p
n
b repl
:more1
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t nl
:delim
h
s/\(.\{148\}\)..*/\1/
t more2
s/["\\]/\\&/g; s/^/"/; s/$/"/
p
b
:more2
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t delim
' <conf$$subs.awk | sed '
/^[^""]/{
  N
  s/\n//
}
' >>$CONFIG_STATUS || ac_write_fail=1
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
  for (key in S) S_is_set[key] = 1
  FS = ""

}
{
  line = $ 0
  nfields = split(line, field, "@")
  substed = 0
  len = length(field[1])
  for (i = 2; i < nfields; i++) {
    key = field[i]
    keylen = length(key)
    if (S_is_set[key]) {
      value = S[key]
      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
      len += length(value) + length(field[++i])
      substed = 1
    } else
      len += 1 + keylen
  }

  print line
}

_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
  cat
fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF

# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
h
s///
s/^/:/
s/[	 ]*$/:/
s/:\$(srcdir):/:/g
s/:\${srcdir}:/:/g
s/:@srcdir@:/:/g
s/^:*//
s/:*$//
x
s/\(=[	 ]*\).*/\1/
G
s/\n//
s/^[^=]*=[	 ]*$//
}'
fi

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
fi # test -n "$CONFIG_FILES"

# Set up the scripts for CONFIG_HEADERS section.
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with './config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF

# Transform confdefs.h into an awk script 'defines.awk', embedded as
# here-document in config.status, that substitutes the proper values into
# config.h.in to produce config.h.

# Create a delimiter string that does not exist in confdefs.h, to ease
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
  if test -z "$ac_tt"; then
    break
  elif $ac_last_try; then
    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done

# For the awk script, D is an array of macro values keyed by name,
# likewise P contains macro parameters if any.  Preserve backslash
# newline sequences.

ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
sed -n '
s/.\{148\}/&'"$ac_delim"'/g
t rset
:rset
s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
t def
d
:def
s/\\$//
t bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3"/p
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
d
:bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3\\\\\\n"\\/p
t cont
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
t cont
d
:cont
n
s/.\{148\}/&'"$ac_delim"'/g
t clear
:clear
s/\\$//
t bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/"/p
d
:bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
b cont
' <confdefs.h | sed '
s/'"$ac_delim"'/"\\\
"/g' >>$CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  for (key in D) D_is_set[key] = 1
  FS = ""
}
/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
  line = \$ 0
  split(line, arg, " ")
  if (arg[1] == "#") {
    defundef = arg[2]
    mac1 = arg[3]
  } else {
    defundef = substr(arg[1], 2)
    mac1 = arg[2]
  }
  split(mac1, mac2, "(") #)
  macro = mac2[1]
  prefix = substr(line, 1, index(line, defundef) - 1)
  if (D_is_set[macro]) {
    # Preserve the white space surrounding the "#".
    print prefix "define", macro P[macro] D[macro]
    next
  } else {
    # Replace #undef with comments.  This is necessary, for example,
    # in the case of _POSIX_SOURCE, which is predefined and required
    # on some systems where configure will not decide to define it.
    if (defundef == "undef") {
      print "/*", prefix defundef, macro, "*/"
      next
    }
  }
}
{ print }
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
fi # test -n "$CONFIG_HEADERS"


eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
shift
for ac_tag
do
  case $ac_tag in
  :[FHLC]) ac_mode=$ac_tag; continue;;
  esac
  case $ac_mode$ac_tag in
  :[FHL]*:*);;
  :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;;
  :[FH]-) ac_tag=-:-;;
  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
  esac
  ac_save_IFS=$IFS
  IFS=:
  set x $ac_tag
  IFS=$ac_save_IFS
  shift
  ac_file=$1
  shift

  case $ac_mode in
  :L) ac_source=$1;;
  :[FH])
    ac_file_inputs=
    for ac_f
    do
      case $ac_f in
      -) ac_f="$ac_tmp/stdin";;
      *) # Look for the file first in the build tree, then in the source tree
	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
	 # because $ac_f cannot contain ':'.
	 test -f "$ac_f" ||
	   case $ac_f in
	   [\\/$]*) false;;
	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
	   esac ||
	   as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;;
      esac
      case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
      as_fn_append ac_file_inputs " '$ac_f'"
    done

    # Let's still pretend it is 'configure' which instantiates (i.e., don't
    # use $as_me), people would be surprised to read:
    #    /* config.h.  Generated by config.status.  */
    configure_input='Generated from '`
	  printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
	`' by configure.'
    if test x"$ac_file" != x-; then
      configure_input="$ac_file.  $configure_input"
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
printf "%s\n" "$as_me: creating $ac_file" >&6;}
    fi
    # Neutralize special characters interpreted by sed in replacement strings.
    case $configure_input in #(
    *\&* | *\|* | *\\* )
       ac_sed_conf_input=`printf "%s\n" "$configure_input" |
       sed 's/[\\\\&|]/\\\\&/g'`;; #(
    *) ac_sed_conf_input=$configure_input;;
    esac

    case $ac_tag in
    *:-:* | *:-) cat >"$ac_tmp/stdin" \
      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
    esac
    ;;
  esac

  ac_dir=`$as_dirname -- "$ac_file" ||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$ac_file" : 'X\(//\)[^/]' \| \
	 X"$ac_file" : 'X\(//\)$' \| \
	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
printf "%s\n" X"$ac_file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  as_dir="$ac_dir"; as_fn_mkdir_p
  ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix


  case $ac_mode in
  :F)
  #
  # CONFIG_FILE
  #

  case $INSTALL in
  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
  esac
  ac_MKDIR_P=$MKDIR_P
  case $MKDIR_P in
  [\\/$]* | ?:[\\/]* ) ;;
  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
  esac
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# If the template does not know about datarootdir, expand it.
# FIXME: This hack should be removed a few years after 2.60.
ac_datarootdir_hack=; ac_datarootdir_seen=
ac_sed_dataroot='
/datarootdir/ {
  p
  q
}
/@datadir@/p
/@docdir@/p
/@infodir@/p
/@localedir@/p
/@mandir@/p'
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  ac_datarootdir_hack='
  s&@datadir@&$datadir&g
  s&@docdir@&$docdir&g
  s&@infodir@&$infodir&g
  s&@localedir@&$localedir&g
  s&@mandir@&$mandir&g
  s&\\\${datarootdir}&$datarootdir&g' ;;
esac
_ACEOF

# Neutralize VPATH when '$srcdir' = '.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_sed_extra="$ac_vpsub
$extrasub
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
s|@configure_input@|$ac_sed_conf_input|;t t
s&@top_builddir@&$ac_top_builddir_sub&;t t
s&@top_build_prefix@&$ac_top_build_prefix&;t t
s&@srcdir@&$ac_srcdir&;t t
s&@abs_srcdir@&$ac_abs_srcdir&;t t
s&@top_srcdir@&$ac_top_srcdir&;t t
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t
s&@MKDIR_P@&$ac_MKDIR_P&;t t
$ac_datarootdir_hack
"
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5

test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
      "$ac_tmp/out"`; test -z "$ac_out"; } &&
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir'
which seems to be undefined.  Please make sure it is defined" >&5
printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir'
which seems to be undefined.  Please make sure it is defined" >&2;}

  rm -f "$ac_tmp/stdin"
  case $ac_file in
  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
  esac \
  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
 ;;
  :H)
  #
  # CONFIG_HEADER
  #
  if test x"$ac_file" != x-; then
    {
      printf "%s\n" "/* $configure_input  */" >&1 \
      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
    } >"$ac_tmp/config.h" \
      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
    else
      rm -f "$ac_file"
      mv "$ac_tmp/config.h" "$ac_file" \
	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
    fi
  else
    printf "%s\n" "/* $configure_input  */" >&1 \
      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
      || as_fn_error $? "could not create -" "$LINENO" 5
  fi
 ;;


  esac


  case $ac_file$ac_mode in
    "Modules/ld_so_aix":F) chmod +x Modules/ld_so_aix ;;

  esac
done # for ac_tag


as_fn_exit 0
_ACEOF
ac_clean_files=$ac_clean_files_save

test $ac_write_fail = 0 ||
  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5


# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
# by configure, so config.status won't be able to write to it; its
# output is simply discarded.  So we exec the FD to /dev/null,
# effectively closing config.log, so it can be properly (re)opened and
# appended to by config.status.  When coming back to configure, we
# need to make the FD available again.
if test "$no_create" != yes; then
  ac_cs_success=:
  ac_config_status_args=
  test "$silent" = yes &&
    ac_config_status_args="$ac_config_status_args --quiet"
  exec 5>/dev/null
  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
  exec 5>>config.log
  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
  # would make configure fail if this is the last instruction.
  $ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi


{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating Modules/Setup.local" >&5
printf "%s\n" "$as_me: creating Modules/Setup.local" >&6;}
if test ! -f Modules/Setup.local
then
	echo "# Edit this file for local setup changes" >Modules/Setup.local
fi

{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating Makefile" >&5
printf "%s\n" "$as_me: creating Makefile" >&6;}
$SHELL $srcdir/Modules/makesetup -c $srcdir/Modules/config.c.in \
			-s Modules \
			Modules/Setup.local Modules/Setup.stdlib Modules/Setup.bootstrap $srcdir/Modules/Setup
if test $? -ne 0; then
  as_fn_error $? "makesetup failed" "$LINENO" 5
fi

mv config.c Modules

if test -z "$PKG_CONFIG"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: pkg-config is missing. Some dependencies may not be detected correctly." >&5
printf "%s\n" "$as_me: WARNING: pkg-config is missing. Some dependencies may not be detected correctly." >&2;}
fi

if test "$Py_OPT" = 'false' -a "$Py_DEBUG" != 'true'; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}:

If you want a release build with all stable optimizations active (PGO, etc),
please run ./configure --enable-optimizations
" >&5
printf "%s\n" "$as_me:

If you want a release build with all stable optimizations active (PGO, etc),
please run ./configure --enable-optimizations
" >&6;}
fi

if test "x$PY_SUPPORT_TIER" = x0
then :
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING:

Platform \"$host\" with compiler \"$ac_cv_cc_name\" is not supported by the
CPython core team, see https://peps.python.org/pep-0011/ for more information.
" >&5
printf "%s\n" "$as_me: WARNING:

Platform \"$host\" with compiler \"$ac_cv_cc_name\" is not supported by the
CPython core team, see https://peps.python.org/pep-0011/ for more information.
" >&2;}
fi

if test "$ac_cv_header_stdatomic_h" != "yes"; then
  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Your compiler or platform does have a working C11 stdatomic.h. A future version of Python may require stdatomic.h." >&5
printf "%s\n" "$as_me: Your compiler or platform does have a working C11 stdatomic.h. A future version of Python may require stdatomic.h." >&6;}
fi

